《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 源碼級(jí)和算法級(jí)的功耗測(cè)試與優(yōu)化
源碼級(jí)和算法級(jí)的功耗測(cè)試與優(yōu)化
中電網(wǎng)
廖海艷 范明明
摘要: 軟件設(shè)計(jì)中,代碼優(yōu)化是一件非常有意義的事情,。優(yōu)化的本質(zhì)是對(duì)代碼進(jìn)行等價(jià)變換,,使變換前后的代碼運(yùn)行結(jié)果相同,,但變換后的代碼比變換前的代碼具有更多優(yōu)越性能,。傳統(tǒng)的觀點(diǎn)要求變換后的代碼運(yùn)行速度較快或占用較少運(yùn)行資源,,或二者兼?zhèn)洹kS著嵌人式系統(tǒng)的快速發(fā)展,,軟件功耗問題顯得越來越重要,,應(yīng)該將“省電”作為軟件優(yōu)化的一項(xiàng)技術(shù)指標(biāo),這樣對(duì)軟件優(yōu)化的評(píng)價(jià)體系才算完整,。值得注意的是,,大多數(shù)情況下性能和功耗并不矛盾,減少程序執(zhí)行時(shí)間同樣會(huì)使程序功耗減少,。
關(guān)鍵詞: 源碼級(jí) 算法 測(cè)試
Abstract:
Key words :

軟件設(shè)計(jì)中,,代碼優(yōu)化是一件非常有意義的事情。優(yōu)化的本質(zhì)是對(duì)代碼進(jìn)行等價(jià)變換,,使變換前后的代碼運(yùn)行結(jié)果相同,,但變換后的代碼比變換前的代碼具有更多優(yōu)越性能。傳統(tǒng)的觀點(diǎn)要求變換后的代碼運(yùn)行速度較快或占用較少運(yùn)行資源,,或二者兼?zhèn)?。隨著嵌人式系統(tǒng)的快速發(fā)展,軟件功耗問題顯得越來越重要,,應(yīng)該將“省電”作為軟件優(yōu)化的一項(xiàng)技術(shù)指標(biāo),,這樣對(duì)軟件優(yōu)化的評(píng)價(jià)體系才算完整。值得注意的是,,大多數(shù)情況下性能和功耗并不矛盾,,減少程序執(zhí)行時(shí)間同樣會(huì)使程序功耗減少。

在功耗優(yōu)化這個(gè)問題上,,研究者普遍比較關(guān)注硬件功耗優(yōu)化,,應(yīng)用各種技術(shù)想方設(shè)法改進(jìn)硬件的功耗,比如在芯片制造工藝上采用更精細(xì)的納米技術(shù),,不斷降低芯片驅(qū)動(dòng)電壓,,不斷改變片內(nèi)系統(tǒng)結(jié)構(gòu)等。事實(shí)上,,整個(gè)系統(tǒng)的運(yùn)行管理是由軟件體現(xiàn)的,。在硬件基礎(chǔ)一定的情況下,只有將軟件系統(tǒng)對(duì)能量的損耗降至最小,,才能使整個(gè)系統(tǒng)工作于最佳狀態(tài),。面向功耗的軟件優(yōu)化方法是當(dāng)前嵌入式系統(tǒng)低功耗研究領(lǐng)域的熱點(diǎn)。掌握軟件運(yùn)行時(shí)的能量消耗特征,、準(zhǔn)確獲取能量消耗數(shù)據(jù)信息,,是面向低功耗的軟件優(yōu)化研究的前提,。經(jīng)過多年的努力,許多學(xué)者也提出了關(guān)于如何減少軟件功耗的方法,。研究表明,,軟件優(yōu)化對(duì)降低功耗會(huì)有數(shù)量級(jí)的貢獻(xiàn)。針對(duì)同一任務(wù),,所選擇的算法不同或采用不同的實(shí)現(xiàn)方式,,不僅性能有差別,能耗也大不一樣,。因此在進(jìn)行系統(tǒng)優(yōu)化設(shè)計(jì)時(shí),,除了代碼的規(guī)模和執(zhí)行性能之外,功耗也是一個(gè)需要認(rèn)真考慮的問題,。

1軟件功耗優(yōu)化方法

常用的軟件功耗優(yōu)化方法大致可分為以下4類:

(1)軟件體系結(jié)構(gòu)級(jí)

不存在沒有體系結(jié)構(gòu)的軟件,。通常考慮軟件體系結(jié)構(gòu)都是注重軟件的可修改性,、可重用性和可靠性等問題,,軟件體系結(jié)構(gòu)的好壞直接關(guān)系到軟件性能的好壞。而且前,,關(guān)于軟件體系結(jié)構(gòu)對(duì)軟件功耗影響這方面的研究較少,,用不同軟件體系結(jié)構(gòu)開發(fā)出的軟件功耗會(huì)有差異,怎樣選擇合適的軟件體系結(jié)構(gòu)使軟件功耗最小化,,將成為軟件低功耗優(yōu)化的重要研究方向,。

(2)源程序級(jí)

C語言的源程序級(jí)功耗優(yōu)化指的是實(shí)現(xiàn)同一功能的不同語句間的選擇。比如,,同樣實(shí)現(xiàn)循環(huán)功能,,有多種選擇(for、while,、goto等),。這些語句的功耗會(huì)有差異,為了實(shí)現(xiàn)低功耗的軟件,,應(yīng)采用功耗最低的語句來完成相同的功能,。這就需要對(duì)所有語句的功耗進(jìn)行測(cè)試與研究。同時(shí),,對(duì)C語言不同數(shù)據(jù)類型操作的功耗進(jìn)行分析,。比如,同樣表示數(shù)目,,可以用8位int型,、16位int型和32位int型,。再者,對(duì)不同變量的存儲(chǔ)類型功耗也要進(jìn)行分析,,如寄存器變量、靜態(tài)變量,、自動(dòng)變量等,??傊?,在源碼級(jí)對(duì)軟件功耗進(jìn)行優(yōu)化是一個(gè)重要的研究方向。

(3)算法級(jí)

算法是為解決某個(gè)特定問題而定義的無二義性的操作序列,,算法復(fù)雜性分析就是對(duì)算法運(yùn)行時(shí)所消耗的計(jì)算機(jī)資源作量化的分析和預(yù)測(cè)。以往,,程序設(shè)計(jì)者關(guān)心的資源主要是運(yùn)行時(shí)間和存儲(chǔ)空間。由于能量消耗已成為軟件設(shè)計(jì)中的關(guān)鍵約束條件,,因此本文將能耗作為一項(xiàng)重要資源,對(duì)算法運(yùn)行時(shí)所消耗的能量進(jìn)行分析和比較,。

(4)編譯級(jí)

對(duì)于某個(gè)硬件來說,,執(zhí)行程序所產(chǎn)生的功耗取決于它的機(jī)器代碼,,而機(jī)器代碼是從源代碼編譯而來的,,這就說明編譯過程也影響了硬件的功耗,。既然編譯器可以很大程度上控制硬件的運(yùn)行軌跡,除了性能這一傳統(tǒng)的優(yōu)化目標(biāo)之外,,編譯器也可以通過適當(dāng)?shù)恼{(diào)度優(yōu)化,,使得硬件執(zhí)行某一個(gè)程序時(shí)的功耗變小,。國(guó)際上對(duì)于低功耗編譯的歷史并不長(zhǎng),,是從20世紀(jì)90年代初才開始研究的,這方面的文章最早出現(xiàn)于文獻(xiàn)[4-5],,Tiwari等人在這些文章中提出了對(duì)軟件進(jìn)行功耗分析的一些基本概念,,建立了基本的指令級(jí)功耗模型,以486DX為例初步探討了低功耗編譯技術(shù),。

本文主要從源程序級(jí)和算法級(jí)這兩個(gè)方面對(duì)軟件功耗特征進(jìn)行測(cè)試與分析,并根據(jù)分析結(jié)果對(duì)μC/OS-II進(jìn)行源碼級(jí)的功耗優(yōu)化,。

2源碼級(jí)和算法級(jí)的功耗測(cè)試

測(cè)試環(huán)境是T.K.Tan等人研發(fā)的EMSIM,,它是一個(gè)基于指令級(jí)的嵌入式軟件功耗模擬器,,其主要的功耗估算思想是累計(jì)函數(shù)中所有單條指令的功耗作為該函數(shù)的總功耗。嵌入式硬件平臺(tái)是ARM公司的StrongARM110,。EMSIM測(cè)試功耗的單位為函數(shù),即它只能測(cè)試某個(gè)函數(shù)的功耗,。在本文的測(cè)試中,,將要測(cè)試的語句放入函數(shù)中,測(cè)得整個(gè)函數(shù)的功耗,,記為E1,然后測(cè)試同樣參數(shù)及返回值的空語句函數(shù)的功耗,,記為E2,,最后計(jì)算得到語句的功耗為:E=E1-E2,。

2.1源碼級(jí)的功耗測(cè)試

本小節(jié)對(duì)C語言的源碼級(jí)功耗進(jìn)行測(cè)試,測(cè)試過程分為以下幾步:

①對(duì)每種數(shù)據(jù)類型的不同操作的功耗進(jìn)行測(cè)試,。要測(cè)試8位整型,、16位整型,、32位整型以及32位浮點(diǎn)型和64位浮點(diǎn)型的基本操作功耗。基本操作有:加,、減,、乘、除,、取余,、賦值、移位,、與,、或、非,。此處測(cè)試的結(jié)果與處理器的位數(shù)有關(guān),,StrongARM110為32位精簡(jiǎn)指令集系統(tǒng),在此基礎(chǔ)上測(cè)試的結(jié)果如表1所列,。

 

從表1可知,,對(duì)于相同數(shù)據(jù)類型,,加、減,、乘、除和取余操作的功耗一樣,,與,、或、非操作的功耗一樣,,而移位功耗最低,。對(duì)于不同數(shù)據(jù)類型來說,,32位數(shù)比16位數(shù)的操作功耗低,16位數(shù)比8位數(shù)的操作功耗低,。32位浮點(diǎn)數(shù)與32位整形數(shù)的操作功耗一樣,。在所有數(shù)據(jù)類型中64位浮點(diǎn)數(shù)的操作功耗最高。

測(cè)試環(huán)境的處理器StrongARM110為32位處理器,,對(duì)8位數(shù)和16位數(shù)的處理要考慮字節(jié)對(duì)齊問題,,而對(duì)32位就不用考慮該問題。

②對(duì)函數(shù),、內(nèi)聯(lián)函數(shù)和宏定義的功耗進(jìn)行測(cè)試,。如表2所列,內(nèi)聯(lián)函數(shù)和宏定義的功耗比一般函數(shù)的功耗低,CPU周期數(shù)及指令數(shù)也小,。

 

③對(duì)相同功能不同實(shí)現(xiàn)語句的功耗進(jìn)行測(cè)試,。主要針對(duì)循環(huán)語句,、選擇語句(二元和多元)、乘法,、移位,、除法,、移位進(jìn)行測(cè)試,測(cè)試結(jié)果如表3所列,。


 

從表3可知,,同樣實(shí)現(xiàn)循環(huán)功能,,for循環(huán)的功耗比while,、goto的要大,,goto語句的功耗明顯最低,;二元選擇運(yùn)算中三目運(yùn)算比if語句的功耗低,,但是只能在單條賦值語句中使用三目運(yùn)算,,在復(fù)雜的多條語句的情況下,兩者功耗一樣,;多元選擇運(yùn)算中,,switch語句比if…elseif…語句功耗低;寄存器變量的操作比自動(dòng)變量的操作功耗低近50%,,因?yàn)樘幚砥鲝募拇嫫骼镏苯幼x取變量省去了反復(fù)從內(nèi)存讀取變量的過程,,從而達(dá)到降低功耗的目的。

2.2算法級(jí)功耗測(cè)試

算法級(jí)功耗測(cè)試是比源碼級(jí)功耗測(cè)試更高一層次的測(cè)試,,不同的算法針對(duì)同一問題的考慮方面不同,,如可靠性,、易用性、時(shí)間復(fù)雜度,、空間復(fù)雜度,、功耗等。以往對(duì)軟件算法的研究著重在性能上面,本文把功耗作為主要考慮對(duì)象,,研究算法對(duì)功耗的影響。為了便于討論,,本文提出一具體問題,,針對(duì)該問題提出5種不同的算法,,然后分析這些算法對(duì)軟件功耗的影響,。

問題描述:對(duì)于1字節(jié)的變量v,,求其二進(jìn)制表示中1的個(gè)數(shù),。

算法1:用除法和取余實(shí)現(xiàn),。對(duì)于二進(jìn)制操作,,除以2,原來的數(shù)將會(huì)減少1個(gè)0,,如果在除的過程中有余,就表示當(dāng)前位置為1,。

算法2:使用與&(即移位>>)操作。&操作,,把8位數(shù)字v與00000001進(jìn)行與操作,如果結(jié)果為1,,表示當(dāng)前8位的最后1位為1,否則為0,,然后再將v右移1位,,循環(huán)進(jìn)行。

算法3:使用與&操作,,僅考慮v中1的個(gè)數(shù),。

算法4:使用分支操作,直接把0~255的情況都羅列出來,,使用switch…case…,,即可得到答案,。

算法5:使用查表法,,將0~255中1的個(gè)數(shù)直接存儲(chǔ)在數(shù)組Array中,v作為數(shù)組的下標(biāo),則Array[v]就是v中1的個(gè)數(shù),。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。