【问题标题】:Optimizing parallel for loop returning array in Julia在 Julia 中优化并行循环返回数组
【发布时间】:2016-06-27 07:58:33
【问题描述】:

我必须多次计算随机算法的结果。最后,我希望将所有结果都放在一个数组中。算法的执行是相互独立的。在 Julia 中,这可以通过这样的并行 for 循环轻松并行化:

@parallel (vcat) for i=1:10
    rand() # or any other algorithm yielding a number
end

但是如果一个线程得到另一个线程的结果,并且在for循环的每次迭代之后合并两个结果,这似乎有点低效。 这个对吗?在这种情况下,可能是一个线程产生一个 100 元素的数组,另一个线程产生一个 200 元素的数组,这些数组合并成一个 300 元素的数组? 我可以以某种方式防止这种情况并重写上面的代码以防止多个数组分配,并且可能将在 for 循环中计算的结果放入预先分配的数组中吗? 或者我可以让归约算子更聪明吗?

【问题讨论】:

    标签: multithreading parallel-processing julia


    【解决方案1】:

    您可以为此使用pmap。它可以将工作并行分配给您的工作人员,然后将每个工作的结果作为一个单独的元素存储在一个数组中。然后你可以在最后组合这个数组。

    考虑这个例子,每个作业要创建一个不同长度的随机向量,所有这些都在最后组合:

    addprocs(3)
    
    Results = pmap(rand, 1:10)
    
    Result = vcat(Results...)  ## array of length 55.
    

    pmap 将在每个工作人员完成其正在处理的工作后立即为其分配工作。因此,如果您的作业长度可变,它可能比@parallel 更有效。 (详见here)。

    ... 语法将 Results 的元素(即 10 个不同长度的向量)分解为单独的参数以提供给 vcat 函数。

    【讨论】:

    • 非常感谢。我不知道pmap。指向您其他答案的链接也很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2013-03-11
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多