我正在阅读Julia的并行计算文档,并且从未进行过任何并行编码,我还想要一个更温和的介绍。所以,我想到了一个(可能)简单的问题,我无法弄清楚如何并行编写Julia范例。
假设我有一个实验中的矩阵/数据帧df
。其N
行是变量,M
列是样本。我有一个方法pwCorr(..)
来计算行的成对相关性。如果我想要所有成对相关的NxN矩阵,我可能会运行一个for循环,它迭代N*N/2
(矩阵的上三角或下三角)并填入值;然而,这似乎是并行化的完美之处,因为每个pwCorr()
调用都独立于其他调用。 (我是否正确地思考了什么可以并行化,什么不可以?)
要做到这一点,我觉得我必须创建一个由DArray
for循环填充的@parallel
。如果是这样,我不确定如何在Julia中实现这一目标。如果这不是正确的方法,我想我甚至不知道从哪里开始。
答案 0 :(得分:2)
这应该有效,首先你需要propagate the top level variable(数据)给所有工人:
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)
你可以看到它在第二轴上将数组分成两个块。
这个例子中最棘手的部分是从这些全球&#39;转换。 index通过减去最小元素然后为基于1的Julia索引加回1来将范围扩展到本地索引范围。 希望有所帮助!