我怎么能告诉我的机器上的每个核心使用相同的计时器?

我试图写一些代码,以确定是否clock_gettime用于CLOCK_MONOTONIC_RAW会给我来自不同的内核上的相同硬件的结果。

根据我的理解,每个核心都有可能产生独立的结果,但并不总是如此 。 我被赋予了以40纳秒的精度获得所有核心的时间的任务。

我不使用CLOCK_REALTIME的原因是我的程序绝对不能受到NTP调整的影响。

编辑:

我发现unsynchronized_tsc函数试图testingTSC在所有内核上是否相同。 我现在试图findCLOCK_MONOTONIC_RAW是否基于TSC。

最终编辑

事实certificate, CLOCK_MONOTONIC_RAW在多核系统上始终可用,即使在Intel机器上也不依赖于TSC。

精确测量; 你需要:

  • 在所有CPU上执行的代码,读取CPU的时间戳记计数器,并在“事件”发生后立即存储
  • 某种方式来创建所有CPU同时注意到的“事件”
  • 一些方法来防止由IRQ,任务切换等引起的时间问题

事件的各种可能性包括:

  • 轮询一个循环中的内存位置,其中一个CPU写入一个新值,其他CPU在看到新值时停止轮询
  • 使用本地APIC向所有CPU广播IPI(处理器间中断)

对于这两种方法,CPU之间存在延迟(特别是对于较大的NUMA系统) – 写入内存(缓存)可能在立即写入的CPU上可见,并且由不同物理芯片上的CPU可见在不同的NUMA域中)。 为了避免这种情况,您可能需要找到在所有CPU上启动事件的平均值。 例如(对于2个CPU),一个CPU启动并测量,另一个CPU启动并测量,然后合并结果以消除任何“事件传播延迟”。

为了解决其他时间问题(IRQ,任务切换等),我想在启动过程中做这些测试,没有别的东西可以搞砸了。 否则,您需要防止出现问题(确保所有的CPU以相同的速度运行,禁用IRQ,禁用线程切换,停止任何PCI设备总线控制等)或应对问题(例如,多次运行相同的测试,看看是否大部分时间你都会得到类似的结果)。

另外请注意,以上所有内容只能确保时间戳计数器在测试完成时同步,并且不能保证在测试完成后它们不会失去同步。 为了确保CPU保持同步,你需要依靠CPU的“单调时钟”保证(但是老式的CPU不能保证)。

最后; 如果你正试图在用户空间(而不是在内核代码)中做到这一点; 那么我的建议是设计代码的方式并不是很脆弱。 即使不同CPU上的TSC始终保持完全同步,也不能防止在读取TSC之前或之后立即中断IRQ(并且无法自动执行某些操作并读取TSC)时间); 因此如果你的代码需要这种精确同步的时机,那么你的代码的设计可能是有缺陷的。