doParallel,cluster vs cores

时间:2015-03-03 10:21:54

标签: r rparallel doparallel

使用doParallel包时,registerDoParallel中的群集和核心有什么区别?

我的理解是正确的,在单机上这些是可以互换的,我会得到相同的结果:

cl <- makeCluster(4)
registerDoParallel(cl)    

registerDoParallel(cores = 4)

唯一不同之处我认为makeCluster()必须使用stopCluster()明确停止。

3 个答案:

答案 0 :(得分:6)

是的,从软件视图开始就是正确的。

  

在单机上这些是可以互换的,我会得到相同的结果。

了解群集&#39;和&#39;核心&#39;显然,我建议从“硬件”中思考。和&#39;软件&#39;水平。

在硬件级别,&#39;群集&#39;意味着网络连接的机器可以通过诸如插座之类的通信一起工作(需要更多的初始化/停止操作,如你所指出的stopCluster)。虽然&#39;核心&#39;表示本地CPU中的多个硬件核心,它们通常由共享内存协同工作(不需要从A到B明确发送消息)。

在软件级别,clustercores的边界有时并不清楚。该程序可以通过核心本地运行,也可以通过集群远程运行,高级软件不需要知道详细信息。因此,我们可以混合使用两种模式,例如在本地使用显式通信,在一台机器中设置cl, 并且还可以在每个远程机器中运行多核。

回到你的问题,设置clcores是否相等?

从软件中,程序将由相同数量的客户端/服务器运行,然后获得相同的结果。

从硬件上看,可能会有所不同。 cl表示将显式和cores与共享内存进行通信,但是如果高级软件优化得非常好。在本地机器中,两个设置都将进入相同的流程。我现在不深入doParallel,所以我不太确定这两者是否相同。

但实际上,最好为单机指定cores,为群集指定cl

希望对您有所帮助。

答案 1 :(得分:4)

doParallel::registerDoParallel(<numeric>)的行为取决于操作系统,有关详细信息,请参阅print(doParallel::registerDoParallel)

在Windows计算机上,

doParallel::registerDoParallel(4)

有效地做到了

cl <- makeCluster(4)
doParallel::registerDoParallel(cl)

即。它设置了四个(“PSOCK”)工作者在后台R会话中运行。然后,%dopar%将基本上使用parallel::parLapply()机制。使用此设置,您必须担心全局变量和程序包附加在每个工作程序上。

但是,在非Windows机器上,

doParallel::registerDoParallel(4)

结果将是%dopar%将使用parallel::mclapply()机制,而机制又依赖于分叉进程。由于使用了分叉,因此您不必担心全局变量和包。

答案 2 :(得分:1)

我认为所选择的答案过于笼统而且实际上并不准确,因为它没有触及doParallel包本身的细节。如果您阅读了小插曲,那实际上非常清楚。

  

并行包本质上是多核的合并   包装,由Simon Urbanek编写,以及雪包,   这是由卢克蒂尔尼和其他人写的。多核   功能仅支持多个工作者   支持fork系统调用的系统;这不包括Windows。通过   默认情况下,doParallel在类Unix系统上使用多核功能   和Windows上的雪功能。

     

我们将在这个小插图中使用类似雪的功能,所以我们从一开始   加载包并启动集群

     

要使用类似多核的功能,我们会指定数量   要使用的核心

总之,这取决于系统。集群是覆盖所有平台的更通用模式,核心仅适用于类Unix系统。

为了使界面一致,包对这两种模式使用相同的功能。

> library(doParallel)
> cl <- makeCluster(4)
> registerDoParallel(cl)
> getDoParName()
[1] "doParallelSNOW"

> registerDoParallel(cores=4)
> getDoParName()
[1] "doParallelMC"