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
值表示更精确的定时器。