Tom*_*eif 13 r rparallel doparallel
registerDoParallel
使用doParallel软件包时集群和核心有什么区别?
我的理解是正确的,在单机上这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)
和
registerDoParallel(cores = 4)
Run Code Online (Sandbox Code Playgroud)
我看到的唯一区别makeCluster()
是必须明确停止使用stopCluster()
.
dra*_*doc 11
我认为选择的答案过于笼统,实际上并不准确,因为它没有触及doParallel
包装本身的细节。如果你阅读小插曲,它实际上很清楚。
并行包本质上是由Simon Urbanek 编写的multicore 包和由Luke Tierney 等人编写的snow 包的合并。多核功能仅在支持 fork 系统调用的操作系统上支持多个 worker;这不包括 Windows。默认情况下,doParallel 在类 Unix 系统上使用多核功能,在 Windows 上使用雪功能。
我们将在这个小插图中使用类似雪的功能,所以我们首先加载包并启动一个集群
要使用类似多核的功能,我们将指定要使用的核心数
总之,这取决于系统。Cluster 是更通用的模式,覆盖所有平台,cores 仅适用于类 unix 系统。
为了使接口一致,包对这两种模式使用了相同的功能。
> library(doParallel)
> cl <- makeCluster(4)
> registerDoParallel(cl)
> getDoParName()
[1] "doParallelSNOW"
> registerDoParallel(cores=4)
> getDoParName()
[1] "doParallelMC"
Run Code Online (Sandbox Code Playgroud)
是的,从软件视图来看是正确的.
在单机上这些是可以互换的,我会得到相同的结果.
为了清楚地理解"集群"和"核心",我建议从"硬件"和"软件"层面进行思考.
在硬件级别,"集群"意味着网络连接的机器可以通过诸如插座之类的通信一起工作(需要更多的初始化/停止操作stopCluster
).虽然"核心"意味着本地CPU中有多个硬件核心,但它们通常由共享内存协同工作(不需要从A到B明确发送消息).
在软件层面,有时候边界cluster
并且cores
不那么明确.该程序可以通过核心本地运行,也可以通过集群远程运行,高级软件不需要知道详细信息.因此,我们可以混合使用两种模式,例如在本地中使用显式通信作为cl
一台机器中的设置,并且还可以在每台远程机器中运行多核.
回到你的问题,是设置cl
还是cores
相等?
从软件中,程序将由相同数量的客户端/服务器运行,然后获得相同的结果.
从硬件上看,可能会有所不同.cl
意味着沟通显式和cores
共享内存,但如果高级软件优化得很好.在本地机器中,两个设置都将进入相同的流程.我现在不doParallel
深入,所以我不确定这两者是否相同.
但实际上,最好指定cores
单机和cl
集群.
希望对您有所帮助.
的行为doParallel::registerDoParallel(<numeric>)
取决于操作系统,print(doParallel::registerDoParallel)
有关详细信息,请参阅。
在Windows计算机上,
doParallel::registerDoParallel(4)
Run Code Online (Sandbox Code Playgroud)
有效地做
cl <- makeCluster(4)
doParallel::registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)
即,它设置了四个在后台R会话中运行的(“ PSOCK”)工作程序。然后,%dopar%
将基本利用parallel::parLapply()
机械。使用此设置,您确实需要担心全局变量和每个工作程序上附加的包。
但是,在非Windows计算机上,
doParallel::registerDoParallel(4)
Run Code Online (Sandbox Code Playgroud)
结果将是%dopar%
利用parallel::mclapply()
机器,而机器又依赖于分叉的过程。由于使用了分叉,因此您不必担心全局变量和程序包。