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

Parallel processing 如何使用Julia并行运行方法?,parallel-processing,julia,Parallel Processing,Julia,我在读朱莉娅的并行计算文档,但从来没有做过任何并行编码,我想要一个更温和的介绍。所以,我想到了一个(可能)简单的问题,我不知道如何用并行Julia范式编写代码 假设我有一个来自某个实验的矩阵/数据帧df。它的N行是变量,M列是示例。我有一个方法pwCorr(..)计算行的成对相关性。如果我想要一个包含所有成对相关性的NxN矩阵,我可能会运行一个for循环,该循环迭代N*N/2(矩阵的上三角或下三角)并填充值;然而,这似乎是一个完美的并行化方法,因为每个pwCorr()调用都是独立的。(我这样思考

我在读朱莉娅的并行计算文档,但从来没有做过任何并行编码,我想要一个更温和的介绍。所以,我想到了一个(可能)简单的问题,我不知道如何用并行Julia范式编写代码

假设我有一个来自某个实验的矩阵/数据帧
df
。它的
N
行是变量,
M
列是示例。我有一个方法
pwCorr(..)
计算行的成对相关性。如果我想要一个包含所有成对相关性的NxN矩阵,我可能会运行一个for循环,该循环迭代
N*N/2
(矩阵的上三角或下三角)并填充值;然而,这似乎是一个完美的并行化方法,因为每个
pwCorr()
调用都是独立的。(我这样思考什么可以并行,什么不能并行,对吗?)


要做到这一点,我觉得我必须创建一个
DArray
,由
@parallel
for循环填充。如果是这样的话,我不确定朱莉娅是如何做到这一点的。如果这不是正确的方法,我想我甚至不知道从哪里开始。

这应该是可行的,首先你需要(数据)告诉所有员工:

 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
您可以看到它在第二个轴上将数组分割为两个块

该示例中最棘手的部分是通过减去最小元素,然后为基于1的Julia索引加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)