我使用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