多线程怎么运行?

我以为多线程很简单:就是一个装饰器的事儿。

这是我不知道哪次搜索到的资料记下的笔记,我基本就是按照这个执行的。

我的电脑CPU如下:
image
应该是6核12线程吧。

于是我做了个测试:

using BenchmarkTools

function fun2()
    resmat = zeros(100000, 10)
    @inbounds Threads.@threads for j=1:10
        @inbounds for i=1:100000
            resmat[i, j]=1.0
        end
    end
end

@btime fun2()

我将100000×10的矩阵,按列分成10个线程,然后对第1个index在各个线程内进行循环。

然后我在外面用powershell运行脚本。

PS F:\Documents\JuliaProgramme\20220819多线程测试> julia -t 10 .\多线程测试.jl
  1.581 ms (53 allocations: 7.63 MiB)
PS F:\Documents\JuliaProgramme\20220819多线程测试> julia -p 10 .\多线程测试.jl
  1.874 ms (8 allocations: 7.63 MiB)
PS F:\Documents\JuliaProgramme\20220819多线程测试> julia -p 10 -t 10 .\多线程测试.jl
  1.590 ms (53 allocations: 7.63 MiB)

我在外面开10个线程/10个进程/10线程+10进程,结果没差啊。程序也没有报错,我的笔记记录的用法应该也没有问题。

这是为什么呢?

补充一个,这次在终端里试了试,我确定我会多线程。
但是在这个例子里确实不行。

julia> @time for j=1:10
           for i=1:100000
               resmat[i, j]=1.0
           end
       end
  0.040016 seconds (994.91 k allocations: 15.182 MiB, 15.26% compilation time)

julia> @time Threads.@threads for j=1:10
           for i=1:100000
               resmat[i, j]=1.0
           end
       end
  0.069187 seconds (1.06 M allocations: 19.105 MiB, 83.84% compilation time)

内存性能限制的操作多线程没意义,你搞个cpu性能需求高的再测

哦~,懂了。谢谢大佬。

总之每条线程里面尽量少访问数组是吧。

应该不是减少数组访问,而是你的每个线程的工作量/计算量workload不够大的情况下,多线程没有什么优势。你这个例子太简单了,只有赋值一种操作;至少应该测试带有计算的。我之前在英文论坛问过一个跟多线程相关的问题,你可以参考一下:Mulithreading for nested loops