首页 > 解决方案 > 如果 registerDoMC() 与大于内核数的数字一起使用会发生什么?

问题描述

我正在使用具有 4 核 CPU 的笔记本电脑,但不知何故使用registerDoMC(20)似乎可以工作,就好像我有 20 个内核可用:

library(tictoc)
library(doMC)

detectCores()
#> [1] 4

registerDoMC(20)
tic()
a <- foreach(i = 1:20) %dopar% {
  Sys.sleep(1)
  i
}
toc()
#> 1.084 sec elapsed

reprex 包(v0.3.0)于 2019-07-22 创建

这是如何解释的?如果我只有 4 个内核可用,那么 20 个作业如何在 1 秒内运行 + 一些开销?

起初,我以为我registerDoMC()会为大于 的任何东西返回一个错误detectCores(),但由于它没有并且我得到了这个令人惊讶的结果,我想我误解了foreach.

标签: rforeachparallel-processing

解决方案


因为底层操作系统是一个多任务操作系统,它运行的进程已经比可用的内核多得多。这只是意味着您有更多实例,并且无法从同时在核心中运行的所有 R 子进程中受益。通常,当您超过核心数量时,随着同时核心数量的增加,整体性能的提高会下降,因此您在 ncores 之上的整体速度增益通常不值得付出努力。此外,如果存在“大型数据”,则在进程之间传输数据的时间非常重要。

我的做法通常是做“ncores 减 1”,将 1 个核心用于基本的操作系统管理工作……尽管如此,我偶尔也会用尽并且仍然看到好处。因此,虽然您可能不会通过使用比可用内核更多的进程来破坏任何东西,但我建议永远不要超过它,您不太可能(在 R 中)看到这样做带来的任何性能提升(并且可能会降低性能)。


推荐阅读