【问题标题】:julia @parallel for loop - how to update a dictionary (array) and return the results?julia @parallel for 循环 - 如何更新字典(数组)并返回结果?
【发布时间】:2017-04-26 10:23:49
【问题描述】:

我想知道如何在函数的@parallel for 循环中更新数组并返回结果。这是一个简单的例子:

addprocs(2)

function parallel_func()
   a = Dict{Int64, Int64}()
   @sync @parallel for i in 1:10
      a[i] = 2*i
   end
   println(length(a))
   return a
end 

a = parallel_func()
println(length(a)) 

在这里,a 在使用 @parallel 宏运行 for 循环后为空。 我知道@parallel 复制每个工人的数据并且不触及原始数据,但我认为可能有一种方法可以从所有工人那里获取数据。如果您可以评论任何替代方案以加快 for 循环(如上面的示例),我将不胜感激。

【问题讨论】:

    标签: parallel-processing julia


    【解决方案1】:

    @parallel 有回报。您可以通过使用vcathcat 减少来返回一个数组:

    arr = @sync @parallel (vcat) for i in 1:10
      ...
      element
    end
    

    您可以 cat 到 Pairs 的数组并从中构建一个 Dict

    编辑

    我注意到您实际上正在寻找对数组进行变异。在这种情况下,您应该使用SharedArrayDistributedArray

    【讨论】:

    • 需要@sync 吗?我想不是。我也建议改用pmap
    • 是的,pmap 可能更适合这个。如果迭代时间不相等,它会更快。
    • 我喜欢它,因为它更容易推断出它在做什么——因为它是一个函数,而不是一个宏。
    • 非常感谢,我也试试pmap
    • 扩展聊天不适用于 cmets。您应该查看 Julia Gitter 以了解后续问题:gitter.im/JuliaLang/julia。也就是说,要使用其他固定参数,只需使用闭包:(i) -> parallel_func(i,other_stuff)
    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多