如何使用Julia并行运行方法?

5
我正在阅读Julia的并行计算文档,由于我从未进行过任何并行编程,所以我希望有一个更温和的介绍。因此,我想到了一个(可能)简单的问题,即我无法弄清楚如何在并行Julia范例中编写代码。
假设我有一个矩阵/数据框“df”,它的N行是变量,M列是样本。我有一个方法“pwCorr(..)”,用于计算行之间的成对相关性。如果我想要一个NxN的所有成对相关性矩阵,我可能会运行一个for循环,该循环会迭代N*N/2次(矩阵的上三角或下三角),并填写值;但是,由于每个“pwCorr()”调用都与其他调用无关,因此这似乎是可以并行化的完美事情。(我的这种思考方式是正确的吗?什么可以并行化,什么不能?)
为了实现这一点,我觉得我必须创建一个由“@parallel”for循环填充的“DArray”。如果是这样,我不确定如何在Julia中实现这一点。如果这不是正确的方法,我想我甚至不知道从哪里开始。
1个回答

3

这应该可以工作,首先你需要将顶层变量(data)传递给所有的工作进程:

 for pid in workers()
       remotecall(pid, x->(global data; data=x; nothing), data)
       end

然后使用带有一些花式索引的 DArray 构造函数对计算进行分块处理:
corrs = DArray((20,20)) do I
         out=zeros(length(I[1]),length(I[2]))
         for i=I[1], j=I[2]
           if i<j 
             out[i-minimum(I[1])+1,j-minimum(I[2])+1]= 0.0
           else
             out[i-minimum(I[1])+1,j-minimum(I[2])+1] = cor(vec(data[i,:]), vec(data[j,:]))
           end
         end
         out 
       end

更详细地说,DArray 构造函数接受一个函数作为参数,该函数接受一个索引范围的元组,并返回对应于这些索引范围的矩阵块。在上面的代码中,I 是范围的元组,其中 I[1] 是第一个范围。您可以通过以下方式更清楚地看到这一点:
julia> DArray((10,10)) do I
       println(I)
       return zeros(length(I[1]),length(I[2]))
       end
        From worker 2:  (1:10,1:5)
        From worker 3:  (1:10,6:10)

在这里,您可以看到它将数组在第二轴上分成两个块。

示例最棘手的部分是通过减去最小元素,然后加回1来将全局索引范围转换为本地索引范围,以便进行Julia的基于1的索引。希望这能帮到您!


如果你想让这个答案真正引人注目,你应该扩展一下并解释每个步骤正在做什么。在“花式索引”方面稍微详细一些。 - Jeremy Wall
啊,这看起来不错。注释肯定会有所帮助,但比没有好!我得逐行运行这个程序以弄清楚这里发生了什么。谢谢! - DivM
不幸的是,现实生活有时会优先考虑,今晚我又在睡前检查这个。也许明天我会找到一些时间来完善一下。 - JKnight
1
好的,希望这样增加了一些活力! - JKnight
@JKnight 我想我明白了。我需要再多练习一下。谢谢你! - DivM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接