1

我想在 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
   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    
4

1 回答 1

1

@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

这就是为什么它在我没有通过 cl 变量手动启动和停止集群的情况下使用 doMC 开箱即用的原因。

于 2017-03-23T08:40:11.520 回答