2011-12-07 55 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