首頁>技術>

什麼是 top-down ?

top-down 直譯過來就是“自頂向下”,是 intel 效能最佳化手冊附錄中給出的一種識別效能瓶頸的方法。當然,它僅支援 intel 的 cpu. 該方法最初來源於 Admand Yasin 的一篇論文“A top-down for performance analysis and counter architecture”,它提出了一種效能最佳化的模型 TMAN,透過精確統計 cpu 每個週期內執行的有效指令數及無效指令的去向,從而判斷程式的效能瓶頸及最佳化方向。

一般來說,IPC(Instructions per Cycle,cpu 平均每時鐘週期內完成的指令數)越高,程式的效能越好。然而,我們更關注的是 cpu 每個週期內執行的有效指令數。cpu 除了執行有效指令外,還有哪些無效的指令消耗呢?論文中指出了 4 種開銷:

Frontend bound(FE,前端依賴):指x86 指令解碼階段耗時。FE 負責獲取程式程式碼指令,並將其解碼為一個或多個稱為微操作(uOps)的底層硬體指令。

Backend bound(BE,後端依賴):又分為 core bound(核心依賴)和 memory bound(記憶體依賴)。uOps 被分配給 BE 進行執行,Back-end 負責監控 uOp 資料何時可用,並在可用的執行單元中執行 uOp.

Bad speculation(錯誤的預測):if 語句分支預測錯誤導致的開銷

Retiring(退役):uOp 執行完成,包括指令完成、等待指令切換,模組重新初始化的開銷。

FE、BE、Bad speculation、Retiring 等指標的 intel 推薦值

在 intel 微體系結構上,流水線的 FE 每個 cpu 週期(cycle)可以分配 4 個 uOps ,而 BE可以在每個週期中執行 4個 uOps。 流水線槽(pipeline slot)代表處理一個 uOp 所需的硬體資源。

附一些參考文件連結:

https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdfhttps://software.intel.com/en-us/vtune-amplifier-help-tuning-applications-using-a-top-down-microarchitecture-analysis-method http://halobates.de/blog/p/262

在程式執行過程中,一旦我們拿到這上述 4 項指標,就大致知道應用程式和 cpu 的親和性,剩下的就是一些最佳化的套路了。

FE:這由於 cpu 的指令無法及時被解析和載入造成的,包括指令 cache miss 和 指令 TLB miss(虛擬地址和物理地址轉換的頁表)

BE core bound:cpu 升頻;增加執行緒數,同時要關注多執行緒線性度

BE memory bound:資料 cache miss 和 資料 TLB miss

Bad speculation:一般是程式碼中 if 判斷條件順序不合理,比如很少走到的分支在程式碼中的位置靠前

Retiring:表示執行有效 uOp 的 pipeline slot

以上主要介紹了 top-down 模型的基本概念。接下來,我們還要解決以下 3 個問題:

(1)如何獲取 top-down 模型中提到的 4 種性能指標?

(2)如何將 top-down 中比較差的指標關聯到程式碼或者編譯後的二進位制檔案?

(3)有哪些具體的方法能夠最佳化 top-down 中效能指標?

github 上有一個基於 perf 和 TMAN 方法的效能分析工具 - toplev,作者 andikleen. 該工具包括一系列的 python 指令碼和 C 語言樣例程式碼。之後,我還將介紹如何在 docker 中使用 toplev(主要是docker 中只讀 kernel 檔案的許可權問題).

toplev

top、perf

問題(2):

對於 linux 系統中的 C 語言程式,你要理解 gcc 編譯器的 O3 最佳化項原理;你要清楚由原始碼編譯生成的靜態庫檔案(.a)和動態庫檔案(.so)的內容(objdump 可以檢視);你還要明白作業系統載入程式的流程及指令跳轉的機制。

問題(3):

架構最佳化:負載均衡;多執行緒、協程並行化;通知替代輪詢;快取;訊息佇列;IO與邏輯分離、讀寫分離;批處理與資料預取;記憶體屏障、綁核、偽共享、核隔離等;

演算法最佳化:二分查詢、跳錶、資料結構的實現最佳化、延遲計算、寫時複製、預計算、增量更新;

程式碼最佳化:;記憶體最佳化(減少記憶體碎片、記憶體複用等);cache 最佳化;判斷前置;分治;分頻;減少引數個數、減少函式呼叫次數、減少記憶體引用次數、減少無效的初始化和重複賦值、減少複製、零複製;迴圈最佳化(迴圈內大外小、迴圈內使用區域性變數、迴圈展開);無鎖程式設計;

編譯最佳化:PGO、LTO、BOLT、開啟編譯器最佳化項等。

13
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 翻譯:《實用的Python程式設計》03_01_Script