摘要:當應用軟體及硬體確定後,編譯器對應用的自動優化將成為應用性能的關鍵。 從應用優化說起 一個應用的優化通常有架構級優化、模塊級優化和函數級優化,高性能作為雲資料庫GaussDB主打特性之一,其在這幾方面都進行了大量的優化,也有很強的性能表現。如何進一步提升性能,是否還有其他方面的切入點? 答案之 ...
摘要:當應用軟體及硬體確定後,編譯器對應用的自動優化將成為應用性能的關鍵。
從應用優化說起
一個應用的優化通常有架構級優化、模塊級優化和函數級優化,高性能作為雲資料庫GaussDB主打特性之一,其在這幾方面都進行了大量的優化,也有很強的性能表現。如何進一步提升性能,是否還有其他方面的切入點?
答案之一是編譯器,編譯器作為人機交流的橋梁,一方面正確地把高級語言翻譯成機器語言,另一方通過各種優化變換方法生成更高效的等價語義,所以當應用軟體及硬體確定後,編譯器對應用的自動優化將成為應用性能的關鍵。
1.畢昇編譯器是什麼
畢昇編譯器是華為編譯器實驗室針對通用處理器架構構建,支持C/C++/Fortran編程語言,增強和引入了多種編譯優化技術,致力於打造高性能、高可信及易擴展的編譯器工具鏈。畢昇編譯器針對鯤鵬架構深度優化,SPEC CPU 2017性能較開源GCC提升30%。
- 高性能:編譯深度優化,增強多核並行化,自動向量化等,大幅提升指令和數據呑吐量。
- 多算力支持:支持其他Arm架構國產晶元,如飛騰。支持x86、RISC-V、龍芯等架構。
- 高可信:商業+自研測試套,每日100萬+測試用例,全面質量保障;開發態提供多種安全編碼工具;社區CVE及時修複;車規級安全認證。
2. 相關編譯器優化技術
2.1 函數內聯(inline)
函數/過程是編程語言的重要組成部分,函數/過程之間的調用是有一定的開銷,比如保存和恢覆上下文、傳遞參數等操作開銷。函數內聯優化是一種常用的優化技術,它可以將函數調用處直接替換為函數體,從而減少函數調用的開銷。下麵是一個簡單的示例,展示瞭如何在編譯器中應用inline優化。
int square(int x) { return x * x; } int calculate(int a) { return square(a) + square(a + 1); }
編譯器進行自動內聯後,如下:
int calculate(int a) { return (a * a) + ((a + 1) * (a + 1)); }
在優化後的代碼中,不再有調用square函數的開銷,另外內聯後可以幫助編譯器發現更多的優化機會,比如本例中,可以進一步進行編譯期間的計算。
這隻是一個簡單的例子,實際的編譯器inline優化會更為複雜,涉及到更多的優化策略和技術。畢昇編譯器進行了inline優化增強,如下是mataERP場景下inline的情況。
![](https://pic3.zhimg.com/80/v2-37d8183950ed50e295793dada0917822_720w.webp)
函數內聯後對應用熱補丁機制有一定影響,製作工作量會略有增加。
2.2 指令預取優化
指令預取(Instruction Prefetching)是一種電腦體繫結構中的優化技術,用於提前獲取未來可能需要執行的指令數據,並將其預載入到指令緩存中,以減少指令訪問延遲和提高程式的執行效率。
在執行程式時,處理器需要從記憶體中獲取指令數據併進行解碼和執行。由於記憶體訪問的延遲比處理器的執行速度慢,處理器可能需要等待指令數據的到達,導致指令執行的停滯。為了剋服這種延遲,指令預取技術被引入。
指令預取的基本原理是根據程式的訪存模式和分支預測信息,提前預測和獲取未來可能需要執行的指令數據。這樣,當處理器執行到需要這些指令的時候,它們已經被預先載入到指令緩存(例如指令高速緩存)中,避免了等待時間。
如下麵這個來自GaussDB的函數:
![](https://pic2.zhimg.com/80/v2-c9c0659a816af5588d546b47ff5c0fa5_720w.webp)
畢昇編譯器(右側)插入了prfm預取指令,prfm是鯤鵬平臺上定義的記憶體數據預取指令,執行指令預取優化。
![](https://pic1.zhimg.com/80/v2-3ff6c6874ac72ae99466236e44d6169c_720w.webp)
2.3 自動向量化技術
自動向量化技術是編譯器利用硬體架構提供的SIMD(single instruction multiple data)指令,如Arm的NEON/SVE指令,x86平臺的SSE/AVX指令,一條指令可以處理多路數據,從而提升應用二進位的執行效率。畢昇編譯器做了大量向量化新場景識別和演算法增強,並結合鯤鵬SIMD指令特點進行深度優化。
![](https://pic3.zhimg.com/80/v2-fe48136d21d74e6714794bb49e256e22_720w.webp)
如上圖,如有兩組四個整形數據相加運算,左側需要四次操作,而右側向量化後只需要1次操作。
2.4 鏈接時優化技術
鏈接時優化LTO(Link Time Optimization)是程式鏈接期優化,也叫鏈接期過程間優化。如下圖,編譯器在鏈接時將所有編譯單元(過程)合併在一起,這樣可以發掘不同過程間的優化機會,比如內聯(inline)、函數特化(function specialization)、冗餘代碼消除、常量傳播等等,通常可以獲得更高的性能收益。當然同時也帶來編譯器時間加長的負面收益。
![](https://pic4.zhimg.com/80/v2-f50e4cafdc2366aecb7577f4104227a7_720w.webp)
2.5 CFGO優化
對於控制流較多、對數據分段訪問較多的應用(例如資料庫類應用)非常適合編譯器的反饋類優化技術,CFGO(Continuous FGO)通過收集程式運行時信息(profile)進行優化決策。編譯器根據這些運行時信息指導各種編譯優化技術進行更準確的優化決策,生成目標程式。
![](https://pic2.zhimg.com/80/v2-178161cb82ba88d879c1c0fee2ec886d_720w.webp)
3. 性能收益
畢昇編譯器協同GaussDB跨域創新,基於應用層優化、編譯中端優化、算力優化等多種手段對GaussDB應用場景持續優化。
![](https://pic3.zhimg.com/80/v2-1f3172289b52c39ee8a0dfabf4a7a8e6_720w.webp)
- 高性能:對插入、更新、刪除等不同負載的業務,畢昇 for GuassDB優化實現 TPCC性能提升30%,TPCH性能提升13%,應用性能提升5%-10%。
- 高安全:畢昇編譯器全面升級代碼檢測工具,保障安全可信代碼開發,實現高質量、高安全的持續集成、交付與部署。
![](https://pic3.zhimg.com/80/v2-bf06bd929bfeea3a44507f1bc95bfe52_720w.webp)
4. 總結與展望
資料庫和編譯器都是關鍵的基礎軟體,為關基行業提供軟體根技術,後續將進行如下幾方面的工作:
(1)完成GaussDB切換畢昇編譯器,直接獲取已有的性能收益;
(2)針對典型客戶場景,技術能力聯合創新和快速驗證;
(3)突破編譯器/虛擬機關鍵技術,支撐高斯PLSQL性能提升;
目前GaussDB已啟動切換畢昇編譯器進程,併在已經在銀行、政務雲等客戶進行了POC驗證,相信後續畢昇編譯器可以為GaussDB提供更強大的競爭力,從而也為更多行業客戶創造更多的商業價值。
另外,畢昇編譯器作為通用編譯器,也可涵蓋金融領域其他應用場景,如優化haproxy應用,助力工行音視頻交互服務獲得收益;落地上交所CICD,通過協助檢測記憶體安全、代碼規範,保障高質量交付。