r - 允许 foreach worker 注册并分发子任务给其他 worker

标签 r foreach parallel-processing cluster-computing domc

我有一个 R 代码,它涉及多个 foreach 工作人员并行执行一些任务。为此,我正在使用 foreach 和 doMC。我想让每个 foreach 工作人员招募一些新工作人员并将其代码的某些部分(可并行化)分发给他们。

当前代码如下所示:

require(doMC)
require(foreach)
registerDoMC(cores = 8)

foreach (i = (1:8)) %dopar% {
<<some code here>>
    for (j in c(1:4))  {
    <<some other code here>>
    }
}

我正在寻找一个理想的代码,看起来像:
require(doMC)
require(foreach)
registerDoMC(cores = 8)

foreach (i = (1:8)) %dopar% {
<<some code here>>
    foreach (j = (1:4)) %dopar% {
    <<some other code here>>
    }
}

我看到了一个使用 doSNOW 和 doMC 的多范式并行的例子 here (https://www.rmetrics.org/files/Meielisalp2009/Presentations/Lewis.pdf#page=17) .但是,我不知道它是否符合我的要求。

还有,好像Nested foreach不适用,因为它需要合并两个循环 (see here) ,而在我的情况下,这不是首选;第二个循环只帮助第一个循环的一部分代码。如果我错了,请纠正我。

谢谢。

最佳答案

在 foreach 循环中使用 foreach 循环没有特别的问题。下面是 doSNOW 循环中的 doMC 循环示例:

library(doSNOW)
hosts <- c('host-1', 'host-2')
cl <- makeSOCKcluster(hosts)
registerDoSNOW(cl)
r <- foreach(i=1:4, .packages='doMC') %dopar% {
  registerDoMC(2)
  foreach(j=1:8, .combine='c') %dopar% {
    i * j
  }
}
stopCluster(cl)

对我来说,将 doMC 用于内部循环似乎很自然,但您可以随心所欲地进行。您也可以对两个循环使用 doSNOW,但是您需要在外部 foreach 循环内创建和停止雪簇。

下面是在 doMC 循环中使用 doMC 的示例:
library(doMC)
registerDoMC(2)
r <- foreach(i=1:2, .packages='doMC') %dopar% {
  ppid <- Sys.getpid()
  registerDoMC(2)
  foreach(j=1:2) %dopar% {
    c(ppid, Sys.getpid())
  }
}

结果表明,doMC 包总共 fork 了六个进程,尽管只有四个进程执行了内部循环的主体:
> r
[[1]]
[[1]][[1]]
[1] 14946 14949

[[1]][[2]]
[1] 14946 14951


[[2]]
[[2]][[1]]
[1] 14947 14948

[[2]][[2]]
[1] 14947 14950

当然,您需要注意不要在单个节点上启动太多进程。我发现这种嵌套有点尴尬,从而导致了嵌套运算符的发展。

关于r - 允许 foreach worker 注册并分发子任务给其他 worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17222942/

相关文章:

javascript - MDC 的 forEach 中的注释字符有什么作用?

visual-studio - 可以使用 ReSharper 将 'foreach' 转换为 'for' 循环,反之亦然?

perl - 如何并行运行 Test::Perl::Critic?

r - 如何将数据帧中的字符串单独复制N次

r - 如何在 R 中分组并选择最低值

r - 用于特征选择的 t-stat

iphone - 在 TableView 中使用 GCD 和加载缩略图时遇到问题

r - 循环以在 r 中使用相应的值来标记标记

c++ - 为什么 STL 算法 for_each 两次调用我的仿函数的析构函数?

c++ - OpenMP 4 中的任务依赖性