registerDoParallel
使用 doParallel 包时,集群和核心有什么区别?
我的理解是否正确,在单台机器上这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
我看到的唯一区别makeCluster()
必须使用stopCluster()
.
registerDoParallel
使用 doParallel 包时,集群和核心有什么区别?
我的理解是否正确,在单台机器上这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
我看到的唯一区别makeCluster()
必须使用stopCluster()
.
我认为选择的答案过于笼统,实际上并不准确,因为它没有触及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"
是的,从软件的角度来看是正确的。
在单台机器上,这些是可以互换的,我会得到相同的结果。
为了清楚地理解“集群”和“核心”,我建议从“硬件”和“软件”层面思考。
在硬件级别,“集群”意味着可以通过诸如套接字之类的通信一起工作的网络连接机器(正如stopCluster
您所指出的,需要更多的初始化/停止操作)。而“核心”是指本地 CPU 中的多个硬件核心,它们通常通过共享内存一起工作(不需要从 A 显式发送消息到 B)。
在软件层面,有时和的界限cluster
并不cores
那么清晰。程序可以通过核心在本地运行,也可以通过集群远程运行,高级软件不需要知道细节。因此,我们可以混合使用两种模式,例如cl
在一台机器上使用本地显式通信,也可以在每台远程机器上运行多核。
回到你的问题,是设置cl
还是cores
相等?
从软件来看,程序将由相同数量的客户端/服务器运行,然后得到相同的结果,这将是相同的。
从硬件上看,可能会有所不同。cl
意味着显式通信并cores
共享内存,但如果高级软件优化得很好。在本地机器中,这两个设置将进入相同的流程。我现在没有doParallel
深入研究,所以我不太确定这两个是否相同。
但在实践中,最好cores
为单机和cl
集群指定。
希望这对您有所帮助。
的行为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()
机器,而机器又依赖于分叉的过程。由于使用了分叉,因此您不必担心全局和包。