19

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

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

cl <- makeCluster(4)
registerDoParallel(cl)    

registerDoParallel(cores = 4)

我看到的唯一区别makeCluster()必须使用stopCluster().

4

3 回答 3

12

我认为选择的答案过于笼统,实际上并不准确,因为它没有触及doParallel包装本身的细节。如果你读了这些小插曲,它实际上是很清楚的。

并行包本质上是由 Simon Urbanek 编写的 multicore 包和由 Luke Tierney 等人编写的 snow 包的合并。多核功能仅在那些支持 fork 系统调用的操作系统上支持多个 worker;这不包括 Windows。默认情况下,doParallel 在类 Unix 系统上使用多核功能,在 Windows 上使用雪功能。

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

要使用类似多核的功能,我们将指定要使用的内核数

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

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

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

> registerDoParallel(cores=4)
> getDoParName()
[1] "doParallelMC"
于 2017-07-12T14:26:25.440 回答
7

是的,从软件的角度来看是正确的。

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


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

在硬件级别,“集群”意味着可以通过诸如套接字之类的通信一起工作的网络连接机器(正如stopCluster您所指出的,需要更多的初始化/停止操作)。而“核心”是指本地 CPU 中的多个硬件核心,它们通常通过共享内存一起工作(不需要从 A 显式发送消息到 B)。

在软件层面,有时和的界限cluster并不cores那么清晰。程序可以通过核心在本地运行,也可以通过集群远程运行,高级软件不需要知道细节。因此,我们可以混合使用两种模式,例如cl在一台机器上使用本地显式通信,也可以在每台远程机器上运行多核。


回到你的问题,是设置cl还是cores相等?

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

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

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

希望这对您有所帮助。

于 2016-01-11T08:52:59.283 回答
6

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

于 2017-07-15T20:26:02.583 回答