2013-06-20 67 views
5

我有一個R代碼,涉及多個foreach工作人員並行執行一些任務。爲此,我正在使用foreach和doMC。我想讓每一個這些foreach工作人員招募一些新的工作人員,並將他們可以並行化的部分代碼分發給他們。允許每個工作人員註冊並將子任務分配給其他工作人員

當前的代碼如下所示:

require(doMC) 
require(foreach) 
registerDoMC(cores = 8) 

foreach (i = (1:8)) %dopar% { 
<<some code here>> 
    for (j in c(1:4)) { 
    <<some other code here>> 
    } 
} 

我正在尋找一個理想的代碼看起來像:

require(doMC) 
require(foreach) 
registerDoMC(cores = 8) 

foreach (i = (1:8)) %dopar% { 
<<some code here>> 
    foreach (j = (1:4)) %dopar% { 
    <<some other code here>> 
    } 
} 

我看到使用doSNOW和DOMC here (https://www.rmetrics.org/files/Meielisalp2009/Presentations/Lewis.pdf#page=17)多範型並行的例子。但是,我不知道它是否滿足我的要求。

另外,它似乎Nested foreach不適用,因爲它需要合併兩個循環(see here),而在我的情況下這不是優選的;第二個循環只能幫助第一個代碼的一部分。如果我錯了,請糾正我。

謝謝。

+0

也許不是你想要的,但是你可以嵌套'foreach'表達式:http://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf。但是,我不知道在循環中招募更多的工人。 – ialm

+0

謝謝。但是,它似乎嵌套的foreach不適用於我的情況,因爲它需要合併兩個嵌套循環,而我需要一個內部循環,只調用一部分代碼。我會更新這個問題來反映這一點。 – imriss

回答

6

在foreach循環中有一個foreach循環沒有特別的問題。這裏有一個doSNOW環路內DOMC循環的示例:

library(doSNOW) 
hosts <- c('host-1', 'host-2') 
cl <- makeSOCKcluster(hosts) 
registerDoSNOW(cl) 
r <- foreach(i=1:4, .packages='doMC') %dopar% { 
    registerDoMC(2) 
    foreach(j=1:8, .combine='c') %dopar% { 
    i * j 
    } 
} 
stopCluster(cl) 

它很自然地我使用DOMC爲內循環,但你可以做到任何你想要的。你也可以在兩個循環中使用doSNOW,但是你需要創建並停止外部foreach循環中的積雪簇。

下面是使用DOMC一個DOMC循環內的一個示例:

library(doMC) 
registerDoMC(2) 
r <- foreach(i=1:2, .packages='doMC') %dopar% { 
    ppid <- Sys.getpid() 
    registerDoMC(2) 
    foreach(j=1:2) %dopar% { 
    c(ppid, Sys.getpid()) 
    } 
} 

的結果表明,總共六個過程的由DOMC包分叉,雖然只有四個執行內循環體:

> r 
[[1]] 
[[1]][[1]] 
[1] 14946 14949 

[[1]][[2]] 
[1] 14946 14951 


[[2]] 
[[2]][[1]] 
[1] 14947 14948 

[[2]][[2]] 
[1] 14947 14950 

當然,您需要小心,不要在單個節點上啓動過多的進程。我發現這種嵌套有點尷尬,這導致了嵌套算子的發展。

+0

謝謝。我正在使用MOAB提交作業,因此我無法選擇主機名。有沒有最佳做法來設置MOAB請求中的節點和處理器數量,以避免處理器相關性?例如,在上面的第一個例子中,我應該問節點= 4; ppn = 8? – imriss

+0

@imriss你想使用MPI還是SOCK羣集?如果MPI,您是使用Open MPI還是其他?你是否使用Torque作爲Moab的資源經理? –

+0

msub腳本行以#PBS開頭,因此我認爲它是Torque/Moab。在當前的代碼中,我使用doMC和foreach作爲外部循環,而內部循環是串行的。我沒有管理權限,但可以在我的主文件夾中安裝軟件包。謝謝。 – imriss