Profiling 如何检测RDTSC是否返回恒定速率计数器值?

Profiling 如何检测RDTSC是否返回恒定速率计数器值?,profiling,x86,64-bit,rdtsc,Profiling,X86,64 Bit,Rdtsc,AMD和Intel的大多数新CPU似乎都将rdtsc作为一个恒定速率计数器来实现,从而避免了由于TurboBoost或节能设置等原因而导致的频率变化问题 由于rdtsc比QueryPerformanceCounter更适合于性能度量,因为它的开销要低得多,所以我希望尽可能使用它 如何可靠地检测rdtsc是否为恒速计数器?只需使用CPUID来检测,看看它是否使用恒速计数器。不过,我建议改用评测API,比如AMD的codeanalyst sdk会很好你可以用CPUID告诉你。从CPUID Fn800

AMD和Intel的大多数新CPU似乎都将rdtsc作为一个恒定速率计数器来实现,从而避免了由于TurboBoost或节能设置等原因而导致的频率变化问题

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


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

只需使用
CPUID
来检测,看看它是否使用恒速计数器。不过,我建议改用评测API,比如AMD的codeanalyst sdk会很好

你可以用
CPUID
告诉你。从CPUID Fn8000_0007_EDX第8位开始:

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


我会在一秒钟内计算出0个刻度,然后与/proc/cpuinfo上通知的时钟进行比较。它仅在禁用动态时钟的情况下工作。查看来源:

我知道从最初的问题被问到现在已经有很长时间了,但是我可以指出检查处理器的生成/型号绝对是错误的。首先,代码很容易出错,因此无法在下一代处理器上运行(因为系列/型号并不总是“线性的”),其次,仅仅因为处理器比您知道的处理器“更晚的系列/型号”,这并不能保证该功能存在。这是可能的,但我已经看到很多代码做得很糟糕,因此“新处理器出来了,代码出错了”


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

太好了。似乎也适用于英特尔:这里的问题是,在启用动态时钟的情况下,任务的执行时间会有所不同。因此,即使rdtsc寄存器增量不受时钟本身的影响,执行任务所需的时间也会受到时钟速度的影响。