@parallel和pmap之间究竟有什么区别?

Chr*_*kas 15 parallel-processing julia

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

我问的原因是我写的很多应用程序都可以使用任何一个构造:我可以编写一个循环并用它来计算@parallel,或者将循环中的内容包装到函数中并调用pmap它.我一直在遵循使用@parallel快速评估的内容和pmap每个任务需要更长时间的调用的建议(如文档中所述),但我觉得如果我能更好地理解它正在做什么我会能够做出更好的选择.

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

像这样的其他问题都源于我对pmap不同之处的无知@parallel.

Mic*_*gge 18

@parallel需要做的工作,divy起来可用的工人当中的时候了.相反,?@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
Run Code Online (Sandbox Code Playgroud)

现在,为了@parallel测试,我运行以下内容:

@parallel for idx = 1:12
    parallel_func(idx)
end
Run Code Online (Sandbox Code Playgroud)

并获取打印输出:

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
Run Code Online (Sandbox Code Playgroud)

它几乎是甜蜜的.工人们平均"分享"了工作.请注意,每个工作人员已完成6个工作,即使工人2的工作速度是工人3的两倍.它可能会触及,但效率低下.

对于pmap测试,我运行以下内容:

pmap(parallel_func, 1:12)
Run Code Online (Sandbox Code Playgroud)

并得到输出:

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
Run Code Online (Sandbox Code Playgroud)

现在,请注意,工人2执行了8个工作,工人3执行了4个工作.这与他们的速度和我们想要的最佳效率成正比. pmap是一个艰巨的任务大师 - 从每个人的能力.

因此,Julia文档中的建议是有道理的.如果你有简单的小工作,那么这些问题更有可能@parallel不会引起问题.但是,对于更大或更复杂的工作,pmap有优势.

  • 请注意,在Julia 1.0中,“ @ parallel”已由“ @distributed”替换为“ @distributed”,因此您需要更改上面的代码才能使其工作。Distributed包中还包含许多功能,因此需要加载。 (2认同)