我的代码中有一个错误。对不起大家。原因是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配置,请尝试:
BLAS用于诸如矩阵乘法之类的线性代数运算。在这种情况下,调用using LinearAlgebra LinearAlgebra.BLAS.get_num_threads()
my_function
将已经使用大多数线程,因此观察到较小的加速 - 其他一些库(如
DataFrames
(正在为选定的操作使用线程支持 - 其他问题,如错误共享或种族条件(在您的代码中看起来不是这样(