在《深入淺出編譯優(yōu)化選項(上)》中,我們介紹了如何在IAR Embedded Workbench編譯器中進(jìn)行編譯優(yōu)化等級配置、多文件編譯配置、靈活配置編譯優(yōu)化選項作用域、鏈接階段優(yōu)化選項配置等。
本文將進(jìn)一步探索編譯優(yōu)化技術(shù),介紹編譯優(yōu)化策略以及如何進(jìn)行編譯優(yōu)化微調(diào)項配置。如果把編譯優(yōu)化等級選項看作粗調(diào)參數(shù),那么編譯優(yōu)化微調(diào)項就可以比作細(xì)調(diào)參數(shù),幫助用戶進(jìn)一步打磨關(guān)鍵代碼的體積和性能的最佳配比。
編譯優(yōu)化等級如何對應(yīng)到編譯優(yōu)化策略
《深入淺出編譯優(yōu)化選項(上)》一文中的“編譯器代碼構(gòu)建過程”章節(jié)詳細(xì)介紹了代碼構(gòu)建過程,如上圖所示。圖中右邊紅框內(nèi)的內(nèi)容為編譯過程中所實施的編譯優(yōu)化策略,我們在配置編譯優(yōu)化等級時,其實就是配置了一組相對應(yīng)的編譯優(yōu)化策略。
以IAR Embedded Workbench(基于EWARM v9.32.2)編譯器為例,通過菜單欄(Project -> Options)打開項目選項界面,選中“C/C++ Compiler”欄目,并且在右邊選項卡選中“Optimizations”,即可進(jìn)行編譯優(yōu)化選項配置,如下圖所示。
IAR Embedded Workbench共分為4個優(yōu)化等級(None, Low, Medium, High),其中優(yōu)化等級 “High” 又分為3個子優(yōu)化等級(Balanced, Size, Speed)。下表總結(jié)各個優(yōu)化等級對應(yīng)的優(yōu)化策略組合。
由上表可以看出,各個編譯優(yōu)化等級包含了不同的編譯優(yōu)化策略組合,每種組合都是IAR根據(jù)大量用戶使用經(jīng)驗進(jìn)行配比,因此設(shè)置編譯優(yōu)化等級能夠滿足大多數(shù)軟件編譯優(yōu)化的需求。但是我們也看到上表中4個優(yōu)化等級對應(yīng)了10個以上的編譯優(yōu)化策略,如果能夠在設(shè)置編譯優(yōu)化等級的基礎(chǔ)上,再使能對優(yōu)化策略的精細(xì)配置,那么有助于用戶進(jìn)一步打磨關(guān)鍵代碼的體積和性能的最佳配比。
編譯優(yōu)化微調(diào)項配置
IAR Embedded Workbench編譯器作為一款業(yè)界領(lǐng)先的編譯工具鏈,除了提供最佳編譯性能之外,也提供了極其靈活的編譯優(yōu)化選項配置來滿足上述需求。用戶除了可以進(jìn)行編譯優(yōu)化等級的配置外,IAR Embedded Workbench還提供了編譯優(yōu)化微調(diào)項(Enabled transformations),在不同的編譯優(yōu)化等級中,可以進(jìn)一步打開或者關(guān)閉一些優(yōu)化策略,使得用戶可以根據(jù)關(guān)鍵代碼需求配置出更加精準(zhǔn)的編譯優(yōu)化策略組合。
具體微調(diào)選項在下圖中所示:
公共子表達(dá)式消除(Common subexpression elimination)
在編譯器優(yōu)化階段,消除程序中重復(fù)計算的表達(dá)式。如下圖示例,如果程序中存在多處使用相同的表達(dá)式,那么在進(jìn)行“公共子表達(dá)式消除”優(yōu)化后,只需要計算一次該表達(dá)式,然后將結(jié)果緩存起來供其他地方使用,從而減少程序的運行時間和計算量。
循環(huán)展開(Loop unrolling)
在編譯器優(yōu)化階段,將循環(huán)體中的代碼復(fù)制多次,以減少循環(huán)次數(shù)和內(nèi)存訪問次數(shù),從而提高程序的執(zhí)行效率。如下圖示例,如果程序中有一個循環(huán)體,每次循環(huán)都進(jìn)行一次printf操作,那么在進(jìn)行“循環(huán)展開”優(yōu)化后,可以將循環(huán)體中的代碼復(fù)制多次,從而減少循環(huán)次數(shù)和內(nèi)存訪問次數(shù),從而提高程序的執(zhí)行效率。
函數(shù)內(nèi)聯(lián)(Function inline)
指的是在編譯器優(yōu)化階段,將函數(shù)調(diào)用的代碼替換為函數(shù)本體代碼,從而減少函數(shù)調(diào)用的開銷和程序的執(zhí)行時間。如下圖示例,如果程序中有一個函數(shù)調(diào)用語句,那么在進(jìn)行“函數(shù)內(nèi)聯(lián)”優(yōu)化后,可以將函數(shù)調(diào)用語句替換為函數(shù)體中的代碼,從而避免了函數(shù)調(diào)用的開銷,同時也使得程序更加緊湊,提高程序的執(zhí)行效率。
代碼移動(Code motion)
指的是在編譯器優(yōu)化階段,將程序中的某些計算或操作移到可以共享的位置,以減少程序執(zhí)行時的計算量和內(nèi)存訪問次數(shù),從而提高程序的效率。如下圖示例,如果程序中有多處重復(fù)計算相同的表達(dá)式,那么在進(jìn)行“代碼移動”優(yōu)化后,可以將這些計算移到一個共享的位置,只計算一次,并將結(jié)果緩存起來供其他地方使用,從而減少程序的計算量和內(nèi)存訪問次數(shù)。
類型別名分析(Type-based alias analysis)
在嵌入式系統(tǒng)中,內(nèi)存訪問往往是非?!鞍嘿F”的操作,而內(nèi)存的訪問速度會影響系統(tǒng)的響應(yīng)速度和能耗。因此,在編寫嵌入式C代碼時,需要考慮如何盡可能減少內(nèi)存訪問次數(shù)以提高系統(tǒng)的性能。"類型別名分析"是一種編譯器優(yōu)化技術(shù),可在編譯代碼時識別出哪些變量指向了同一個內(nèi)存地址,從而可以更有效地使用內(nèi)存,并避免在訪問內(nèi)存時出現(xiàn)重復(fù)數(shù)據(jù)的加載和存儲。如下圖示例,優(yōu)化后,使用臨時變量i(通常保存在CPU寄存器)進(jìn)行計算并賦值給sum,而不使用*a,避免重新從內(nèi)存中加載,從而提高運行性能。
靜態(tài)聚類(Static clustering)
指的是在編譯器優(yōu)化階段,通過對代碼進(jìn)行靜態(tài)分析,將相關(guān)的代碼組合在一起,以便在執(zhí)行時能夠更好地利用硬件資源,提高程序的執(zhí)行效率和響應(yīng)速度。具體來說,“靜態(tài)聚類”技術(shù)會根據(jù)程序中的數(shù)據(jù)流分析,將具有相同數(shù)據(jù)依賴關(guān)系的代碼段組合成獨立的塊,然后為每個塊分配內(nèi)存空間,并將其存儲在連續(xù)的物理內(nèi)存地址上,以便在執(zhí)行時能夠更好地利用緩存和預(yù)取機(jī)制,減少內(nèi)存訪問延遲,提高程序的性能。
指令調(diào)度(Instruction scheduling)
指的是在編譯器優(yōu)化階段,重新安排程序中指令的順序,將需要等待某些操作完成的指令與其他指令分離開來,以優(yōu)化指令的執(zhí)行順序,從而減少CPU流水線上的空閑時間和內(nèi)存訪問次數(shù),以提高運行性能。
矢量化(Vectorization)
“矢量化”將順序循環(huán)轉(zhuǎn)換為 NEON 硬件矢量操作,無需編寫匯編代碼或使用內(nèi)部函數(shù)。這增強(qiáng)了便攜性。僅當(dāng)目標(biāo)處理器具有 NEON 功能并啟用了自動矢量化時,才會對循環(huán)進(jìn)行矢量化。
編譯優(yōu)化微調(diào)選項
對代碼體積和代碼性能的影響
以上編譯優(yōu)化微調(diào)選項會對生成的代碼體積和性能產(chǎn)生不同的影響,用戶可以根據(jù)下表進(jìn)行按需配置。
總結(jié)
了解各項編譯器優(yōu)化選項的定義和使用,用戶就可以按照項目需求,嵌入式應(yīng)用特點,靈活的配置編譯器優(yōu)化,實現(xiàn)嵌入式軟件代碼性能和體積達(dá)到最佳平衡點。
IAR Embedded Workbench是一款業(yè)界領(lǐng)先的編譯工具鏈,除了提供卓越的性能之外,也提供了豐富靈活的編譯優(yōu)化選項配置,可以幫助用戶在不同的嵌入式軟件應(yīng)用需求下,都能配比出最佳代碼性能和代碼體積。
審核編輯:湯梓紅
-
IAR
+關(guān)注
關(guān)注
5文章
350瀏覽量
36664 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
C++
+關(guān)注
關(guān)注
22文章
2108瀏覽量
73618 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521 -
編譯器
+關(guān)注
關(guān)注
1文章
1623瀏覽量
49108
原文標(biāo)題:深入淺出編譯優(yōu)化選項(下)
文章出處:【微信號:IAR愛亞系統(tǒng),微信公眾號:IAR愛亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論