问题 doParallel,cluster vs cores


群集和核心之间有什么区别 registerDoParallel 什么时候使用doParallel包?

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

cl <- makeCluster(4)
registerDoParallel(cl)    

registerDoParallel(cores = 4)

我看到的唯一区别 makeCluster() 必须明确停止使用 stopCluster()


12316
2018-03-03 10:21


起源

不确定,但我猜你会受到核心数量的限制,但不会受到集群数量的限制,即“并行运行并通过套接字进行通信的R副本”的数量。当然,群集可能共享相同的核心,具体取决于群集的数量/核心数量。
我倾向于同意@Pascal并且在一台机器上没有任何差别,除了实际尝试可以实现的目标和工作方式之外。如果你只是想并行化一些代码,那么无论哪种方式都无关紧要。 - LauriK


答案:


是的,从软件视图来看是正确的。

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


为了清楚地理解“集群”和“核心”,我建议从“硬件”和“软件”层面进行思考。

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

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


回到你的问题,正在设置 cl 要么 cores 等于?

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

从硬件上看,可能会有所不同。 cl 意味着明确地和 cores 共享内存,但如果高级软件优化得很好。在本地机器中,两个设置都将进入相同的流程。我不介意 doParallel 现在很深,所以我不太确定这两个是否相同。

但在实践中,最好指定 cores 对于单机和 cl 对于集群。 

希望对您有所帮助。


6
2018-01-11 08:52



这太笼统了。 OP的问题是关于doParallel包的具体问题,而不是一般概念问题。对于这个问题,它更多的是关于平台实现,即使对于单个机器它们也是不同的。 - dracodoc


的行为 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() 机器,反过来依赖  流程。由于使用了分叉,因此您不必担心全局变量和包。


4
2017-07-15 20:26





我认为所选择的答案过于笼统,实际上并不准确,因为它没有触及细节 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"

1
2017-07-12 14:26