【发布时间】:2016-02-23 23:36:41
【问题描述】:
我是 julia 的新手,开始时我想将一些 numpy 代码移植到 julia,并希望获得一些不错的性能提升。到目前为止,我并不满意。
这是我要计算的函数
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 -p 2 执行@parallel for 循环:
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})
但是现在,在只有一个线程的会话中启动相同的@parallel for 循环(没有-p2,只有julia),数组确实得到了更新,@time s(x,r) 告诉我
0.000040 seconds (36 allocations: 4.047 KB)
对于给定的功能和输入,这实际上是不可能的!这是一个错误吗?
非常感谢任何帮助!
【问题讨论】:
标签: for-loop multidimensional-array parallel-processing julia