2017-03-22 32 views
0

我想在R中使用system.time來獲取多核功能的總CPU時間。問題是system.time顯然不能捕獲並行程序包產生的子進程的CPU時間消耗。system.time並行包在R sys.child是0

library(doParallel) cl <- makeCluster(2) registerDoParalllel(2) timings <- system.time(foreach(i = 1:2) %do% rnorm(1e8))

時序則看起來像這樣

> timings 
    user system elapsed 
16.883 5.731 22.899 

定時積少成多。現在,如果我使用並行處理:

timings <- system.time(foreach(i = 1:2) %dopar% rnorm(1e8))

> timings 
    user system elapsed 
    2.445 3.410 20.347 

的用戶和系統時間僅捕獲主進程。特別是看時間[4]和[5],我發現user.child和sys.child時間爲0.

在並行處理中,如何測量R中的總CPU時間?

注意:將羣集啓動代碼移到system.time調用中並沒有什麼區別。

> sessionInfo() 
R version 3.3.2 (2016-10-31) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Debian GNU/Linux 8 (jessie) 

other attached packages: 
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3  
+1

請查看'https:// www.r-bloggers.com/the-wonders-of-foreach /'。 'user.child'列可能是你正在尋找的 – chinsoon12

+0

你是對的,user.child欄是有趣的一欄。但在這種情況下它是0。我從你分享的鏈接中學到了什麼(謝謝!),並且自己測試了這一點,就是user.child和sys.child在使用doMC時填充,但在使用doParallel時(在PSOCK和FORK模式下都不會)填充。那麼這對於並行包來說是不可能的? – mlist

回答

0

@ chinsoon12指出我在正確的方向。 user.child和sys.child僅在registerDoParallel創建羣集時填充,例如,

registerDoParalllel(cores = 2) 
timings <- system.time(foreach(i = 1:2) %dopar% rnorm(1e8)) 

     user.self sys.self elapsed user.child sys.child 
timings  0.429 1.978 19.378  9.818  1.386 

這就是爲什麼它開箱即用的doMC,我沒有通過cl變量手動啓動和停止集羣。