【问题标题】:How to run a method in parallel using Julia?如何使用 Julia 并行运行方法?
【发布时间】:2014-10-01 00:14:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: parallel-processing julia


    【解决方案1】:

    这应该可以了,首先你需要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)
    

    您可以看到它在第二个轴上将数组拆分为两个块。

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

    【讨论】:

    • 如果你想让这个答案真正流行起来,你应该稍微扩展一下并解释每个步骤在做什么。稍微扩展一下花式索引的含义。
    • 啊,这看起来不错。评论肯定会有所帮助,但我会接受一些东西!我将不得不逐行运行这一行来弄清楚这里发生了什么。谢谢!
    • 不幸的是,现实生活有时会优先考虑,我再次在睡觉前检查这一点。也许我明天会找点时间充实一下。
    • 好的,希望这会增加一些流行音乐!
    • @JKnight 我想我明白了。我需要更多的练习。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多