在Julia中优化并行for循环返回数组

时间:2016-06-27 07:58:33

标签: multithreading parallel-processing julia

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

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

但是如果一个线程获得另一个线程的结果并且在for循环的每次迭代之后合并两个结果,那么它似乎有点低效。 它是否正确?在这种情况下,可能是一个线程产生一个100个元素的数组,另一个产生一个200个元素的数组,这些数组被合并成一个300个元素的数组? 我可以以某种方式阻止这种情况并重写上面的代码以防止多个数组分配,并可能将在for-loop中计算的结果放入预先分配的数组中吗? 或者我可以以某种方式使还原算子更智能吗?

1 个答案:

答案 0 :(得分:3)

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

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

addprocs(3)

Results = pmap(rand, 1:10)

Result = vcat(Results...)  ## array of length 55.

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

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

相关问题