4

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

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

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

4

4 回答 4

7

你可以CPUID用来告诉你。来自CPUID Fn8000_0007_EDX bit 8的文档:

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

于 2010-12-22T14:13:30.703 回答
0

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

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

于 2012-12-20T14:57:44.140 回答
-1

只是CPUID用来检测CPU 的生成,看看它是否使用常量计数器。但是,我建议改用分析 API,例如 AMD 的 codeanalyst sdk 会做得很好

于 2010-12-22T14:10:00.010 回答
-1

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

于 2012-03-11T13:28:14.323 回答