2015-03-03 85 views
9

使用doParallel包时registerDoParallel中群集和内核之间有什么区别?doParallel,群集vs内核

我的理解是正确的,单台机器上,这些是可以互换的,我会得到相同的结果:

cl <- makeCluster(4) 
registerDoParallel(cl)  

registerDoParallel(cores = 4) 

唯一的区别我看到makeCluster(),必须明确停止使用stopCluster()

+0

不确定,但我想你会受到内核数量的限制,但不受簇数量的限制,即“并行运行并通过套接字进行通信的R副本数”。当然,集群可能会共享相同的核心,具体取决于集群数量/内核数量。 – 2015-03-03 10:34:50

+1

我倾向于同意@Pascal,并且在单个机器上没有任何区别,除了实际尝试能够实现什么以及如何工作。如果你只是想对一些代码进行并行处理,那么这两种方法都不应该有问题。 – LauriK 2015-03-03 11:22:52

回答

5

是的,它从软件视图来看是正确的。

单机上这些是可以互换的,我会得到相同的结果。


要了解“集群”和“核心”显然,我建议从“硬件”和“软件”水平思考。

在硬件层面上,'cluster'表示可以通过socket之类的通信协同工作的网络连接机器(需要更多初始化/停止操作,如您指出的那样,请指定stopCluster)。虽然“核心”意味着本地CPU中的多个硬件核心,并且它们通常通过共享存储器一起工作(不需要从A到B明确地发送消息)。

在软件层面上,有时候clustercores的边界不太清楚。该程序可以通过核心本地运行,也可以通过群集远程运行,高级软件无需知道详细信息。因此,我们可以混合使用两种模式,例如在本地使用显式通信,在一台机器上设置cl, ,并且还可以在每台远程机器上运行多核。


回到你的问题,是设置clcores平等的吗?

从软件来看,程序将运行相同数量的客户端/服务器,然后得到相同的结果。

从硬件来看,可能会有所不同。 cl表示明确通信,cores表示共享内存,但是如果高级软件优化得非常好。在本地机器中,两种设置都将进入相同的流程。我现在不深究doParallel,所以我不太确定这两者是否相同。

但实际上,最好指定cores为单机,cl为群集。

希望为您提供帮助。

+0

这太笼统了。 OP的问题是关于doParallel包的具体问题,而不是一般概念问题。对于这个问题,它更多的是关于平台实现,甚至对于单机也是不同的。 – dracodoc 2017-07-12 19:27:09

1

我认为所选答案过于笼统,实际上并不准确,因为它没有涉及到包装本身的细节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" 
3

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()机械,而这又依赖于分叉过程。由于使用了分叉,所以您不必担心全局和包。