For loop julia@parallel for循环不更新数组
我是julia的新手,为了开始,我想向julia移植一些numpy代码,并希望获得一些不错的性能提升。到目前为止我还不满意 这是我要计算的函数For loop julia@parallel for循环不更新数组,for-loop,multidimensional-array,parallel-processing,julia,For Loop,Multidimensional Array,Parallel Processing,Julia,我是julia的新手,为了开始,我想向julia移植一些numpy代码,并希望获得一些不错的性能提升。到目前为止我还不满意 这是我要计算的函数 function s(x_list, r_list) result_list = zeros(size(x_list,1)) for i = 1:size(x_list,1) dotprods = r_list * x_list[i,:]' expcall = exp(im * dotprods)
function s(x_list, r_list)
result_list = zeros(size(x_list,1))
for i = 1:size(x_list,1)
dotprods = r_list * x_list[i,:]'
expcall = exp(im * dotprods)
sumprod = sum(expcall) * sum(conj(expcall))
result_list[i] = sumprod
end
return result_list
end
数据输入看起来像
v = rand(3)
r = rand(6000,3)
x = linspace(1.0, 2.0, 300) * (v./sqrt(sumabs2(v)))'
对于这个函数和给定的输入,@time s(x,r)
给出了
0.110619 seconds (3.60 k allocations: 96.256 MB, 8.47% gc time)
在这种情况下,numpy在大约70毫秒内完成了相同的工作,所以我不是很高兴!现在,如果我使用julia-p2
为循环执行@并行:
function s(x_list, r_list)
result_list = SharedArray(Float64, size(x_list,1))
@parallel for i = 1:size(x_list,1)
dotprods = r_list * x_list[i,:]'
expcall = exp(im * dotprods)
sumprod = sum(expcall) * sum(conj(expcall))
result_list[i] = sumprod
end
return result_list
end
问题是
result_list[i] = sumprod
没有更新,我得到了数组初始化返回的零列表。我做错了什么?
进一步尝试提高速度也没有显示出任何好处,例如
@vectorize_2arg Array{Float64,2} s
和声明类型
function s{T<:Float64}(x_list::Array{T,2}, r_list::Array{T,2})
对于给定的函数和输入,这实际上是不可能的!这是虫子吗
非常感谢您的帮助 Julia的@parallel
宏执行分布式for循环:它将所有数据复制到其他进程,并对每个进程进行计算,减少结果并返回结果。这些进程不共享内存,甚至可能在其他机器上。您的原始数据永远不会被触及,因为每个工作人员都在修改自己的数据副本。您可能会想到线程,这是Julia将来将要添加的一项当前实验性功能。Julia的@parallel
宏执行分布式for循环:它将所有数据复制到其他进程并对每个进程进行计算,减少结果并返回结果。这些进程不共享内存,甚至可能在其他机器上。您的原始数据永远不会被触及,因为每个工作人员都在修改自己的数据副本。您可能正在考虑线程,这是Julia将在将来添加的一个当前实验性功能。一个问题是您没有等待@parallel
调用完成。发件人:
…如果不需要,可以省略还原运算符。在这种情况下,循环异步执行,也就是说,它在所有可用的worker上生成独立的任务,并立即返回Future数组,而无需等待完成。调用者可以通过调用fetch()
在稍后的时间点等待将来的完成,或者在循环结束时用@sync
作为前缀等待完成,比如@sync@parallel for
尝试使用@sync
作为循环的前缀。一个问题是,您没有等待@parallel
调用完成。发件人:
…如果不需要,可以省略还原运算符。在这种情况下,循环异步执行,也就是说,它在所有可用的worker上生成独立的任务,并立即返回Future数组,而无需等待完成。调用者可以通过调用fetch()
在稍后的时间点等待将来的完成,或者在循环结束时用@sync
作为前缀等待完成,比如@sync@parallel for
尝试在for循环前面加上@sync
哦,很抱歉,我忘了提到我还使用了一个SharedArray作为@parallel for循环的前缀。这实际上应该负责复制。我将修改我的问题,使其变得明显!哦,很抱歉,我忘了提到我还使用了一个SharedArray作为@parallel for循环。这实际上应该负责复制。我将修改我的问题,使其变得明显!谢谢,@sync真的做到了!至于另一部分,我们还可以做些什么来加速julia,从而在单进程模式下获得与python/numpy类似或更好的性能?谢谢,@sync确实做到了!至于另一部分,在单进程模式下,有没有其他方法可以加快julia的速度,以获得与python/numpy类似或更好的性能?
0.000040 seconds (36 allocations: 4.047 KB)