2012-09-15 1 views
2

패키지 parallelforeach() 기능으로 첫 걸음 만 내딛고 있습니다. 그러므로이 질문은 어리 석다. 이전 결과에 따라 for-loop 병렬 처리

간단한 예제가 될 것이다 다음 반복의 결과를 사용

  1. 객체 t
  2. 에 함수를 적용 :

    newFunc<-function(){ 
        test[i+1] <<- sqrt(test[i]) 
    } 
    
    test <- c(1,rep(NA, 10)) 
    
    foreach(i=1:11, .combine='rbind', .export='test')%do% newFunc() 
    

    그래서 여기 내 작업은 내가 fullfil 할의 이것은 물론 for-loop로서 나에게 하나의 벡터를 생성합니다.

    test <- c(1,rep(NA, 10)) 
    
    library(doParallel) 
    library(foreach) 
    cl <- makeCluster(4) 
    registerDoParallel(cl) 
    
    foreach(i=1:11, .combine='rbind', .export='test')%dopar% newFunc() 
    
    stopCluster(cl) 
    

    이 출력 c(1, NA, NA, NA, NA, ..., NA) 나를 잎 :이 parallelise하려고하면 그러나, 이것은 다른 결과를 얻을 수 있습니다. 내가 같아요 이것은 노예가 다른 기능의 결과를 모르기 때문에입니까? 필요한 정보를 제공했으면합니다. 내 실제 기능은 물론 더 복잡하지만,이 예제는 내 문제를 증명하는 가장 쉬운 방법으로 보였다.

    편집 : 제 생각에는 첫 번째 질문은 다음과 같습니다. 이러한 문제는 전혀 병렬 처리 될 수 있습니까?

+0

이해가 안됩니다. 반복의 각 단계가 이전 단계에 의존하면 병렬로 수행 할 수 없습니다. – Roland

+0

알았어. 내 질문에 이미 대답 한 것 같아! 고마워 – Seb

답변

2

그것은 병렬로 실행되지 않습니다 제기로 반복하지만,

test = numeric(11); test[] = 2 
test^(1/2^(0:10)) 

당신이 관심있는 솔루션입니다 것은 사실이다. 이것은 쉽게 (계산이 이미 벡터화되어 있기 때문에, 필요하지만) 병렬화하기 (당신이 <<-와 마찬가지로) 병렬 평가를 위해

fun = function(i, test) 
    test[i]^(1/2^(i - 1)) 
unlist(mclapply(seq_along(test), fun, test)) 

, fun가 아닌 지역 변수를 업데이트해야합니다. 어쩌면 실제 문제는 원래 공식에 순차적 평가가 필요한 것으로 보더라도 병렬로 평가할 수있는 방법으로 제기 될 수 있습니까?