R foreach循环中的负载平衡
load-balancing in R foreach loops
有没有办法修改 R foreach 循环如何与 doParallel 后端进行负载平衡?当并行化具有非常不同的执行时间的任务时,可能会发生除一个节点之外的所有节点都已完成其任务而最后一个节点仍有多个任务要做的情况。这是一个玩具示例:
library(foreach)
library(doParallel)
registerDoParallel(4)
waittime = c(10,1,1,1,10,1,1,1,10,1,1,1,10,1,1,1)
w = iter(waittime)
foreach(i=w) %dopar% {
message(paste("waiting",i, "on",Sys.getpid()))
Sys.sleep(i)
}
基本上,代码注册了4个核心。对于每个循环 i
,任务是等待 waittime[i]
秒。但是,由于 foreach 循环中的负载平衡似乎默认情况下将任务总数拆分为长度为已注册核心数的集合,因此在上面的示例中,第一个核心接收所有任务 waittime
= 10,而其他 3 个接收 waittime
= 1 的任务,这样这 3 个核心将在第一个完成第一个任务之前完成所有任务。
有没有办法让 foreach()
一次分配一个任务?即在上述情况下,我希望前 4 个任务分布在 4 个核心中,然后每个下一个任务分布到下一个可用的核心。
谢谢。
很抱歉发帖作为回答,但我没有足够的代表发表评论。您是否可以重写代码以使用 parLapplyLB 或 parSapplyLB?
parLapplyLB, parSapplyLB are load-balancing versions, intended for use when applying FUN to different elements of X takes quite variable amounts of time, and either the function is deterministic or reproducible results are not required.
我自己没有测试过,但是 doParallel
后端提供了一个 preschedule
选项,类似于 mclapply()
中的 mc.preschedule
参数。 (参见 doParallel vignette 的第 7 节。)
你可以试试:
mcoptions <- list(preschedule = FALSE)
foreach(i = w, .options.multicore = mcoptions)
有没有办法修改 R foreach 循环如何与 doParallel 后端进行负载平衡?当并行化具有非常不同的执行时间的任务时,可能会发生除一个节点之外的所有节点都已完成其任务而最后一个节点仍有多个任务要做的情况。这是一个玩具示例:
library(foreach)
library(doParallel)
registerDoParallel(4)
waittime = c(10,1,1,1,10,1,1,1,10,1,1,1,10,1,1,1)
w = iter(waittime)
foreach(i=w) %dopar% {
message(paste("waiting",i, "on",Sys.getpid()))
Sys.sleep(i)
}
基本上,代码注册了4个核心。对于每个循环 i
,任务是等待 waittime[i]
秒。但是,由于 foreach 循环中的负载平衡似乎默认情况下将任务总数拆分为长度为已注册核心数的集合,因此在上面的示例中,第一个核心接收所有任务 waittime
= 10,而其他 3 个接收 waittime
= 1 的任务,这样这 3 个核心将在第一个完成第一个任务之前完成所有任务。
有没有办法让 foreach()
一次分配一个任务?即在上述情况下,我希望前 4 个任务分布在 4 个核心中,然后每个下一个任务分布到下一个可用的核心。
谢谢。
很抱歉发帖作为回答,但我没有足够的代表发表评论。您是否可以重写代码以使用 parLapplyLB 或 parSapplyLB?
parLapplyLB, parSapplyLB are load-balancing versions, intended for use when applying FUN to different elements of X takes quite variable amounts of time, and either the function is deterministic or reproducible results are not required.
我自己没有测试过,但是 doParallel
后端提供了一个 preschedule
选项,类似于 mclapply()
中的 mc.preschedule
参数。 (参见 doParallel vignette 的第 7 节。)
你可以试试:
mcoptions <- list(preschedule = FALSE)
foreach(i = w, .options.multicore = mcoptions)