并行化R中的异构任务:foreach,doMC,doParallel

时间:2016-11-13 21:03:16

标签: r multithreading foreach parallel-processing

这就是令我困惑的事情:

当您使用foreach计划一系列内容相同但在处理时间(事前未知)方面异质的任务时,foreach如何按顺序处理这些令人尴尬的并行任务?

例如,我注册了4个帖子registerDoMC(cores=4),我有10个任务,第4个和第5个每个结果比其他所有组合更长。然后第一批显然是第1,第2,第3和第4批。当完成第1,第2和第3次时,foreach如何按顺序分配其他任务?这是随机的(从我的观察来看似乎如此)?如果事实证明某些任务需要花费更长的时间来处理,那么加速的好方法是什么?

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

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

1 个答案:

答案 0 :(得分:5)

doMC包是mclapply的包装器,默认情况下是mclapply 预先计划任务,这意味着它将任务分成组或。扭曲是它预先安排这些任务循环。因此,如果您有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,以便在完成上一个自然负载平衡的任务时将任务分配给工作人员。