以Intel(R) Microarchitecture Code Name Nehalem系列的CPU為例,以VTune工具作為測試手段來了解(因為我的CPU是這個系列的。)
基本的性能調優事件
使用這些事件能了解代碼中最耗時和執行最多指令的部分。
其中三個事件是fixed counter(固定計數器,參考18.4.1 Fixed-function Performance Counters了解其概念),簡單了解它們用于計數對應的預定義的一些事件。
1. CPU_CLK_UNHALTED
Programable counter version of the unhalted cycle counter
表示非停機狀态的機器周期數。
很顯然,對于一個程式,這個事件的數目越少越好,表明其運作狀态(非停機狀态)消耗的機器周期少,即耗時少。其有三個擴充:
THREAD_P:非停機狀态下線程的機器周期。線程在運作HLT指令的時候進入halt state(停機狀态)。由于CPU核的頻率會不斷變化,這個事件數目和時間的比例是變化的。
TOTAL_CYCLES:CPU機器周期數目的總和,halted+unhalted(除了處于深度睡眠狀态)。
REF_P:線程在非停機狀态下,計數base clock(133Mhz)的參考機器周期數目。很顯然,這個事件不會被頻率影響,就好象是線程運作一直運作在一個最大的頻率一樣。
2. CPU_CLK_UNHALTED.REF
Reference cycles when thread is not halted (fixed counter)
和上面的CPU_CLK_UNHALTED的REF_P的含義相同。
3. CPU_CLK_UNHALTED.THREAD
Cycles when thread is not halted (fixed counter)
和上面的CPU_CLK_UNHALTED的THREAD_P的含義相同。
4. INST_RETIRED.ANY
Instructions retired ( fixed counter )
表示消耗的指令數,計數執行過程中消耗的指令數。
說明:關于retire,一般表示退休什麼的意思,這裡其實其含義就是“消耗”,retirement表示指令隐退,或者可以了解為其技術指令從執行到退出的那個退出的次數,自然,其實就表示消耗的指令數了。:)
對于包含多個微操作(micro-op)的指令,其隻對最後一個微操作的指令引退進行計數,即隻計數一次。
5. THREAD_ACTIVE
Cycles thread is active
線程處于active狀态下的機器周期數。
性能名額之CPI:
Clockticks per Instructions Retired (CPI)
即Cycles per Instructions,表示每一條指令消耗的時鐘周期。這是一個基礎的性能名額之一,在進行性能分析時,其一般是首先會分析的一個名額。
很顯然,CPI的值越小越好,CPI的計算為:Clockticks / Instructions Retired。如:
CPI=CPU_CLK_UNHALTED.THREAD/INST_RETIRED.ANY
說明:如果要計算一個函數的CPI,就使用相應的事件計算,這裡的例子是計算整個thread的CPI。
根據經驗值,如果CPI小于0.75,那麼認為其性能是不錯的。如果大于0.75,就需要考慮進行優化了。