使用doParallel包时,registerDoParallel
中的群集和核心有什么区别?
我的理解是正确的,在单机上这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
唯一不同之处我认为makeCluster()
必须使用stopCluster()
明确停止。
答案 0 :(得分:6)
是的,从软件视图开始就是正确的。
在单机上这些是可以互换的,我会得到相同的结果。
了解群集&#39;和&#39;核心&#39;显然,我建议从“硬件”中思考。和&#39;软件&#39;水平。
在硬件级别,&#39;群集&#39;意味着网络连接的机器可以通过诸如插座之类的通信一起工作(需要更多的初始化/停止操作,如你所指出的stopCluster
)。虽然&#39;核心&#39;表示本地CPU中的多个硬件核心,它们通常由共享内存协同工作(不需要从A到B明确发送消息)。
在软件级别,cluster
和cores
的边界有时并不清楚。该程序可以通过核心本地运行,也可以通过集群远程运行,高级软件不需要知道详细信息。因此,我们可以混合使用两种模式,例如在本地使用显式通信,在一台机器中设置cl
,
并且还可以在每个远程机器中运行多核。
回到你的问题,设置cl
或cores
是否相等?
从软件中,程序将由相同数量的客户端/服务器运行,然后获得相同的结果。
从硬件上看,可能会有所不同。 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"