c – std :: chrono ::时钟,硬件时钟和循环计数

std :: chrono提供几个时钟来测量时间.与此同时,我猜cpu可以评估时间的唯一方法是计算周期.

问题1:cpu或gpu是否有任何其他方式来评估时间而不是计算周期?

如果是这种情况,因为计算机计数循环的方式永远不会像原子钟一样精确,这意味着计算机的“秒”(句子=标准差=比率< 1>)实际上可能更短或更大比实际的秒,导致计算机时钟之间的长时间测量差异,让我们说GPS.

问题2:这是正确的吗?

某些硬件具有不同的频率(例如空闲模式和turbo模式).在这种情况下,这意味着周期数会在一秒钟内发生变化.

问题3:cpu和gpus测量的“循环计数”是否因硬件频率而异?如果是,那么std :: chrono如何处理呢?如果不是,循环对应什么(比如什么是“基本”时间)?有没有办法在编译时访问转换?有没有办法在运行时访问转换?

解决方法:

计算周期,是的,但周期是什么?

在现代的x86上,内核使用的时间源(内部以及clock_gettime和其他系统调用)通常是一个固定频率计数器,它计算“参考周期”,而不管turbo,省电或时钟停止空闲. (这是你从rdtsc获得的计数器,或__rdtsc() in C/C++).

正常的std :: chrono实现将在Unix上使用OS提供的函数,如clock_gettime. (在Linux上,这可以纯粹在用户空间中运行,内核映射到每个进程的地址空间的VDSO页面中的代码比例因子数据.低开销时间源很好.避免用户 – >内核 – >用户轮在启用Meltdown Spectre缓解的情况下,trip有很多帮助.)

分析不受内存限制的紧密循环可能需要使用实际核心时钟周期,因此它对当前核心的实际速度不敏感. (并且不必担心将CPU升级到最大涡轮增压等),例如使用perf stat ./a.out或perf record ./a.out.例如Can x86’s MOV really be “free”? Why can’t I reproduce this at all?

有些系统没有/没有内置于CPU的内存时钟等效计数器,因此操作系统会在RAM中维持一个时间,它会在定时器中断时更新,或者时间查询功能会读取时间从一个单独的芯片.

(系统调用硬件I / O =更高的开销,这是x86的rdtsc指令从分析事物变形为时钟源事物的部分原因.)

所有这些时钟频率最终都来自主板上的晶体振荡器.但是,正如@Tony指出的那样,可以调整从周期计数推断时间的比例因子,以使时钟与原子时间保持同步,通常使用网络时间协议(NTP).

上一篇:C++ 获取系统当前时间(日历时)


下一篇:利用matplotlib进行数据可视化