允许foreach工作人员向其他工作人员注册和分发子任务

imr*_*iss 5 parallel-processing foreach r 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>>
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个理想的代码,看起来像:

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

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

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

而且,似乎嵌套的foreach不适用,因为它需要合并两个循环(见这里),而在我的情况下,这不是首选; 第二个循环只能帮助第一个循环代码的一部分.如果我错了,请纠正我.

谢谢.

Ste*_*ton 7

在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)
Run Code Online (Sandbox Code Playgroud)

我觉得使用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())
  }
}
Run Code Online (Sandbox Code Playgroud)

结果表明,doMC包总共分叉了六个进程,尽管只有四个进程执行内部循环的主体:

> r
[[1]]
[[1]][[1]]
[1] 14946 14949

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


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

[[2]][[2]]
[1] 14947 14950
Run Code Online (Sandbox Code Playgroud)

当然,您需要注意不要在单个节点上启动太多进程.我发现这种嵌套有点尴尬,这导致了嵌套操作符的开发.