r - doMC vs doSNOW vs doSMP vs doMPI : why aren't the various parallel backends for 'foreach' functionally equivalent?

标签 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 有何不同?

最佳答案

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

关于r - doMC vs doSNOW vs doSMP vs doMPI : why aren't the various parallel backends for 'foreach' functionally equivalent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588914/

相关文章:

r - 多列比较

html - 如果 Leaflet 和 DT 小部件在 R 中另存为 HTML,为什么会显示黑屏?

r - 将大型(3.9 磨机 obs)data.frames 导出到文本文件的最有效方法?

c++ - 让奴隶在MPI中互相等待

R 示例 - ddply、ave 和合并

r - 让 match.call() 与 *apply 和 plyr 一起工作? (重新 : Referencing a dataframe recursively)

r - R 中 AR 模型选择的 auto.arima 和 ar 之间的区别

Haskell 推测并行执行

algorithm - 并行化霍夫变换算法的最佳方法是什么?

r - 从 ddply 函数中获取分组术语?