来自std :: chrono的时钟可以在不同的核心上有所不同

时间:2017-06-05 13:31:04

标签: c++ multicore chrono

我喜欢比较来自time_point的{​​{1}}来自在处理器中不同内核上运行的线程中测量的内容。是否存在显着差异,例如滞后或更快/更慢的时钟?标准规定了什么?

2 个答案:

答案 0 :(得分:4)

std时钟没有处理器亲和力,事实上,大多数线程都没有。来自同一线程的两个时钟测量很可能是在不同的核心上进行的。

在与测量相关的超前和滞后 - 这与任何其他指令的执行没有区别;通常的管道等可能会产生影响,但我不认为这是有害的。如果它可能是有害的,您可能需要考虑其他工具,例如某些专门的平台计时工具或某种CPU特定指令。

答案 1 :(得分:3)

我将根据您在' Intel CPU 上运行此操作的评论来具体回答此问题。

我还要强调,这可能是一个备受争议的讨论,因为这非常依赖于CPU和主板。 '现代'可以是一个非常流畅的概念:)

一般说来

现代'英特尔CPU已经采用了一些机制来确保核心之间的统一滴答。但是,运行的操作系统也很重要。例如,一些Linux内核将使用时间戳计数器作为其源,因为较少的开销并且回退到(现代)高精度事件计时器,该计时器试图使核心上的时钟滴答均匀。

另外,请记住,Intel CPU有许多可影响CPU时钟频率的功耗实用程序。

最佳案例假设

我会在Linux上检查 constant_tsc 标志作为 / proc / cpuinfo 的一部分,因为可以假设TSC在核心上以固定频率运行。但是......记住上面的变化。

有一些机器状态事件,如省电和机器休眠,可能导致CPU时钟频率发生变化。在这种情况下,需要重新校准TSC,有些文档表明这只是在重新启动时。

<强>建议:

定位特定芯片组和操作系统并研究特定的documentation。大多数OS系列都会详细介绍其时钟源的具体信息。

根据您的时间精度要求,您可能希望切换到使用

clock_gettime(CLOCK_MONOTONIC, ...);