gpt4 book ai didi

r - 给定条件并行或顺序执行 foreach 循环

转载 作者:行者123 更新时间:2023-12-02 04:54:06 25 4
gpt4 key购买 nike

我经常会遇到几个嵌套的 foreach 循环,有时在编写通用函数(例如,对于包)时,没有明显可以并行化的级别。有什么方法可以实现下面的模型所描述的内容吗?

foreach(i = 1:I) %if(I < J) `do` else `dopar`% {
foreach(j = 1:J) %if(I >= J) `do` else `dopar`% {
# Do stuff
}
}

此外,是否有某种方法可以检测并行后端是否已注册,以便我可以避免收到不必要的警告消息?这在 CRAN 提交之前检查包时非常有用,并且不会打扰在单核计算机上运行 R 的用户。

foreach(i=1:I) %if(is.parallel.backend.registered()) `dopar` else `do`% {
# Do stuff
}

感谢您的宝贵时间。

编辑:非常感谢您对核心和工作人员的所有反馈,您是对的,处理上述示例的最佳方法是重新考虑整个设置。与 triu 想法相比,我更喜欢下面的内容,但本质上是相同的。当然也可以像 Joris 建议的那样通过并行 tapply 来完成。

ij <- expand.grid(i=1:I, j=1:J)
foreach(i=ij$I, j=ij$J) %dopar% {
myFuction(i, j)
}

但是,在我试图简化引发该帖子的情况时,我遗漏了一些关键细节。想象一下,我有两个函数 analysisbatch.analysis,并且并行化的最佳级别可能会有所不同,具体取决于 n.replicates 的值和n.time.points

analyse <- function(x, y, n.replicates=1000){
foreach(r = 1:n.replicates) %do% {
# Do stuff with x and y
}
}
batch.analyse <- function(x, y, n.replicates=10, n.time.points=1000){
foreach(tp = 1:time.points) %do% {
my.y <- my.func(y, tp)
analyse(x, my.y, n.replicates)
}
}

如果n.time.points > n.replicates,则在batch.analysis中并行化是有意义的,但否则在analysis<中并行化更有意义。关于如何解决它有什么想法吗?是否可以在analysis中检测并行化是否已经发生?

最佳答案

您提出的问题是 foreach 嵌套运算符“%:%”的动机。如果内部循环的主体需要大量的计算时间,那么您可以非常安全地使用:

foreach(i = 1:I) %:%
foreach(j = 1:J) %dopar% {
# Do stuff
}

这会“展开”嵌套循环,从而产生可以并行执行的 (I * J) 个任务。

如果内循环的主体不需要太多时间,则解决方案会更困难。标准解决方案是并行化外循环,但这仍然可能导致许多小任务(当 I 很大而 J 很小时)或一些大任务(当 I 很小而 J 很大时)。

我最喜欢的解决方案是将嵌套运算符与任务分块结合使用。以下是使用 doMPI 后端的完整示例:

library(doMPI)
cl <- startMPIcluster()
registerDoMPI(cl)
I <- 100; J <- 2
opt <- list(chunkSize=10)
foreach(i = 1:I, .combine='cbind', .options.mpi=opt) %:%
foreach(j = 1:J, .combine='c') %dopar% {
(i * j)
}
closeCluster(cl)

这会产生 20 个“任务 block ”,每个任务 block 由 10 次循环体计算组成。如果您想为每个工作人员分配一个任务 block ,您可以将 block 大小计算为:

cs <- ceiling((I * J) / getDoParWorkers())
opt <- list(chunkSize=cs)

不幸的是,并非所有并行后端都支持任务分块。另外,doMPI 不支持 Windows。

有关此主题的更多信息,请参阅 foreach 包中我的小插图“嵌套 Foreach 循环”:

library(foreach)
vignette('nesting')

关于r - 给定条件并行或顺序执行 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6872077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com