天天看點

PMU性能分析系列1 - 相關事件的了解 - Basic Performance Tuning Events

以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,就需要考慮進行優化了。

繼續閱讀