【问题标题】:How to detect if RDTSC returns a constant rate counter value?如何检测 RDTSC 是否返回恒定速率计数器值?
【发布时间】:2010-12-22 13:41:51
【问题描述】:

似乎 AMD 和 Intel 的大多数较新 CPU 都将 rdtsc 实现为恒定速率计数器,从而避免了由于 TurboBoost 或省电设置等因素而导致频率变化的问题。

由于 rdtsc 比 QueryPerformanceCounter 更适合用于性能测量,因为它的开销要低得多,所以我想尽可能使用它。

如何可靠地检测 rdtsc 是否为恒定速率计数器?

【问题讨论】:

    标签: profiling x86 64-bit rdtsc


    【解决方案1】:

    你可以用CPUID告诉你。来自 CPUID Fn8000_0007_EDX 位 8 上的 the docs

    TscInvariant:TSC 不变量。确保 TSC 速率在所有 P-States、C-States 和停止授权转换(例如 STPCLK Throttling)中保持不变;因此,TSC 适合用作时间源。 0 = 不作此类保证,软件应避免尝试使用 TSC 作为时间来源。

    【讨论】:

    • 太棒了。似乎也适用于英特尔:stackoverflow.com/questions/3388134/…
    • 这里的问题是启用动态时钟后,任务将花费不同的时间来执行。所以即使 rdtsc 寄存器增量不受时钟本身的影响,执行任务所需的时间也会受到时钟速度的影响。
    【解决方案2】:

    我知道自从提出原始问题以来已经有很长时间了,但我能否指出检查处理器的代/型号绝对是错误的做法。首先,很容易弄错代码,以至于它不能在下一代处理器上工作(因为系列/型号并不总是“线性”的),其次,仅仅因为处理器是“更晚的”家庭/模型”,而不是您知道的那些,这并不能保证该功能存在。这很可能,但我看到很多代码做得很糟糕,因此“新处理器问世,代码出错了”。

    使用 CPUID 位来检查处理器是否有正确的位。

    【讨论】:

      【解决方案3】:

      只需使用CPUID 来检测generation of the CPU,看看它是否使用常量计数器。不过,我建议改用分析 API,比如 AMD 的 codeanalyst sdk 会做得很好

      【讨论】:

        【解决方案4】:

        我确实计算了一秒钟内的 o 滴答数,然后与 /proc/cpuinfo 中的通知时钟进行比较。它仅适用于禁用动态时钟。见源:https://github.com/petersenna/rdtscbench

        【讨论】:

          猜你喜欢
          • 2020-08-19
          • 1970-01-01
          • 2021-05-28
          • 2021-05-17
          • 2010-10-29
          • 2018-07-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多