每个工作者具有多个核心的并行化

时间:2018-03-22 19:06:40

标签: r parallel-processing parallel-foreach

如果有多个内核可用,某些R软件包具有可以并行工作的功能 - 例如,rstan软件包可以并行运行多个MCMC链。当我使用例如doSNOWforeach并行运行多个Stan进程时,我希望我的代码在两个级别并行运行*。取而代之的是,Stan流程被运到我的工作人员手中,并且似乎按顺序运行他们的链,好像一旦他们被分配到核心,他们就看不到机器的其他核心,并认为他们是单一的 - 核心机器。

有没有办法创建4核节点的集群,我可以将其传递给R中的某个并行化软件包,以便我可以从我的机器中获得最大的效率?

*说我有一台36核机器,9个Stan场景每个运行4个链。理想情况下,我有36个进程可以同时运行。现在,我一次使用9个内核,只要我希望它可以使用4倍。

1 个答案:

答案 0 :(得分:0)

假设您有充分的理由不直接创建36个并行工作程序 (例如,如果你有一个计算集群或类似的东西), 然后以下应该工作 (以doParallel为例):

library(doParallel)

# create "outer" workers
outer_workers <- makeCluster(2L)
# register outer_workers
registerDoParallel(outer_workers)

# create "inner" workers
clusterEvalQ(outer_workers, {
    library(doParallel)
    inner_workers <- makeCluster(2L)
    # register inner_workers
    registerDoParallel(inner_workers)

    NULL
})

# assuming you use foreach directly
foreach(i = 1L:2L) %dopar% {
    foreach(j = 1L:2L) %dopar% {
        # code
    }

    NULL
}

# stop inner workers
clusterEvalQ(outer_workers, {
    stopCluster(inner_workers)
    registerDoSEQ()
    NULL
})

stopCluster(outer_workers); registerDoSEQ()

此示例共创建4个进程, 2个外部和2个内部。 在您的示例中,您可以有9个外部进程和4个内部进程。