似乎 AMD 和 Intel 的大多数较新的 CPU 都将 rdtsc 实现为恒定速率计数器,从而避免了由于 TurboBoost 或省电设置等因素而导致频率变化的问题。
由于 rdtsc 比 QueryPerformanceCounter 更适合性能测量,因为它的开销要低得多,所以我想尽可能使用它。
如何可靠地检测 rdtsc 是否是恒定速率计数器?
你可以CPUID
用来告诉你。来自CPUID Fn8000_0007_EDX bit 8的文档:
TscInvariant:TSC 不变量。确保 TSC 速率在所有 P-States、C-States 和停止授权转换(例如 STPCLK Throttling)中保持不变;因此,TSC 适合用作时间源。0 = 不做此类保证,软件应避免尝试使用 TSC 作为时间源。
我知道自从提出最初的问题以来已经有很长时间了,但我能否指出检查处理器的世代/型号绝对是错误的事情。首先,很容易弄错代码,以至于它在下一代处理器上不起作用(因为系列/型号并不总是“线性”的),其次,仅仅因为处理器是“更晚的”家庭/模型”,而不是您知道的那些,这并不能保证该功能存在。这很可能,但我已经看到很多代码做得很糟糕,因此“新处理器问世,代码出错了”。
使用 CPUID 位检查处理器是否具有正确的位。
只是CPUID
用来检测CPU 的生成,看看它是否使用常量计数器。但是,我建议改用分析 API,例如 AMD 的 codeanalyst sdk 会做得很好
我确实计算了一秒钟内的 o 滴答数,然后与 /proc/cpuinfo 上的通知时钟进行比较。它仅适用于禁用动态时钟。查看源代码:https ://github.com/petersenna/rdtscbench