gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:21:50 25 4
gpt4 key购买 nike

我正在尝试编写一些代码来确定 clock_gettimeCLOCK_MONOTONIC_RAW 一起使用是否会给我来自不同内核上的相同硬件的结果。

据我了解,每个内核都可以生成 independent results但是not always .我的任务是获取所有内核的时序,精度为 40 纳秒。

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

编辑:

我找到了 unsynchronized_tsc尝试测试 TSC 在所有内核上是否相同的函数。我现在正在尝试查找 CLOCK_MONOTONIC_RAW 是否基于 TSC。

最终编辑:

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

关于c - 我如何判断我机器上的每个核心是否使用相同的计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22613543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com