doParallel,集群与核心

doParallel, cluster vs cores

使用 doParallel 包时 registerDoParallel 中的集群和核心有什么区别?

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

cl <- makeCluster(4)
registerDoParallel(cl)    

registerDoParallel(cores = 4)

我看到的唯一区别是 makeCluster() 必须使用 stopCluster() 显式停止。

是的,从软件的角度来看是正确的。

on single machine these are interchangeable and I will get same results.


要清楚地理解'cluster'和'cores',我建议从'hardware'和'software'的层面去思考。

在硬件级别,'cluster' 表示可以通过套接字等通信方式协同工作的网络连接机器(需要更多 init/stop 操作,如 stopCluster 您指出的那样)。虽然 'cores' 表示本地 CPU 中的多个硬件核心,并且它们通常通过共享内存协同工作(不需要显式地从 A 向 B 发送消息)。

在软件层面,有时候clustercores的界限不是很清楚。该程序可以 运行 本地内核或远程集群,并且 high-level 软件不需要知道细节。因此,我们可以混合使用两种模式,例如在本地使用显式通信作为在一台机器上设置 cl, 每台远程机器也可以 运行 多核。


回到你的问题,设置clcores是否相等?

从软件上看,程序会运行乘以clients/servers相同的次数,然后得到相同的结果。

从硬件上看,可能有所不同。 cl表示显式通信,cores共享内存,但是如果high-level软件优化的很好。在本地机器上,这两个设置将进入同一个流程。我现在doParallel研究的不是很深,所以不太确定这两个是不是一样。

但在实践中,单机指定cores,集群指定cl更好

希望对您有所帮助。

我认为选择的答案太笼统而且实际上不准确,因为它没有触及 doParallel 包本身的细节。如果你看了小插曲,其实很清楚。

The parallel package is essentially a merger of the multicore package, which was written by Simon Urbanek, and the snow package, which was written by Luke Tierney and others. The multicore functionality supports multiple workers only on those operating systems that support the fork system call; this excludes Windows. By default, doParallel uses multicore functionality on Unix-like systems and snow functionality on Windows.

We will use snow-like functionality in this vignette, so we start by loading the package and starting a cluster

To use multicore-like functionality, we would specify the number of cores to use instead

总之,这取决于系统。 Cluster 是覆盖所有平台的更通用的模式,cores 仅适用于 unix-like 系统。

为使界面一致,包对这两种模式使用相同的功能。

> 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)

即它在后台 R 会话中设置了四个 ("PSOCK") 工作人员 运行。然后,%dopar% 将基本上利用 parallel::parLapply() 机器。使用此设置,您不必担心全局变量和包附加到每个工作人员上。

然而,在非Windows机器上,

doParallel::registerDoParallel(4)

结果将是 %dopar% 将利用 parallel::mclapply() 机制,而后者又依赖于 forked 进程。由于使用了 fork,您不必担心全局和包。