doMC vs doSNOW vs doSMP vs doMPI: ¿por qué los distintos backends paralelos para ''foreach'' son funcionalmente equivalentes?
parallel-processing plyr (1)
Tengo algunas piezas de código de prueba que he estado ejecutando en varias máquinas, siempre con los mismos resultados. Pensé que la filosofía detrás de los diversos paquetes de hacer ... era que podían usarse indistintamente como backend para el% dopar% de foreach. ¿Por qué este no es el caso?
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 falla:
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 el mismo resultado exacto, así que sé que tengo los paquetes instalados y funcionando correctamente en cada máquina I los he probado en
¿Qué hace doMC diferente a doSMP, doSNOW y doMPI?
doMC
bifurca el proceso R actual para que herede todas las variables existentes. Todos los demás backends solo pasan las variables solicitadas explícitamente. Desafortunadamente, no me di cuenta de eso, y solo lo probé con doMC
, esto es algo que espero solucionar en la próxima versión de plyr.