gpt4 book ai didi

r - 识别是否在并行调用中

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

我有一个通用的分 block 函数,可以将大的调用分成较小的部分并并行运行。

chunk_it <- function(d, n, some_fun) {
# run n chunks of d in parallel
dat <- foreach(...) %doPar% {
some_fun(...)
}
}

我想让这个通用分 block 函数可以识别它是否被一个已经并行的进程调用(在我的术语中是分 block 的)

chunked_highlevel <- function(d, n, some_fun) {
# run n chunks of d in parallel
...
chunk_it(lowerlevel_d, n) # do not chunk!
}

我想在这里发生的是,如果我在更高级别对流程进行分 block ,它不会激活较低级别的分 block 功能。

有没有办法确定您何时已经在并行流程中?

所以,我们可以这样编码:

chunk_it <- function(d, n, some_fun) {
# run n chunks of d in parallel
if(!already_parallel) {
dat <- foreach(...) %doPar% {
some_fun(...)
}
} else {
dat <- some_fun()
}
}

最佳答案

我认为没有官方的方法可以做到这一点。但是,一般来说,调用堆栈中应该有明显的代码,这使得您是否在并行代码中变得显而易见。我到目前为止所得到的看起来像这样。它似乎适用于带有 MPI 或 SOCK 的 doSNOW,但可能需要针对实现 %dopar% 的其他包进行调整。它还依赖于 snow 的一些内部细节,这些细节可能会在未来的版本中发生变化。

library(doSNOW)
library(foreach)
my_fn <- function(bit) {
is_parallel <- any(unlist(lapply(sys.calls(), function(cal) {
as.character(cal[[1]]) %in% c("slaveLoop", "%dopar%")
})))
is_parallel
}

foreach(x = 1:2) %do% my_fn(x)
# [[1]]
# [1] FALSE
#
# [[2]]
# [1] FALSE

cl <- makeCluster(2)
registerDoSNOW()
foreach(x = 1:2) %dopar% my_fn(x)
# [[1]]
# [1] TRUE
#
# [[2]]
# [1] TRUE

关于r - 识别是否在并行调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42880188/

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