2013-06-20 30 views
5

我有一个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),而在我的情况下这不是优选的;第二个循环只能帮助第一个代码的一部分。如果我错了,请纠正我。

谢谢。

+0

也许不是你想要的,但是你可以嵌套'foreach'表达式:http://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf。但是,我不知道在循环中招募更多的工人。 – ialm

+0

谢谢。但是,它似乎嵌套的foreach不适用于我的情况,因为它需要合并两个嵌套循环,而我需要一个内部循环,只调用一部分代码。我会更新这个问题来反映这一点。 – imriss

回答

6

在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包分叉,虽然只有四个执行内循环体:

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

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


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

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

当然,您需要小心,不要在单个节点上启动过多的进程。我发现这种嵌套有点尴尬,这导致了嵌套算子的发展。

+0

谢谢。我正在使用MOAB提交作业,因此我无法选择主机名。有没有最佳做法来设置MOAB请求中的节点和处理器数量,以避免处理器相关性?例如,在上面的第一个例子中,我应该问节点= 4; ppn = 8? – imriss

+0

@imriss你想使用MPI还是SOCK群集?如果MPI,您是使用Open MPI还是其他?你是否使用Torque作为Moab的资源经理? –

+0

msub脚本行以#PBS开头,因此我认为它是Torque/Moab。在当前的代码中,我使用doMC和foreach作为外部循环,而内部循环是串行的。我没有管理权限,但可以在我的主文件夹中安装软件包。谢谢。 – imriss