【问题标题】:Can I nest parallel:::parLapply()?我可以嵌套 parallel:::parLapply() 吗?
【发布时间】:2023-03-18 19:59:01
【问题描述】:

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

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

使用R的新包parallel,在四核机器上,我能做到以下几点吗?

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 附带的并行包可以做到这一点吗?

【问题讨论】:

    标签: r parallel-processing


    【解决方案1】:

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

    【讨论】:

    • 谢谢马库斯。我可以避免使用 mutlicore/mclapply() 使我的代码也可移植到 Windows 吗?
    • 我认为没有。或许你可以结合使用 SOCK 和 MPI!
    • 一些快速测试代码表明您的答案对于 SOCK 集群是正确的,但我不清楚为什么会这样(特别是如果外部正在制作自己的集群对象)。你知道吗? “他们”只是在保护我们免受自己的伤害吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 2015-03-15
    • 1970-01-01
    • 2012-03-16
    • 2014-06-26
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多