如何判断机器上的每个核心是否使用相同的计时器?

Oli*_*rLi 8 c linux time multicore

我正在尝试编写一些代码来确定是否clock_gettime使用CLOCK_MONOTONIC_RAW将给我的结果来自不同内核上的相同硬件.

据我所知,每个核心都可能产生独立的结果,并非总是如此.我被赋予了在所有内核上获得定时的任务,精度为40纳秒.

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

编辑:

我找到了unsynchronized_tsc函数,它试图测试所有内核上的TSC是否相同.我现在试图找出是否CLOCK_MONOTONIC_RAW基于TSC.

最终编辑:

事实证明,CLOCK_MONOTONIC_RAW它总是可以在多核系统上使用,即使在英特尔机器上也不依赖于TSC.

Bre*_*dan 4

如此精确地进行测量;你需要:

  • 在所有 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 保证始终完全同步,您也无法阻止 IRQ 在读取 TSC 之前或之后立即中断(并且无法原子地执行某些操作并同时读取 TSC)时间); 因此,如果您的代码需要如此精确的同步时序,那么您的代码设计可能存在缺陷。