編譯器作為重要的基礎(chǔ)軟件之一,在各個(gè)領(lǐng)域都有著非常廣泛的應(yīng)用。比如在嵌入式領(lǐng)域,如何在有限的空間內(nèi)豐富應(yīng)用的功能困擾著眾多的工程師,編譯器能夠輔助大幅度地降低應(yīng)用的體積,是工程師們不可或缺的好幫手。
再或是 HPC(High Performance Computing,高性能計(jì)算)領(lǐng)域聚焦于計(jì)算密集型的場(chǎng)景,像氣象預(yù)報(bào)、科學(xué)研究等,極致化的應(yīng)用性能是 HPC 領(lǐng)域不斷探索的課題之一,編譯器作為重要的性能貢獻(xiàn)者,在其中發(fā)揮著至關(guān)重要的作用。
鯤鵬 GCC 是搭載在鯤鵬平臺(tái)上的高性能編譯器,致力于為用戶提供高效的性能體驗(yàn),在編譯算法、指令流水、運(yùn)算庫(kù)等方面進(jìn)行了深度的優(yōu)化。
了解鯤鵬 GCC 編譯器
鯤鵬 GCC 編譯器是基于開(kāi)源 GCC 的高性能編譯器,鯤鵬 GCC 與鯤鵬芯片協(xié)同,通過(guò)編譯器技術(shù)充分發(fā)揮芯片的性能,提升鯤鵬硬件平臺(tái)上業(yè)務(wù)的性能體驗(yàn)。除支持開(kāi)源 GCC 通用功能之外,鯤鵬 GCC 主要對(duì)以下三個(gè)方面進(jìn)行了增強(qiáng)。
更豐富的編譯算法:提供豐富的優(yōu)化算法,如內(nèi)存布局優(yōu)化、結(jié)構(gòu)體拆分優(yōu)化、自動(dòng)矢量化等,大幅提升指令和數(shù)據(jù)的吞吐量。
更靈活的指令流水:適配鯤鵬平臺(tái)的指令流水優(yōu)化,發(fā)揮鯤鵬架構(gòu)極致算力。
更高效的運(yùn)算庫(kù):深度優(yōu)化數(shù)學(xué)庫(kù)算法,提供豐富的矢量數(shù)學(xué)函數(shù)接口,大幅提升數(shù)學(xué)計(jì)算的效率。
當(dāng)前鯤鵬 GCC 編譯器已廣泛應(yīng)用于多種 HPC 典型場(chǎng)景,如氣象、安防、流體力學(xué)等,性能優(yōu)勢(shì)已經(jīng)逐步展露。其中,SPECCPU 2006 和 SPECCPU 2017 benchmark 跑分平均優(yōu)于開(kāi)源 GCC 15% 以上,HPC 典型氣象應(yīng)用 WRF 優(yōu)于開(kāi)源 GCC 10% 以上。
GCC 編譯器典型優(yōu)化場(chǎng)景及其優(yōu)化原理介紹
結(jié)構(gòu)體拆分優(yōu)化——大幅提升 Cache 命中率
SPECCPU 2006 benchmark 中有一款 libquantum 子項(xiàng),它用于模擬量子計(jì)算機(jī)運(yùn)行整數(shù)分解的 Shor 算法,該子項(xiàng)的一個(gè)瓶頸在于頻繁連續(xù)的內(nèi)存讀寫,簡(jiǎn)化后的代碼示例如下圖左邊所示。
內(nèi)存布局優(yōu)化原理示意圖
從循環(huán)中可以看出在結(jié)構(gòu)體 node_t 中,data1 的使用率極高,而 data2 是不使用的。在源代碼中,數(shù)據(jù)是以結(jié)構(gòu)體數(shù)組的形式排布在內(nèi)存中,按照普通編譯器的編譯方式,每次從內(nèi)存中取數(shù)據(jù)時(shí)會(huì)將連續(xù)幾個(gè)結(jié)構(gòu)體數(shù)據(jù)加載到 cache 中,而 cache 包含的數(shù)據(jù)中有一半將不會(huì)參與運(yùn)算,這會(huì)造成 cache 空間和帶寬的浪費(fèi)與性能的損耗。
鯤鵬 GCC 編譯器會(huì)自動(dòng)檢查循環(huán)中適合優(yōu)化的場(chǎng)景,通過(guò)將結(jié)構(gòu)體拆分成兩個(gè)結(jié)構(gòu)體的方式(如上圖右),將有效的數(shù)據(jù)緊湊排布起來(lái),從而提高 cache 命中率和應(yīng)用性能。經(jīng)測(cè)試,此優(yōu)化可以給 libquantum 子項(xiàng)帶來(lái)80%的性能提升。除此之外,鯤鵬 GCC 編譯器還支持結(jié)構(gòu)體全展開(kāi)、結(jié)構(gòu)體成員重排列等內(nèi)存布局優(yōu)化,讓應(yīng)用程序的性能如虎添翼。
指令流水優(yōu)化——更加適合鯤鵬的指令調(diào)度模型
通用的指令流水調(diào)度是基于各個(gè)指令的消耗和指令間的依賴關(guān)系合理地調(diào)度指令執(zhí)行的順序。在不進(jìn)行指令流水優(yōu)化時(shí),6條指令依次順序執(zhí)行,假設(shè)每條指令需要兩個(gè)單位的執(zhí)行時(shí)間來(lái)計(jì)算得到結(jié)果,由于指令間存在數(shù)據(jù)依賴,在沒(méi)有計(jì)算得到 V1 值的條件下,無(wú)法進(jìn)行 V0 值的計(jì)算,由此導(dǎo)致了一個(gè)單位時(shí)間的等待,造成性能損失。
在使用指令流水優(yōu)化后,在 V 系列指令執(zhí)行等待的一個(gè)單位時(shí)間內(nèi)加入了沒(méi)有數(shù)據(jù)依賴的K系列指令的執(zhí)行,所有指令的執(zhí)行被合理地調(diào)度了起來(lái),指令流水優(yōu)化提升了指令執(zhí)行的效率和程序運(yùn)行的性能。
鯤鵬芯片基于 ARM 架構(gòu),對(duì)指令的消耗和指令間依賴關(guān)系的處理進(jìn)行了優(yōu)化和增強(qiáng)。鯤鵬 GCC 編譯器導(dǎo)入了基于鯤鵬芯片的指令模型,使得指令流水優(yōu)化的結(jié)果能夠更加適合鯤鵬芯片的執(zhí)行,提升鯤鵬軟件運(yùn)行的性能。經(jīng)測(cè)試,該優(yōu)化可以給 SPEC CPU 2006benchmark 帶來(lái)2%的整體性能提升。
高性能運(yùn)算庫(kù)——極致性能的數(shù)學(xué)庫(kù)和矢量數(shù)學(xué)函數(shù)
HPC 領(lǐng)域會(huì)運(yùn)用到大量的數(shù)學(xué)函數(shù)計(jì)算,如 pow、sinf、log 等,也經(jīng)常需要對(duì)整個(gè)數(shù)組內(nèi)的數(shù)據(jù)做數(shù)學(xué)函數(shù)運(yùn)算。如下圖舉例所示,左邊是需要對(duì) a 數(shù)組的所有數(shù)據(jù)進(jìn)行 sinf 數(shù)學(xué)計(jì)算。
正常情況下會(huì)循環(huán)遍歷 a 數(shù)組依次對(duì)每個(gè)數(shù)據(jù)進(jìn)行 sinf 數(shù)學(xué)計(jì)算,無(wú)法獲得進(jìn)一步的性能提升空間。鯤鵬 GCC 編譯器能夠識(shí)別該場(chǎng)景,自動(dòng)將 sinf 數(shù)學(xué)函數(shù)的調(diào)用轉(zhuǎn)化為矢量化 vec_sinf 的數(shù)學(xué)調(diào)用,能夠同時(shí)處理四個(gè)數(shù)據(jù)的 sinf 數(shù)學(xué)計(jì)算,并矢量化存取數(shù)據(jù),得到性能的提升。經(jīng)測(cè)試,該優(yōu)化可以給 HPC 領(lǐng)域 NEMO 應(yīng)用帶來(lái)6%的性能提升。
矢量數(shù)學(xué)函數(shù)優(yōu)化原理示意圖
本文我們主要介紹了鯤鵬 GCC 編譯器具有代表性的三方面優(yōu)化特性:前中端編譯算法優(yōu)化、后端指令優(yōu)化、運(yùn)行時(shí)庫(kù)優(yōu)化。除此之外,還有軟件預(yù)取、循環(huán)優(yōu)化、分支預(yù)測(cè)、矢量化等編譯優(yōu)化特性的開(kāi)發(fā)應(yīng)用。
編輯:jq
-
芯片
+關(guān)注
關(guān)注
459文章
52291瀏覽量
437635 -
GCC
+關(guān)注
關(guān)注
0文章
110瀏覽量
25276 -
編譯器
+關(guān)注
關(guān)注
1文章
1657瀏覽量
49968 -
HPC
+關(guān)注
關(guān)注
0文章
333瀏覽量
24235
原文標(biāo)題:【鯤鵬 DevKit 黑科技揭秘】┃鯤鵬GCC編譯器,釋放鯤鵬澎湃算力
文章出處:【微信號(hào):gh_3a181fa836b6,微信公眾號(hào):華為計(jì)算】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
萬(wàn)里紅入選安全大模型及Agentic AI賦能網(wǎng)絡(luò)安全代表性廠商
什么樣的代碼會(huì)被編譯器優(yōu)化
Triton編譯器與GPU編程的結(jié)合應(yīng)用
Triton編譯器如何提升編程效率
Triton編譯器的優(yōu)化技巧
Triton編譯器的優(yōu)勢(shì)與劣勢(shì)分析
Triton編譯器在機(jī)器學(xué)習(xí)中的應(yīng)用
Triton編譯器與其他編譯器的比較
Triton編譯器功能介紹 Triton編譯器使用教程
分享關(guān)于編譯器的科普
C7000優(yōu)化C/C++編譯器

Keil編譯器優(yōu)化方法

評(píng)論