为什么我在Julia的平行for循环中没有观察到任何速度



我的代码中有一个错误。对不起大家。原因是X值越大所需的时间越大

这是我的代码:

fit_s = rand(100)
fit_d = rand(300) 
LIM = 100
x = [2^i for i in range(-2,2,40)]
y = zeros(length(x))
Threads.@threads for i in 1:length(x)
y[i] = analytic(x[i], fit_s, fit_d, LIM)
end
print(i)

my_function使用这两个输入来产生输出。问题是它没有加快执行速度。使用1个线程需要27秒,而使用8个线程需要21秒(我只考虑for循环的时间(。我能做什么?谢谢你的建议。

功能

function alpha(i,n,m)
((n-i)/n)^m - ((n-i-1)/n)^m
end
function beta(i,n,m)
(1-i/n)^(m)
end
function gamma(s, d, fit_s, fit_d, LIM)
n_s = length(fit_s)    
n_d = length(fit_d)
app = sort(fit_d, rev=true)[1:LIM]
F_DN = 0.
for i in 1:LIM
j = sum(fit_s .> app[i])
F_DN += alpha(i-1,n_d,d)*beta(j,n_s,s)
end

F_DN
end
function mine_poisson(m,i)
f = Poisson(m)
pdf(f, i)
end
function analytic(m, fit_s, fit_d, LIM)
Z = 1 - exp(-2*m)
F_DN = 0.
intm = trunc(Int, m + 0.5)
if m < 20
intervallo = 1:(intm + 20)
else
app = trunc(Int,m^0.5)*4
intervallo = (intm - app) : (intm+app)
end
for j in intervallo
for k in intervallo
p = mine_poisson(m, k)*mine_poisson(m, j) / Z
F_DN += gamma(j, k, fit_s, fit_d, LIM)*p
end
end

F_DN += exp(-m)*(1-exp(-m))/Z
end

您的代码看起来是正确的。

您可能没有观察到加速的原因如下:

  • 您在启动Julia时忘记了-t参数。使用Threads.nthreads()检查实际加载的线程数
  • 您的操作系统中有大量其他任务
  • [很可能]您的函数my_function通过BLAS使用并行代码。要了解BLAS配置,请尝试:
    using LinearAlgebra  
    LinearAlgebra.BLAS.get_num_threads()
    
    BLAS用于诸如矩阵乘法之类的线性代数运算。在这种情况下,调用my_function将已经使用大多数线程,因此观察到较小的加速
  • 其他一些库(如DataFrames(正在为选定的操作使用线程支持
  • 其他问题,如错误共享或种族条件(在您的代码中看起来不是这样(

最新更新