【问题标题】:C++: Timing in Linux (using clock()) is out of sync (due to OpenMP?)C++:Linux 中的计时(使用时钟())不同步(由于 OpenMP?)
【发布时间】:2012-11-01 07:55:27
【问题描述】:

在我的程序的顶部和末尾,我使用clock() 来计算我的程序需要多长时间才能完成。不幸的是,它的报告时间似乎只有一半。我用“时间”命令仔细检查了这一点。

我的程序报告: 45.86s 完成

时间命令报告: 真正的 0m22.837s 用户 0m45.735s 系统 0m0.152s

用我的手机计时,它在 23 秒内完成(又名:“真实”时间)。 “用户”时间是所有线程的总和,因为我使用的是 OpenMP,所以这很有意义。 (你可以在这里阅读:What do 'real', 'user' and 'sys' mean in the output of time(1)?

那么,为什么 clock() 在“用户”时间而不是“实时”时间报告?我应该使用不同的函数来计算我的程序运行了多长时间?

附带说明,Windows 的 clock() 按预期工作并“实时”报告。

【问题讨论】:

  • C++ 不属于问题的标题。而且,当您提出问题时,这与 C++ 没有太大关系。

标签: c++ c time openmp clock


【解决方案1】:

用户 0m45.735s

clock() 测量每个 7.27.2.1 进程使用的 CPU 时间(尽可能好)

clock 函数返回实现与程序使用的处理器时间的最佳近似值,因为该实现定义的时代开始时仅与程序调用相关。

而不是挂钟时间。因此,clock() 报告的时间接近于time 报告的user 时间是正常且符合标准的。

要测量经过的时间,如果可以假设 POSIX,使用 clock_gettime 可能是最好的选择,标准函数 time() 也可以用于此,但不是很细。

【讨论】:

  • 这与 OP 写的有什么不同?
  • 由于问题被标记为 C++,因此计时的一个选项是标准 C++ 库<chrono>,例如std::high_resolution_clockstd::steady_clock
【解决方案2】:

我建议clock_gettime 使用CLOCK_MONOTONIC 作为时钟。

根据您的特定系统,它应该提供接近微秒或更好的分辨率,并且如果(例如)有人在您的程序运行时设置系统时间,它不会做有趣的事情。

【讨论】:

    【解决方案3】:

    我建议您使用便携式 OpenMP 计时函数 omp_get_wtime() 在 OpenMP 应用程序中进行基准测试,它返回一个 double 值,其中包含自过去某个未指定时间点以来的秒数。调用它两次并减去返回值以获得经过的时间。您可以致电omp_get_wtick() 了解时间测量的精确度。它返回计时器分辨率的double 值 - 更接近0.0 的值表示更精确的计时器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-08
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      相关资源
      最近更新 更多