来自 std::chrono 的时钟在不同内核上是否可以不同
Can Clocks from std::chrono be different on different cores
我喜欢比较来自 std::chrono::high_resolution_clock
的 time_point
s,它们是在处理器不同内核的线程 运行 中测得的。是否存在显着差异,例如滞后或 faster/slower 时钟?标准规定了什么?
std
时钟与处理器没有关联,事实上,大多数线程也没有。来自同一线程的两个时钟测量很可能在不同的内核上进行。
关于与测量相关的超前和滞后——这与任何其他指令的执行没有什么不同;通常的管道等可能会产生影响,但我认为这不是有害的。如果它可能有害,您可能需要考虑使用其他工具来完成这项工作,例如一些专门的平台计时工具或CPU 某种特定指令。
我将根据你的评论具体回答这个问题,你是 运行 这个 'Modern' Intel CPU。
我还要强调,这可能是一个极具争议的讨论,因为这在很大程度上取决于 CPU 和主板。 'Modern' 可以是一个非常流畅的概念:)
一般来说
'Modern' Intel CPU 已经采用了一些机制来确保内核之间的同步。但是,OS 你 运行 的位置也很重要。例如,一些 Linux 内核将使用时间戳计数器作为其来源,因为开销较小,并回退到(现代)高精度事件计时器,该计时器试图使时钟节拍在内核之间保持一致。
此外,请记住英特尔 CPU 有许多会影响 CPU 时钟频率的功耗实用程序。
最佳情况假设
我会在 [=58= 上检查 constant_tsc 标志作为 /proc/cpuinfo 的一部分] 因为可以假设 TSC 以固定频率跨内核运行。但是......请记住上面的变化。
有些机器状态事件,例如节能和机器休眠,可能会导致 CPU 时钟频率发生变化。在这种情况下,需要重新校准 TSC,一些文档表明这仅在重新启动时才会发生。
建议:
针对特定的芯片组和 OS 并研究特定的 documentation。大多数 OS 系列都有关于其时钟源细节的详细信息。
根据您的时间精度要求,您可能希望切换为使用
clock_gettime(CLOCK_MONOTONIC, ...);
我喜欢比较来自 std::chrono::high_resolution_clock
的 time_point
s,它们是在处理器不同内核的线程 运行 中测得的。是否存在显着差异,例如滞后或 faster/slower 时钟?标准规定了什么?
std
时钟与处理器没有关联,事实上,大多数线程也没有。来自同一线程的两个时钟测量很可能在不同的内核上进行。
关于与测量相关的超前和滞后——这与任何其他指令的执行没有什么不同;通常的管道等可能会产生影响,但我认为这不是有害的。如果它可能有害,您可能需要考虑使用其他工具来完成这项工作,例如一些专门的平台计时工具或CPU 某种特定指令。
我将根据你的评论具体回答这个问题,你是 运行 这个 'Modern' Intel CPU。
我还要强调,这可能是一个极具争议的讨论,因为这在很大程度上取决于 CPU 和主板。 'Modern' 可以是一个非常流畅的概念:)
一般来说
'Modern' Intel CPU 已经采用了一些机制来确保内核之间的同步。但是,OS 你 运行 的位置也很重要。例如,一些 Linux 内核将使用时间戳计数器作为其来源,因为开销较小,并回退到(现代)高精度事件计时器,该计时器试图使时钟节拍在内核之间保持一致。
此外,请记住英特尔 CPU 有许多会影响 CPU 时钟频率的功耗实用程序。
最佳情况假设
我会在 [=58= 上检查 constant_tsc 标志作为 /proc/cpuinfo 的一部分] 因为可以假设 TSC 以固定频率跨内核运行。但是......请记住上面的变化。
有些机器状态事件,例如节能和机器休眠,可能会导致 CPU 时钟频率发生变化。在这种情况下,需要重新校准 TSC,一些文档表明这仅在重新启动时才会发生。
建议:
针对特定的芯片组和 OS 并研究特定的 documentation。大多数 OS 系列都有关于其时钟源细节的详细信息。
根据您的时间精度要求,您可能希望切换为使用
clock_gettime(CLOCK_MONOTONIC, ...);