【问题标题】:mclapply user time larger than elapsed timemclapply 用户时间大于经过时间
【发布时间】:2013-09-06 20:49:04
【问题描述】:

我正在尝试在R 中使用parallel 包的mclapply 函数。该函数通过计算对数似然距离将值分配给序列矩阵 - 一个 CPU 密集型操作。

生成的 system.time 值令人困惑:

> system.time(mclapply(worksample,function(x){p_seqi_modj(x,worksample[[1]],c(1:17))}))
   user  system elapsed 
 29.339   1.242  18.581 

我认为elapsed 表示聚合时间(user+system)。在这种情况下,上述结果意味着什么?我应该定位到什么时间?我无与伦比的版本在user 中花费的时间更少,在elapsed 中花费的时间更多。

【问题讨论】:

  • 问题是你关心什么?大多数人希望尽快得到结果,这对应于经过的时间。

标签: r performance parallel-processing


【解决方案1】:

帮助页面?system.time 说函数返回的值是类proc_time 的对象,我们应该咨询?proc.time。在那里我们了解到用户时间是

cumulative sum of user and system times of any child processes

因此您的任务在每个内核上花费了大约 15 秒(mclapply 默认使用 2 个内核,请参阅 mc.cores 参数)。

其实前面我们在帮助页面看到proc.time()返回了5个元素将进程和子时间分开,而打印中使用的summary方法将用户和系统时间折叠成进程+子时间,所以有提供更多信息。

【讨论】:

  • 只是重申并确保我理解,这意味着经过的时间是从操作开始到结束实际经过的时间,而用户时间是所有花费时间的总和核心(在我的情况下为 2)。因此,如果我在 2 个内核上并行运行,每个内核花费 15 秒来完成任务(总共约 30 秒),但总耗时仅为 18 秒,这正是由于并行执行的任务所致。这是正确的吗?
  • 这个答案不正确,因为您错误地阅读了帮助文件。 proc.time()返回5个值,第4个和第5个值分别是“4:(用户的累计总和[任何子进程的时间])和5:(任何子进程的系统时间)”。
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多