2011-04-07 4 views
28

필자는 다양한 기계에서 실행 해 본 코드의 테스트 피스를 몇 개 가지고 있는데, 항상 동일한 결과가 나타납니다. 나는 다양한 방법들 뒤에있는 철학이 foreach의 % dopar %에 대한 백엔드로 상호 교환 적으로 사용될 수 있다고 생각했다. 왜 이것이 사실이 아닌가? 이 코드 조각의 각이 실패하는 동안doMC 대 doSNOW 대 doSMP : 'foreach'의 다양한 병렬 백엔드가 기능적으로 동일한 이유는 무엇입니까?

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와 다른 점이 있습니까?

답변

31

doMC은 현재 R 프로세스를 분기하여 모든 기존 변수를 상속합니다. 다른 모든 백엔드는 명시 적으로 요청 된 변수 만 전달합니다. 불행히도 나는 그것을 깨닫지 못했고, 단지 doMC으로 테스트했습니다 - 이것은 plyr의 다음 버전에서 수정하기를 희망합니다.

+11

이 답변을 아직 업데이트 하시겠습니까? –