【问题标题】:parallelizing heterogenous tasks in R: foreach, doMC, doParallel在 R 中并行化异构任务:foreach、doMC、doParallel
【发布时间】:2016-11-13 21:03:16
【问题描述】:

让我困惑的是:

当您使用 foreach 调度内容同质但处理时间不同(事前未知)的任务序列时,foreach 究竟是如何顺序处理这些令人尴尬的并行任务的?

例如,我注册了 4 个线程 registerDoMC(cores=4),我有 10 个任务,结果第 4 和第 5 个任务都比其他所有任务的总和更长。那么第一批显然是第1,第2,第3和第4。 1、2、3完成后,foreach究竟是如何依次分配其他任务的呢?那是随机的(从我的观察看来是这样)?如果事实证明某些任务需要更长的时间来处理,那么加快速度的好做法是什么?

很抱歉没有提供具体示例,因为我的实际项目/代码涉及更多...

非常感谢任何经验/指导/指针!

【问题讨论】:

  • 如果我没记错的话,它会拆分任务并将它们发送到实例进行处理。例如。任务向量 1:6 将被分成 1,2,3 和 4,5,6 并发送给两个工人。如果使用负载平衡,这可能会超出窗口并且以不同的方式进行调度。希望有人能够插话并提供更完整的答案。

标签: r multithreading foreach parallel-processing


【解决方案1】:

doMC 包是 mclapply 的包装器,默认情况下 mclapply preschedules 任务,这意味着它将任务分成组或。不同之处在于它预先安排了这些任务循环。因此,如果您有 10 个任务和 4 个工作人员,则任务将分配如下:

  • 工人 1:任务 1、5、9
  • 工人 2:任务 2、6、10
  • 工人 3:任务 3、7
  • 工人 4:任务 4、8

如果幸运的话,即使任务的长度非常不同,这也会提供合理的性能,但是您可以在 doMC 中禁用预调度,如下所示:

opts <- list(preschedule=FALSE)
results <- foreach(i=1:10, .options.multicore=opts) %dopar% {
    # ...
}

这将导致 doMC 使用 mc.preschedule=FALSE 选项调用 mclapply,以便在工作人员完成之前的自然负载平衡任务时将任务分配给他们。

【讨论】:

  • 似乎mc.preschedule=FALSE 是最常用的。为什么这不是默认设置?
  • @ctbrown 我不知道 Simon Urbanek 在编写 mclapply 时的推理是什么,但预调度对于小任务确实非常有效,而且负载平衡通常是不必要的。循环调度倾向于避免增加或减少计算时间的任务的问题。在实践中,这种选择似乎效果很好。
猜你喜欢
  • 2015-05-13
  • 2016-10-08
  • 2016-05-09
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多