2012-07-02 28 views
1

我有下面一段代碼,我想與DOMC引擎上運行:的foreach - dopar不啓動工人

who_wins<-function(probs_a,probs_b,delta_order=0,delta_down=0){ 
    #browser() 
    team_a<-runif(5,0,1) 
    team_b<-runif(5,0,1) 
    sya<-syb<-0 
    for(i in 1:5){ 
    for(j in 1:2){ 
     if(j==1){ 
     if(sya<syb){ 
      team_a[i]<-(1-delta_down)*team_a[i] 
     } 
     team_a[i]<-(1-(i-1)*delta_order)*team_a[i] 
     sya<-sya+(team_a[i]<probs_a[i]) 
     } 
     else{ 
     if(syb<sya){ 
      team_b[i]<-(1-delta_down)*team_b[i] 
     } 
     team_b[i]<-(1-(i-1)*delta_order)*team_b[i] 
     syb<-syb+(team_b[i]<probs_b[i]) 
     } 
    } 
    } 
    if(sya>syb){ 
    return(1) 
    } 
    else if(sya<syb){ 
    return(2) 
    } 
    else { 
    return(0) 
    } 
} 

library(doMC) 
registerDoMC(8) 

probs_a<-seq(.6,.8,length.out=5) 
probs_b<-probs_a[5:1] 
nsim<-20000 

results<-foreach(icount(nsim), .combine=c) %dopar% { 
    return(who_wins(probs_a,probs_b)) 
} 

的問題是,幾秒鐘的第一個工人開始之後,引擎試圖啓動剩餘的。我看到所有處理器都出現了高峯,但它們都快速死亡,即使是第一個也是如此。然後,啓動一個新進程,並通過這個單獨的工作人員運行其餘的代碼。

我已經嘗試過不同的代碼片段,引擎完美工作。但是對於這種特定的蘆丁,它並不是。

有人可以告訴我發生了什麼事嗎?提前致謝。

+0

我建議你包括了'who_wins'功能代碼,特別是如果它很簡單。然後其他人可以簡單地抓住你的代碼開始試驗和調查。 – MvG

+0

完成。 Thx的建議。 – jcredberry

回答

3

在循環內添加一個Sys.sleep(0.01),我看到所有8個進程都與這個進程「忙碌」。完成之後,主要過程仍會持續一段時間。我假設從單個進程收集數據並將其組合成單個結果的開銷與從並行化計算獲得的實際收益相似。如果您只是將「計算」更改爲return(1),您會發現這需要與計算時間一樣長,因此時間不會花在工作負載上,而是需要彙總結果。

既不.inorder=FALSE也不使用doParallel而不是doMC改變這一點。不過,我認爲這在foreach包一個問題,因爲mclapply有顯著較少的開銷:

result <- unlist(mclapply(1:nsim, function(i) { 
    return(who_wins(probs_a, probs_b)) 
}, mc.cores=8)) 
+0

謝謝MvG。無瑕的想法!我不知道foreach循環的開銷問題。 – jcredberry

+0

我也沒有。我正要成爲一個主要的'foreach'粉絲。你想把這個問題報告給'foreach'維護者嗎?也許他們可以對此做些事情。 – MvG

+0

我也是。我幾乎所有的東西都在使用。我只有電子郵件的文檔,你有其他嗎? – jcredberry

相關問題