2011-12-07 82 views
7

假設我想做R中的東西,通常會(在一個進程/線程)是這樣的:我可以並行嵌套::: parLapply()嗎?

for(i in 1:2) { 
    for(j in 1:2) { 
     #Do some stuff here 
    } 
} 

基於R的新包裝的同時,四核的機器上,我可以做以下?

cluster<-makeCluster(4) 

innerLoop<-function() { 
    #Do some stuff here 
} 

outerLoop<-function() { 
    result<-do.call(, parLapply(cluster, c(1:2), innerLoop)) 
} 

final.result<-do.call(, parLapply(cluster, c(1:2), outerLoop)) 

使用R-2.14.0附帶的並行程序包可能嗎?

+4

如果你嘗試它會發生什麼? – Andrie

回答

9

是的,你可以做到這一點。對於第一級並行化,您必須使用分佈式內存技術(如snow package中的makeCluster()),而在第二級並行化中,您必須使用共享內存技術(多核程序包mclapply())。

下面是一個簡單的代碼示例:

library(parallel) 

cl <- makeCluster(2) 

inner <- function(x){ 
    pid <- Sys.getpid() 
    name <- Sys.info()["nodename"] 
    str <- paste("This is R running on", name, "with PID", pid, "!") 
    return(str) 
} 

outer <- function(x, cores, funceval){ 
    require(parallel) 
    mclapply(1:cores, funceval) 
} 

parLapply(cl, 1:length(cl), outer, 2, inner) 

在輸出中,你會看到不同的機器名稱和不同的PID!

+0

感謝Markus。我可以避免使用mutlicore/mclapply()將我的代碼移植到Windows中嗎? – power

+0

我覺得沒有。可能你可以組合使用SOCK和MPI! –

+0

一些快速測試代碼顯示你的答案對於SOCK羣集是正確的,但我不清楚它爲什麼可能是這樣(特別是如果outer正在使自己的羣集對象工作)。你知道嗎?他們只是在保護我們自己嗎? – russellpierce