2016-07-08 4 views
0

다음 코드 조각은 매우 쉽게 실행될 수 있습니다. 순차 모드에서는 1 초 이내에 실행됩니다. 그러나 내가 평행하게 만들 때 그것은 영원히 달리는 것처럼 보입니다. 벡터 길이를 100으로 설정하면 코드가 잘 실행되어 구조적 문제로 생각하지 않습니다.다음 코드의 병렬 처리가 너무 많이 실행되는 이유는 무엇입니까?

library(foreach) 
    library(doParallel) 
    cl <- makeCluster(4) 
    registerDoParallel(cl) 
    bvec <-as.vector(1:1e3) 
    avec <-as.vector(1:1e3) 
    sim= function(x,y) 10*x+y 
    system.time(x <- 
     foreach(b=bvec, .combine='cbind') %:% 
     foreach(a=avec, .combine='c') %dopar% { 
     sim(a, b) 
     }) 

캐치 란 무엇입니까? 감사드립니다.

+0

좀 자세히 설명해 주시겠습니까? – Theoden

+0

컴퓨터가없고 계산이 필요하다고 상상해보십시오. 계산의 일부를하도록 요청하는 3 개의 친구 편지를 보내면, 그들은 결과를 보내고 결과를 다시 보내고 모두 함께 넣습니다. 각 계산에 많은 시간이 소요되는 경우 메일을 기다려야 할 때라도 효율적입니다. 그러나 계산의 각 부분이 매우 단순하다면 자신을 수행하는 것이 더 빠를 것입니다. – Gregor

+0

예를 들어, 각 계산에 1 달이 걸리면 혼자서 4 개월이 걸릴 것입니다. 그러나 메일에 대해 4 일을 기다리는 경우에도 1 개월이고 친구들과 4 일을 기다리는 경우가 훨씬 더 효율적입니다. 그러나 각 계산에 1 시간이 걸리면 자신의 4 시간 또는 친구와 4 시간 + 1 시간에 계산을 수행 할 수 있습니다. 메일을 기다리는 중 속도가 느려집니다. – Gregor

답변

1

병렬 처리에는 상당한 오버 헤드가 필요합니다. 'sim'함수가 계산 상 저렴하기 때문에 오버 헤드 비용이 'sim'을 병렬로 실행함으로써 얻을 수있는 성능상의 이점을 압도합니다. 따라서 더 큰 벡터 길이로 예상되는 결과를 얻을 수 있습니다.

관련 문제