并行计算效率不高

我使用julia进行并行计算的时候,无论是使用多线程还是多进程,程序就是简单的for循环,效率一直不高。我电脑是i9的,20核。但是我并行计算的效率最高也就是比单线程快4倍左右。而且基本上线程数或者进程数设置为4就已经达到这个水平了,再增加线程数和进程数也没什么效果。

我从网上找的测试代码,结果也差不多。
但是同样的情况,我使用matlab,简单地把for改为parfor,基本上就能提高到8-10倍的计算速度。
有谁清楚这是什么情况吗?

using BenchmarkTools
println(“\ec”)

println(“Number of threads: $(Threads.nthreads())”)

function evaluatefunctions2(N)
#x = linspace(-1500.0, 1500.0, N)
x = range(-1500.0, stop=1500.0, length=N)
M = 10000
Threads.@threads for i in 1:M
y = sin.(x)
x = asin.(y)
y = cos.(x)
x = acos.(y)
y = tan.(x)
x = atan.(y)
end
end

function evaluatefunctions1(N)
#x = linspace(-1500.0, 1500.0, N)
x = range(-1500.0, stop=1500.0, length=N)
M = 10000
for i in 1:M
y = sin.(x)
x = asin.(y)
y = cos.(x)
x = acos.(y)
y = tan.(x)
x = atan.(y)
end
end

using Distributed

function evaluatefunctions3(N)
#x = linspace(-1500.0, 1500.0, N)
x = range(-1500.0, stop=1500.0, length=N)
M = 10000
@sync @distributed for i in 1:M
y = sin.(x)
x = asin.(y)
y = cos.(x)
x = acos.(y)
y = tan.(x)
x = atan.(y)
end
end

println(“单线程单进程”)
@btime evaluatefunctions1(2000)
println(“12线程1进程”)
@btime evaluatefunctions2(2000)
addprocs(12)
println(“1线程12进程”)
println(“Number of process: $(length(procs()))”)
@btime evaluatefunctions3(2000)

计算结果:
Number of threads: 12
单线程单进程
998.843 ms (60000 allocations: 922.85 MiB)
12线程1进程
210.809 ms (180079 allocations: 924.69 MiB)
1线程12进程
Number of process: 13
193.318 ms (1702 allocations: 62.84 KiB)
Task (done) @0x0000019443788010

如果for循环里没有用指标i的话,不知道你的并行意图是什么

额,这个就是一个从网上找的代码,他这个并行就是测试多次计算的效率。我自己的代码有点太长了,还用到其他几个很大文件,放上来也没啥用。并行计算的部分就这几句。

sim = Vector{Any}(undef,num)

pg = Progress(num; showspeed=true)
@time @Threads.threads for i in (1:num)
sim[i] = cal_trace(u0_list[i],p)
next!(pg; showvalues = [(:i,i),(:num,num)])
end

Julia is significantly slower (~18 x) than Matlab in vector and matrix algebra - New to Julia - Julia Programming Language 你先参考这个优化下吧 Profiler · Julia in VS Code

好的,我试试。谢谢