doMC vs doSNOW vs doSMP vs doMPI:为什么'foreach'的各种并行后端功能不相同?

时间:2011-04-07 23:51:10

标签: r parallel-processing plyr domc

我已经在各种机器上运行了一些代码测试代码,总是具有相同的结果。我认为各种do ...包背后的哲学是它们可以互换地用作foreach的%dopar%的后端。为什么不是这样?

例如,此代码段有效:

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)

虽然这些代码段中的每一个都失败了:

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的不同之处是什么?

1 个答案:

答案 0 :(得分:31)

doMC分叉当前的R进程,因此它继承了所有现有的变量。所有其他后端只传递明确请求的变量。不幸的是我没有意识到这一点,并且仅用doMC进行了测试 - 这是我希望在下一版plyr中修复的内容。