使用doParallel包时registerDoParallel
中群集和内核之间有什么区别?doParallel,群集vs内核
我的理解是正确的,单台机器上,这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
唯一的区别我看到makeCluster()
,必须明确停止使用stopCluster()
。
使用doParallel包时registerDoParallel
中群集和内核之间有什么区别?doParallel,群集vs内核
我的理解是正确的,单台机器上,这些是可以互换的,我会得到相同的结果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
唯一的区别我看到makeCluster()
,必须明确停止使用stopCluster()
。
是的,它从软件视图来看是正确的。
单机上这些是可以互换的,我会得到相同的结果。
要了解“集群”和“核心”显然,我建议从“硬件”和“软件”水平思考。
在硬件层面上,'cluster'表示可以通过socket之类的通信协同工作的网络连接机器(需要更多初始化/停止操作,如您指出的那样,请指定stopCluster
)。虽然“核心”意味着本地CPU中的多个硬件核心,并且它们通常通过共享存储器一起工作(不需要从A到B明确地发送消息)。
在软件层面上,有时候cluster
和cores
的边界不太清楚。该程序可以通过核心本地运行,也可以通过群集远程运行,高级软件无需知道详细信息。因此,我们可以混合使用两种模式,例如在本地使用显式通信,在一台机器上设置cl
, ,并且还可以在每台远程机器上运行多核。
回到你的问题,是设置cl
或cores
平等的吗?
从软件来看,程序将运行相同数量的客户端/服务器,然后得到相同的结果。
从硬件来看,可能会有所不同。 cl
表示明确通信,cores
表示共享内存,但是如果高级软件优化得非常好。在本地机器中,两种设置都将进入相同的流程。我现在不深究doParallel
,所以我不太确定这两者是否相同。
但实际上,最好指定cores
为单机,cl
为群集。
希望为您提供帮助。
这太笼统了。 OP的问题是关于doParallel包的具体问题,而不是一般概念问题。对于这个问题,它更多的是关于平台实现,甚至对于单机也是不同的。 – dracodoc 2017-07-12 19:27:09
我认为所选答案过于笼统,实际上并不准确,因为它没有涉及到包装本身的细节doParallel
。如果你看过这些小插曲,那其实很清楚。
并行包基本上是多核 包,写由西蒙Urbanek的合并,雪包, 写由卢克·蒂尔尼等。多核 功能仅支持那些支持fork系统调用的操作系统的多个worker;这不包括Windows。默认情况下,doParallel在类Unix系统上使用多核功能 和Windows上的积雪功能。
我们将在这个小品用雪一样的功能,所以我们通过 开始加载包和启动集群
要使用多核一样的功能,我们将指定 核心的数量,而不是使用
总之,这是依赖于系统的。集群是覆盖所有平台的更一般模式,而核心仅适用于类Unix系统。
为了使接口一致,包使用相同的功能这两种模式。
> library(doParallel)
> cl <- makeCluster(4)
> registerDoParallel(cl)
> getDoParName()
[1] "doParallelSNOW"
> registerDoParallel(cores=4)
> getDoParName()
[1] "doParallelMC"
的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()
机械,而这又依赖于分叉过程。由于使用了分叉,所以您不必担心全局和包。
不确定,但我想你会受到内核数量的限制,但不受簇数量的限制,即“并行运行并通过套接字进行通信的R副本数”。当然,集群可能会共享相同的核心,具体取决于集群数量/内核数量。 – 2015-03-03 10:34:50
我倾向于同意@Pascal,并且在单个机器上没有任何区别,除了实际尝试能够实现什么以及如何工作。如果你只是想对一些代码进行并行处理,那么这两种方法都不应该有问题。 – LauriK 2015-03-03 11:22:52