2011-04-07 17 views
28

Tengo algunas piezas de prueba de código que he estado ejecutando en varias máquinas, siempre con los mismos resultados. Pensé que la filosofía detrás de los diversos paquetes do ... era que podían usarse indistintamente como un backend para el%% dopar de foreach. ¿Por qué no es este el caso?doMC vs doSNOW vs doSMP vs doMPI: ¿por qué los diversos backends paralelos para 'foreach' no son funcionalmente equivalentes?

Por ejemplo, este fragmento de código funciona:

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) 

Si bien cada uno de estos fragmentos de código fallan:

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) 

En los cuatro casos, foreach(i = 1:3,.combine = "c") %dopar% {sqrt(i)} produce exactamente el mismo resultado, por lo que sé que tener los paquetes instalados y funcionando correctamente en cada máquina en la que los he probado.

¿Qué hace doMC de manera diferente a doSMP, doSNOW y doMPI?

Respuesta

31

doMC divide el proceso actual en R, por lo que hereda todas las variables existentes. Todos los otros backends solo pasan variables explícitamente solicitadas. Desafortunadamente no me di cuenta, y solo probé con doMC; esto es algo que espero solucionar en la próxima versión de plyr.

+11

¿Deseas actualizar esta respuesta todavía? –

Cuestiones relacionadas