R sys.child中的system.time和parallel包为0

时间:2017-03-22 22:24:58

标签: r parallel-processing profiling doparallel

我想在R中使用system.time来获取多核函数的总CPU时间。问题是system.time显然没有捕获并行包生成的子进程花费的CPU时间。

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

然后Timings看起来像这样

> 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 个答案:

答案 0 :(得分:0)

@ chinsoon12指出了我正确的方向。只有在registerDoParallel创建集群时才会填充user.child和sys.child,例如

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变量手动启动和停止集群。