簡體   English   中英

如果 registerDoMC() 使用的數量大於核心數量,會發生什么情況?

[英]What happens if registerDoMC() is used with a number greater than the number of cores?

我正在使用帶有 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 年 7 月 22 日創建

這是如何解釋的? 如果我只有 4 個可用內核,那么 20 個作業如何在 1 秒內運行 + 一些開銷?

起初,我以為我registerDoMC()會為任何大於detectCores()東西返回錯誤,但由於它沒有並且我得到了這個令人驚訝的結果,我想我誤解了foreach引擎蓋下發生的事情。

由於底層操作系統是一個多任務操作系統,它運行的進程數量已經超過了可用內核數量。 這只是意味着您有更多的實例,並且無法從讓所有 R 子進程同時在一個核心中運行中受益。 通常,當您超過內核數時,隨着同時內核數的增加,整體性能的提高會下降,因此您的整體速度增益通常不值得付出努力。 此外,如果存在“大型數據”,則在進程之間傳輸數據的時間非常重要。

我的做法通常是做“ncores減1”,為基本的操作系統管理工作留下1個核心......盡管即使如此,我偶爾也會最大化並仍然看到好處。 因此,雖然使用比可用內核數更多的進程可能不會破壞任何東西,但我建議永遠不要超過它,您不太可能(在 R 中)看到這樣做的任何性能提升(並且可能會降低性能)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM