【问题标题】:What exactly is the difference between @parallel and pmap?@parallel 和 pmap 到底有什么区别?
【发布时间】:2016-06-18 00:26:57
【问题描述】:

正如标题所述:@parallelpmap 之间究竟有什么区别?我并不是说明显的一个是循环的宏,而另一个则适用于函数,我的意思是它们的实现到底有什么不同,我应该如何利用这些知识在它们之间进行选择?

我问的原因是我编写的许多应用程序都可以使用任何一种构造:我可以编写一个循环并使用@parallel 计算一些东西,或者将循环中的内容包装到一个函数中并调用@987654324 @关于那个。我一直在遵循建议,将@parallel 用于快速评估的事情,pmap 用于每个任务需要更长时间的调用(如文档中所述),但我觉得如果我对它在做什么我将能够做出更好的选择。

例如:@parallel 是否在评估之前划分工作?我注意到,如果我运行一个并行循环,其中每个内部调用需要随机的时间,@parallel 可能需要很长时间,因为最后我只有很少的进程仍在工作。 pmap 在同一个微测试上似乎没有这个:pmap 是否根据需要重新分配工作?

诸如此类的其他问题都源于我不知道pmap@parallel 究竟有何不同。

【问题讨论】:

    标签: parallel-processing julia


    【解决方案1】:

    @parallel 将把要完成的工作分配给立即可用的工作人员。注意在?@parallel 中我们得到The specified range is partitioned ... across all workers. pmap 相比之下,将启动每个工人的工作。一旦一个工人完成了一项工作,它就会给它下一个可用的工作。例如,它类似于 python 中常见的基于队列的多处理。因此,与其说是“重新分配”工作,不如说是只在正确的时间将其分发给正确的工人。

    我编写了以下示例,我相信它可以说明这一点。在这个有点傻的例子中,我们有两个工人,一个慢,另一个快两倍。理想情况下,我们希望快速工作人员的工作量是慢工作人员的两倍。 (或者,更现实地说,我们会有快速和慢速的工作,但原则是完全相同的)。 pmap 将完成此操作,但 @parallel 不会。

    对于每个测试,我初始化以下内容:

    addprocs(2)
    
    @everywhere begin
        function parallel_func(idx)
            workernum = myid() - 1 
            sleep(workernum)
            println("job $idx")
        end
    end
    

    现在,对于 @parallel 测试,我运行以下命令:

    @parallel for idx = 1:12
        parallel_func(idx)
    end
    

    并取回打印输出:

    julia>  From worker 2:  job 1
        From worker 3:  job 7
        From worker 2:  job 2
        From worker 2:  job 3
        From worker 3:  job 8
        From worker 2:  job 4
        From worker 2:  job 5
        From worker 3:  job 9
        From worker 2:  job 6
        From worker 3:  job 10
        From worker 3:  job 11
        From worker 3:  job 12
    

    几乎是甜的。工人们平均地“分担”了工作。请注意,每个工人完成了 6 份工作,尽管工人 2 的速度是工人 3 的两倍。这可能很感人,但效率很低。

    对于pmap 测试,我运行以下命令:

    pmap(parallel_func, 1:12)
    

    并获得输出:

    From worker 2:  job 1
    From worker 3:  job 2
    From worker 2:  job 3
    From worker 2:  job 5
    From worker 3:  job 4
    From worker 2:  job 6
    From worker 2:  job 8
    From worker 3:  job 7
    From worker 2:  job 9
    From worker 2:  job 11
    From worker 3:  job 10
    From worker 2:  job 12
    

    现在,请注意,工人 2 已经完成了 8 个工作,而工人 3 已经完成了 4 个工作。这与他们的速度以及我们想要获得最佳效率的速度完全成正比。 pmap 是一个艰巨的任务大师 - 来自每个人的能力。

    因此,Julia 文档中的建议是有意义的。如果您有一些简单的小工作,那么@parallel 的这些问题很可能不会引起问题。不过,对于更大或更复杂的工作,pmap 具有优势。

    【讨论】:

    • Julia 1.0 中的注释 @parallel 已被 @distributed 替换,因此您需要更改上面的代码才能使其正常工作。 Distributed 包中还有许多功能,因此需要加载。
    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2016-08-12
    • 2019-05-04
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多