gpt4 book ai didi

parallel-processing - 如何使用 Julia 并行运行一个方法?

转载 作者:行者123 更新时间:2023-12-01 03:47:01 24 4
gpt4 key购买 nike

我正在阅读 Julia 的 Parallel Computing 文档,并且从未做过任何并行编码,所以我想要一个更温和的介绍。所以,我想到了一个(可能)简单的问题,我无法弄清楚如何在并行 Julia 范式中进行编码。

假设我有一个矩阵/数据框 df从一些实验。它的 N行是变量,M列是样本。我有一个方法 pwCorr(..)计算行的成对相关性。如果我想要一个包含所有成对相关性的 NxN 矩阵,我可能会运行一个 for 循环,它会迭代 N*N/2 (矩阵的上三角或下三角)并填写值;然而,这似乎是并行化的完美选择,因为每个 pwCorr()调用独立于其他调用。 (我以这种方式思考什么可以并行化,什么不能并行化是否正确?)

为此,我觉得我必须创建一个 DArray@parallel 填充for 循环。如果是这样,我不确定如何在 Julia 中实现这一点。如果这不是正确的方法,我想我什至不知道从哪里开始。

最佳答案

这应该有效,首先你需要 propagate the top level variable (数据)给所有 worker :

 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)

你可以看到它在第二个轴上将数组分成两个块。

该示例中最棘手的部分是通过减去最小元素,然后为 Julia 的基于 1 的索引加回 1,将这些“全局”索引范围转换为本地索引范围。
希望有帮助!

关于parallel-processing - 如何使用 Julia 并行运行一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26067574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com