C ++:Linux中的时序(使用clock())不同步(由于OpenMP?)

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

我的计划报告:在45.86s完成

时间命令报告:实际0m22.837s用户0m45.735s sys 0m0.152s

使用我的手机计时,它在23秒完成(又名:“真正的”时间)。 “用户”时间是所有线程的总和,这在我使用OpenMP之后才有意义。 (您可以在这里阅读: ‘真实’,’用户’和’sys’在时间(1)的输出中是什么意思? )

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

作为旁注,Windows的clock()按预期工作,并在“实际”时间内报告。

用户0m45.735s

clock() )根据7.27.2.1测量所用过程的CPU时间(尽可能好)

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

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

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

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

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

我建议您在OpenMP应用程序内部进行基准测试时使用便携式OpenMP计时函数omp_get_wtime() ,该函数返回一个带有秒数的double值,因为过去有一些未指定的点。 调用它两次并减去返回值以获得经过的时间。 您可以通过调用omp_get_wtick()来了解精确的时间测量值。 它返回定时器分辨率的double值 – 接近0.0值表示更精确的定时器。