Facebook 開源了一個軟體優化工具 — BOLT
GitHub: https://github.com/facebookincubator/BOLT
GitHub: https://github.com/facebookincubator/BOLT
BOLT 全名為 Binary Optimization and Layout Tool
主要在於優化記憶體中的指令位置, 如此能節省 2~15% 的 CPU 執行時間. 與其它以往定位在解決 instruction starvation 問題的工具不同的地方在於: BOLT 能應用在任何 compiler (clang, gcc)產生的應用程式上.
主要在於優化記憶體中的指令位置, 如此能節省 2~15% 的 CPU 執行時間. 與其它以往定位在解決 instruction starvation 問題的工具不同的地方在於: BOLT 能應用在任何 compiler (clang, gcc)產生的應用程式上.
以往在解決這問題使用的是 PGO (profile-guided optimizations) 來有效利用系統架構上的 cache. 對於手動控制上必須要清楚知道執行的頻率, 對於執行上也能難得知規律的部分與相較之下較頻繁的部分何者優先權較高.
實際情況上, PGO 有著許多本質上與實作層面上的限制. 若沒有 source code, compiler 就無法控制來自組語或三方函式庫. 而精確地獲取並應用 profile 到每一次的 compilation 也是相當困難的.
為此 Facebook 打造了 BOLT, 能與不同 compilers, 甚至與 link-time optimizations (LTO) 和 PGO/AutoFDO 優化選項搭配使用.
BOLT 被設計用來滿足3個重要需求:
* 與任何 compiler 或混合使用 compiler 所產生的 code (這裡指 binary/instruction code)相容.
* 能夠支援不以 source code 型式存在的 code
* 能支援手動撰寫的組語並優化其 layout
* 與任何 compiler 或混合使用 compiler 所產生的 code (這裡指 binary/instruction code)相容.
* 能夠支援不以 source code 型式存在的 code
* 能支援手動撰寫的組語並優化其 layout
透過 heatmap 顯示使用前後的差異, 可以發現有明顯的不同:
BOLT 基於 execution profile 結果來重排函式內的 code. 如此一來函式的主體能夠基於其執行的頻率來切分. 一旦完成後, 最後一步就是產生依照 call graph prifile 的熱區優化後的 layout.
沒有留言:
張貼留言