虽然CPU时钟(clockticks)是一个基于英特尔架构共有的事件(任何Intel的处理器都含有此类事件)。但是每个处理器上,事件的名称会有所不同。以下以Intel(R)Sandy Bridge 处理器为例看看有那些CPU的时钟可以使用。
CPU_CLK_UNHALTED.THREAD 记录Core Cycles, 当你的线程处于非待机状态。我们知道,由于Intel (R) Step Speed 技术,核的频率可能由于CPU的“忙”或“不忙”随时发生变化。如果核上一直很忙(密集型计算)那么核的频率是个常量,这样程序的执行时间(Elapsed Time)可以计算出来:Elpased_Time = CPU_CLK_UNHALTED.THREAD / CPU_frequency (Seconds)
CPU_CLK_UHHANLTED.REF_TSC 也是用于线程处于非待机状态下记录clocks。所不同的是这个事件计数器不会受到核的频率改变的影响。大家可能还记得有条指令叫RDTSC。TSC是通过震荡电路分频产生的,供操作系统使用(作为定时器,频率稍低于主频,但不受主频的变频影响)。这个事件也可以用来计算程序的执行时间,事件数(clocks)除以TSC的频率(TSC的频率查阅手册)
CPU_CLK_UNHALTED.REF_XCLK 是一种超低频的时钟,也是由震荡电路分频产生。当系统不是处于待机状态,100Mhz的低频时钟用于维护CPU核心,内存,Uncore和外围电路上。100Mhz(3000MHz (30x 100MHz))的固定频率比Nehalem架构的133Mhz更省电。
有二点说明:
1. 性能调试时,尽量不使用Intel® Turbo Boost超频技术,否则性能计数器的结果较为复杂,难以解释。
2. 性能调试时,尽量不使用Intel® Hyper-Threading 技术,因为有些性能事件是基于每个线程,有些是基于每个核的。
总结一下:当使用VTune™ Amplifier XE进行CPU耗时测量(热点分析)时,如果目标应用程序是密集型计算(期间主频不变),选择CPU_CLK_UNHALTED.THREAD;否则应该选用CPU_CLK_UHHANLTED.REF_TSC计时。