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

she*_*lih 2 parallel-processing foreach multithreading r

这就是令我困惑的事情:

当您根据内容安排一系列内容同质但在处理时间(事先未知)方面异质的任务时,foreach如何按顺序处理这些令人尴尬的并行任务?

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

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

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

Ste*_*ton 5

所述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% {
    # ...
}
Run Code Online (Sandbox Code Playgroud)

这将导致doMC使用该mc.preschedule=FALSE选项调用mclapply,以便在完成上一个任务时将任务分配给工作人员,这自然是负载平衡.