我可以嵌套并行::: parLapply()吗?

时间:2011-12-07 09:41:43

标签: r parallel-processing

假设我想在R中做一些通常(在一个进程/线程中)看起来像这样的东西:

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附带的并行包?

1 个答案:

答案 0 :(得分:10)

是的,你可以这样做。对于第一级并行化,您必须使用分布式内存技术(如雪包中的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!