1. 程式人生 > >用 CPI 火焰圖分析 Linux 效能問題

用 CPI 火焰圖分析 Linux 效能問題

1. 什麼是 CPI ?

本小節講述為什麼使用 CPI 分析程式效能的意義。如果已經非常瞭解 CPI 對分析程式效能的意義,可以跳過本小節的閱讀。

1.1 程式怎麼樣才能跑得快 ?

理解什麼是 CPI,首先讓我們思考一個問題:在一個給定的處理器上,如何才能讓程式跑得更快呢?

假設程式跑得快慢的標準是程式的執行時間,那麼程式執行的快慢,就可以用如下公式來表示:

   程式執行時間 = 程式總指令數 x 每 CPU 時鐘週期時間 x 每指令執行所需平均時鐘週期數

因此,要想程式跑得快,即減少程式執行時間,我們就需要在以下三個方面下功夫:

  1. 減少程式總指令數

    要減少程式執行的總指令數,可能有以下手段:

    • 演算法優化;好的演算法設計,可能帶來更少的指令執行數
    • 更高效的編譯器或者直譯器;新的編譯器或者直譯器,可能對同樣的原始碼,生成更少的機器碼。
    • 用更底層的語言優化;這是為何 Linux 核心程式碼使用 C 語言,並且還喜歡內聯彙編。
    • 更新的處理器指令;新的處理器指令,對處理某類特殊目的運算更有幫助,而新版本編譯器最重要的工作就是,在新的處理器上,用最新的高效指令;例如,x86 SSE,AVX 指令。
  2. 減少每 CPU 時鐘週期時間

    這一點很容易理解,縮短 CPU 時鐘週期的時間,實際上就是要提高 CPU 的主頻。這正是 Intel 過去佔無不勝的法寶之一。今天,由於主頻的提高已經到了製造工藝的極限,CPU 時鐘週期的時間很難再繼續降低了。

  3. 減少每指令執行所需平均時鐘週期數

    如何減少每指令執行所需平均 CPU 時鐘週期數呢?讓我們先從 CPU 設計角度看一下:

    • 標量處理器 (Scalar Processor) ;一個 CPU 時鐘週期只能執行一條指令;
    • 超標量處理器 (Superscalar Processor);一個 CPU 時鐘週期可以執行多條指令;通常這個是靠在處理器裡實現多級流水線 (Pipeline) 來實現的。

    因此不難看出,如果使用支援超標量處理器的 CPU,利用 CPU 流水線提高指令並行度,那麼就可以達到我們的目的了。流水線的並行度越高,執行效率越高,那麼每指令執行所需平均時鐘週期數

    就會越低。