如何检测RDTSC是否返回恒定速率计数值?
题
AMD和Intel实施RDTSC的最新CPU似乎是恒定速率计数器,避免了由于TurboBoost或节省设置之类的频率更改而引起的问题。
由于RDTSC比QueryPerformanceCounter更适合性能测量,因为它的开销要低得多,因此我想尽可能使用它。
如何可靠地检测RDTSC是否是恒定速率计数器?
解决方案
您可以使用 CPUID
告诉你。从 文档 在CPUID上FN8000_0007_EDX位8:
TSCINVARIANT:TSC不变. 。 TSC速率确保在所有P州,C州和停止赠款过渡(例如STPCLK节流网络)中不变;因此,TSC适合用作时间源。 0 =没有做出这样的保证,软件应避免尝试将TSC用作时间源。
其他提示
我知道自从最初的问题被问到以来已经很长时间了,但是我可以指出,检查处理器的生成/模型绝对是错误的事情。首先,将代码弄错很容易,因此它不适用于未来一代处理器(因为家庭/型号并不总是“线性”),其次,仅仅是因为处理器是后来的”家庭/模型“比您知道的工作,这并不能保证该功能在那里。很可能,但是我已经看到很多代码做得不好,因此“新处理器出来了,并且代码弄错了问题”。
使用CPUID位检查处理器是否具有正确的位。
只是使用 CPUID
检测 CPU的产生, ,看看它是否使用恒定计数器。但是,我建议使用分析API,而是像AMD的Codeanalyst SDK这样的事情会做得很好
我确实在一秒钟内计算了o滴的数字o,然后与 /proc /cpuinfo的知情时钟进行比较。它仅适用于禁用的动态时钟。请参阅来源: https://github.com/petersenna/rdtscbench
不隶属于 StackOverflow