我正在阅读Julia的并行计算文档,并且从未进行过任何并行编码,我还想要一个更温和的介绍.所以,我想到了一个(可能)简单的问题,我无法弄清楚如何并行编写Julia范例.
假设我有一个来自某个实验的矩阵/数据帧df.它的N行是变量,M列是样本.我有一个方法pwCorr(..)来计算行的成对相关性.如果我想要所有成对相关的NxN矩阵,我可能会运行一个for循环,它迭代N * N / 2(矩阵的上三角或下三角)并填入值;然而,这似乎是并行化的完美之处,因为每个pwCorr()调用都独立于其他调用. (我是否正确地思考可以并行化的内容,哪些不可以?)
要做到这一点,我觉得我必须创建一个由@parallel for循环填充的DArray.如果是这样,我不确定如何在Julia中实现这一目标.如果这不是正确的方法,我想我甚至不知道从哪里开始.
最佳答案 这应该工作,首先你需要
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 [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.
希望有所帮助!