群集和核心之间有什么区别 registerDoParallel
什么时候使用doParallel包?
我的理解是正确的,在单机上这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
我看到的唯一区别 makeCluster()
必须明确停止使用 stopCluster()
。
群集和核心之间有什么区别 registerDoParallel
什么时候使用doParallel包?
我的理解是正确的,在单机上这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
我看到的唯一区别 makeCluster()
必须明确停止使用 stopCluster()
。
是的,从软件视图来看是正确的。
在单机上这些是可以互换的,我会得到相同的结果。
为了清楚地理解“集群”和“核心”,我建议从“硬件”和“软件”层面进行思考。
在硬件级别,“集群”意味着网络连接的机器可以通过诸如插座之类的通信一起工作(需要更多的初始化/停止操作 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()
机器,反过来依赖 岔 流程。由于使用了分叉,因此您不必担心全局变量和包。
我认为所选择的答案过于笼统,实际上并不准确,因为它没有触及细节 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"