【问题标题】:doMC vs doSNOW vs doSMP vs doMPI: why aren't the various parallel backends for 'foreach' functionally equivalent?doMC vs doSNOW vs doSMP vs doMPI:为什么'foreach'的各种并行后端在功能上不等效?
【发布时间】:2011-08-01 03:04:29
【问题描述】:

我有几段测试代码,我一直在不同的机器上运行,总是得到相同的结果。我认为各种 do... 软件包背后的理念是它们可以互换用作 foreach 的 %dopar% 的后端。为什么不是这样?

例如,这段代码 sn -p 有效:

library(plyr)
library(doMC)
registerDoMC()
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE)

虽然这些代码 sn-ps 都失败了:

library(plyr)
library(doSMP)
workers <- startWorkers(2)
registerDoSMP(workers)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE) 
stopWorkers(workers)

library(plyr)
library(snow)
library(doSNOW)
cl <- makeCluster(2, type = "SOCK")
registerDoSNOW(cl)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE) 
stopCluster(cl)

library(plyr)
library(doMPI)
cl <- startMPIcluster(count = 2)
registerDoMPI(cl)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE) 
closeCluster(cl)

在所有四种情况下,foreach(i = 1:3,.combine = "c") %dopar% {sqrt(i)} 产生完全相同的结果,所以我知道我已经安装了这些软件包,并且在我测试过的每台机器上都可以正常工作。

doMC 与 doSMP、doSNOW 和 doMPI 有何不同?

【问题讨论】:

    标签: r parallel-processing plyr domc


    【解决方案1】:

    doMC fork 当前的 R 进程,因此它继承了所有现有的变量。所有其他 do 后端仅传递显式请求的变量。不幸的是,我没有意识到这一点,只使用doMC 进行了测试——这是我希望在下一版本的 plyr 中修复的问题。

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 2018-04-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2015-08-12
      相关资源
      最近更新 更多