進行 GCC 12 編譯器優化調整
在最近關於 Linux 內核-O3 和其他編譯器優化的討論之後,有人請求使用最近發布的 GCC 12 查看一些新的 GCC 編譯器優化基準. 所以這裡是通過-Ofast 以及鏈接時間優化 (LTO) 和“-march=native” 對具有成熟 AMD Ryzen Threadripper 3990X 平台的新 GCC 12 進行調整的各種 GCC 優化級別的全新視角。
作為一些具有各種 GCC 編譯器優化的新參考基準,各種用戶空間應用程序工作負載/基準是使用以下 CFLAGS/CXXFLAGS 構建的:
-O0
-Og
-O1
-O2
-O3
-Ofast
-O2-march=native
-O3-march=native
-Ofast-march=native
-O2-march=native-flto
-O3-march=native-flto
-Ofast-march=native-flto
全部測試使用了 Fedo 提供的 GCC 12.1.1 ra Workstation 36 作為首批使用 GCC 12 穩定版以及其他前沿開源 GNU 工具鏈的 Linux 發行版之一。所有測試都在 AMD Ryzen Threadripper 3990X 工作站上進行。
除了每次使用不同的被測 CFLAGS/CXXFLAGS 重新構建所有測試外,系統狀態沒有進行其他更改。
首先是使用基於 CPU 的渲染器運行 yquake2 開源 Quake 2 衍生遊戲。從-O1 到-O3 的幀速率並沒有太大的波動,但是使用-Ofast 或使用“-march=native”確實擠出了一些額外的 FPS。通過-flto 使用鏈接時優化 (LTO) 確實有助於實現峰值性能。
在 crypto++ 加密基準測試下,在這個 AMD Ryzen Threadripper 工作站上-O2 之後沒有太大的波動。
與此同時,使用 MrBayes 分子生物學軟件包是從“-Ofast”優化級別中顯著受益的工作負載之一,儘管可能存在不安全的數學。
simdjson 高速 JSON 解析庫確實如此受益於“-march=native”調優。
除了沒有任何編譯器優化的-O0 運行之外,Zstd 性能並沒有太大差異。 Zstd 無法使用-Og 運行構建。
SciMark2 基準測試往往對編譯器更改非常敏感,並且往往會從增加的優化以及 LTO 中受益匪淺。
對於大多數用戶,“-O3-march=native-flto”可能會像您想要的那樣激進,而不會冒潛在不安全的數學或增加可能出現問題的可能性。
這些結果主要是與我們在之前的 GCC 編譯器優化比較中看到的比較相同,但對於那些感興趣的人來說,這裡是新鮮的結果。
那些希望看到更多這些 GCC 12 Threadripper 編譯器優化調整基準的人可以查看此 OpenBenchmarking.org 結果頁面 為整批數據。
當採取所有結果的幾何平均值,從常見的-O2 到-O3 產生了 6% 的總體增長。在-O3 之上的“-march=native”調整總體上增加了大約 2%,但很大程度上歸結於特定的代碼庫/軟件,以提高本地 CPU 指令調整的水平。-flto 結果繼續給人留下深刻印象並大有裨益。在最近的 GCC(和 Clang)版本中,鏈接時間優化相對穩定,與多年前的編譯器版本相比,構建問題和其他令人頭疼的問題更少,有時會遇到 LTO 問題。幸運的是,更多的 Linux 發行版已經開始在相關的鏈接時間優化中構建他們的包。