Подтвердить что ты не робот

DoMC vs doSNOW vs doSMP vs doMPI: почему не параллельные параллельные базы для "foreach" функционально эквивалентны?

У меня есть несколько тестовых фрагментов кода, которые я запускал на разных машинах, всегда с одинаковыми результатами. Я думал, что философия, лежащая в основе различных пакетов..., заключалась в том, что их можно было использовать взаимозаменяемо в качестве бэкэнда для 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?

4b9b3361

Ответ 1

doMC вызывает текущий процесс R, поэтому он наследует все существующие переменные. Все остальные бэкенды передают только явно запрошенные переменные. К сожалению, я этого не осознавал и тестировал только с помощью doMC - это то, что я надеюсь исправить в следующей версии plyr.