registerDoParallel中的集群和核心在使用doParallel包时有什么区别?
我的理解是正确的,在单机上,它们是可互换的,我将得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl) 和
registerDoParallel(cores = 4)我看到的唯一不同是必须使用makeCluster()显式地停止使用stopCluster()。
发布于 2017-07-15 20:26:02
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-12 14:26:25
我认为选择的答案过于笼统,实际上不准确,因为它没有触及doParallel包本身的细节。如果你读了这些小插曲,它实际上是相当清晰的。
并行包本质上是由Simon编写的多核包和Luke等人编写的斯诺包的合并。多核功能只支持那些支持分叉系统调用的操作系统上的多个工作人员;这不包括Windows。默认情况下,doParallel在类Unix系统上使用多核功能,在Windows上使用斯诺功能。 我们将在这个小片段中使用类似雪的功能,所以我们首先加载包并启动一个集群。 要使用类似多核的功能,我们将指定要使用的核数。
总之,这是系统依赖的。集群是覆盖所有平台的更通用的模式,而核心只适用于类似unix的系统.
为了使接口一致,包对这两种模式使用了相同的功能。
> library(doParallel)
> cl <- makeCluster(4)
> registerDoParallel(cl)
> getDoParName()
[1] "doParallelSNOW"
> registerDoParallel(cores=4)
> getDoParName()
[1] "doParallelMC"发布于 2016-01-11 08:52:59
是的,从软件的角度来看是对的。
在单机上,这些是可互换的,我会得到同样的结果。
为了清楚地理解“集群”和“核心”,我建议从“硬件”和“软件”两方面进行思考。
在硬件层面,“集群”是指可以通过通信(如套接字)一起工作的网络连接的机器(需要更多的init/stop操作,如您所指出的stopCluster )。而“核心”是指本地CPU中的几个硬件核,它们通常通过共享内存协同工作(不需要显式地从A到B发送消息)。
在软件层面,有时cluster和cores的界限并不那么清晰。该程序可以通过内核在本地运行,也可以通过集群远程运行,高级软件不需要知道细节。因此,我们可以混合两种模式,例如在本地使用显式通信,例如在一台机器上设置cl,也可以在每台远程机器上运行多核。
回到您的问题,设置cl或cores是否等于?
从软件中,程序将由相同数量的客户机/服务器运行,然后得到相同的结果。
从硬件上看,可能是不同的。cl意味着显式地与cores通信,但是如果高级软件优化得很好的话。在本地机器中,这两个设置将进入相同的流。我现在不太深入地研究doParallel,所以我不太确定这两者是否相同。
但是在实践中,最好为单机指定cores ,为集群指定 cl 。
希望这能帮到你。
https://stackoverflow.com/questions/28829300
复制相似问题