我试图写一些代码,以确定是否clock_gettime
用于CLOCK_MONOTONIC_RAW
会给我来自不同的内核上的相同硬件的结果。
根据我的理解,每个核心都有可能产生独立的结果,但并不总是如此 。 我被赋予了以40纳秒的精度获得所有核心的时间的任务。
我不使用CLOCK_REALTIME
的原因是我的程序绝对不能受到NTP调整的影响。
编辑:
我发现unsynchronized_tsc函数试图testingTSC在所有内核上是否相同。 我现在试图findCLOCK_MONOTONIC_RAW
是否基于TSC。
最终编辑 :
事实certificate, CLOCK_MONOTONIC_RAW
在多核系统上始终可用,即使在Intel机器上也不依赖于TSC。
精确测量; 你需要:
事件的各种可能性包括:
对于这两种方法,CPU之间存在延迟(特别是对于较大的NUMA系统) – 写入内存(缓存)可能在立即写入的CPU上可见,并且由不同物理芯片上的CPU可见在不同的NUMA域中)。 为了避免这种情况,您可能需要找到在所有CPU上启动事件的平均值。 例如(对于2个CPU),一个CPU启动并测量,另一个CPU启动并测量,然后合并结果以消除任何“事件传播延迟”。
为了解决其他时间问题(IRQ,任务切换等),我想在启动过程中做这些测试,没有别的东西可以搞砸了。 否则,您需要防止出现问题(确保所有的CPU以相同的速度运行,禁用IRQ,禁用线程切换,停止任何PCI设备总线控制等)或应对问题(例如,多次运行相同的测试,看看是否大部分时间你都会得到类似的结果)。
另外请注意,以上所有内容只能确保时间戳计数器在测试完成时同步,并且不能保证在测试完成后它们不会失去同步。 为了确保CPU保持同步,你需要依靠CPU的“单调时钟”保证(但是老式的CPU不能保证)。
最后; 如果你正试图在用户空间(而不是在内核代码)中做到这一点; 那么我的建议是设计代码的方式并不是很脆弱。 即使不同CPU上的TSC始终保持完全同步,也不能防止在读取TSC之前或之后立即中断IRQ(并且无法自动执行某些操作并读取TSC)时间); 因此如果你的代码需要这种精确同步的时机,那么你的代码的设计可能是有缺陷的。