Div*_*ivM 5 parallel-processing julia
我正在阅读 Julia 的并行计算文档,并且从未做过任何并行编码,所以我想要一个更温和的介绍。所以,我想到了一个(可能)简单的问题,我无法弄清楚如何在并行 Julia 范式中进行编码。
假设我有一个df
来自某个实验的矩阵/数据框。它的N
行是变量,M
列是样本。我有一种pwCorr(..)
计算行的成对相关性的方法。如果我想要一个包含所有成对相关性的 NxN 矩阵,我可能会运行一个 for 循环来迭代N*N/2
(矩阵的上三角或下三角)并填充值;然而,这似乎是一个完美的并行化方法,因为每个调用pwCorr()
都是独立于其他调用的。(我对什么可以并行、什么不能并行的这种思考正确吗?)
为此,我觉得我必须创建一个DArray
由 for 循环填充的对象@parallel
。如果是这样,我不确定如何在 Julia 中实现这一点。如果这不是正确的方法,我想我什至不知道从哪里开始。
这应该可行,首先您需要将顶级变量(数据)传播给所有工作人员:
for pid in workers()
remotecall(pid, x->(global data; data=x; nothing), data)
end
Run Code Online (Sandbox Code Playgroud)
然后使用 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
Run Code Online (Sandbox Code Playgroud)
更详细地说,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)
Run Code Online (Sandbox Code Playgroud)
您可以看到它在第二个轴上将数组分成两个块。
该示例中最棘手的部分是通过减去最小元素,然后为 Julia 的基于 1 的索引加回 1,从这些“全局”索引范围转换为本地索引范围。希望有帮助!