【问题标题】:julia @parallel for loop does not update arrayjulia @parallel for 循环不更新数组
【发布时间】: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


    【解决方案1】:

    Julia 的 @parallel 宏执行分布式 for 循环:它将所有数据复制到其他进程,并对每个进程进行计算,减少结果并返回该结果。这些进程不共享内存——甚至可能完全在其他机器上。您的原始数据永远不会被触及,因为每个工作人员都在修改自己的数据副本。您可能会想到线程,这是 Julia 将在未来添加的当前实验性功能。

    【讨论】:

    • 哦,抱歉忘了提到我还为 @parallel for 循环使用了 SharedArray。这实际上应该负责复制。将修改我的问题以使其显而易见!
    【解决方案2】:

    一个问题是您没有等待@parallel 调用完成。来自the docs

    ...如果不需要,可以省略归约运算符。在这种情况下,循环异步执行,即它在所有可用的工作人员上产生独立的任务,并立即返回一个 Future 数组,而无需等待完成。调用者可以稍后通过调用 fetch() 来等待 Future 完成,或者在循环结束时通过在其前面加上 @sync 来等待完成,例如 @sync @parallel for

    尝试使用@sync为循环添加前缀

    【讨论】:

    • 谢谢,@sync 确实做到了!至于另一部分,在单进程模式下,是否可以做其他事情来加速 julia 以实现与 python/numpy 类似或更好的性能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多