當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]一種C/C++程序優(yōu)化技術(shù)的實現(xiàn)

引 言

DSP(digital signal processor)是一種獨特的微處理器,是以數(shù)字信號來處理大量信息的器件。其工作原理是接收模擬信號,轉(zhuǎn)換為0或1的數(shù)字信號。再對數(shù)字信號進(jìn)行修改、刪除、強化,并在其他系統(tǒng)芯片中把數(shù)字?jǐn)?shù)據(jù)解譯回模擬數(shù)據(jù)或?qū)嶋H環(huán)境格式。它不僅具有可編程性,而且其實時運行速度可達(dá)每秒數(shù)以千萬條復(fù)雜指令程序,遠(yuǎn)遠(yuǎn)超過通用微處理器,是數(shù)字化電子世界中日益重要的電腦芯片。它的強大數(shù)據(jù)處理能力和高運行速度,是最值得稱道的兩大特色。

目前在DSP平臺上編程多使用匯編語言與C語言,為了追求代碼的高效,過去一般用匯編語言來編制。DSP程序匯編語言簡潔高效,能夠直接操作DSP的內(nèi)部寄存器、存儲空間、外設(shè),但可讀性、可修改性、可移植性較差;隨著DSP應(yīng)用范圍不斷延伸,應(yīng)用的日趨復(fù)雜,匯編語言程序在可讀性、可修改性、可移植性和可重用性的缺點日益突出,軟件需求與軟件生產(chǎn)力之間的矛盾日益嚴(yán)重。DSP產(chǎn)業(yè)在約40年的歷程中經(jīng)歷了三個階段:第一階段,DSP意味著數(shù)字信號處理,并作為一個新的理論體系廣為流行。隨著這個時代的成熟,DSP進(jìn)入了發(fā)展的第二階段,在這個階段,DSP代表數(shù)字信號處理器,這些DSP器件使我們生活的許多方面都發(fā)生了巨大的變化。接下來又催生了第三階段,這是一個賦能(enablement)的時期,我們將看到DSP理論和DSP架構(gòu)都被嵌入到SoC類產(chǎn)品中。” 第一階段,DSP意味著數(shù)字信號處理 。 80年代開始了第二個階段,DSP從概念走向了產(chǎn)品,TMS32010所實現(xiàn)的出色性能和特性備受業(yè)界關(guān)注。方進(jìn)先生在一篇文章中提到,新興的DSP業(yè)務(wù)同時也承擔(dān)著巨大的風(fēng)險,究竟向哪里拓展是生死攸關(guān)的問題。當(dāng)設(shè)計師努力使DSP處理器每MIPS成本降到了適合于商用的低于10美元范圍時,DSP在軍事、工業(yè)和商業(yè)應(yīng)用中不斷獲得成功。

但由于DSF結(jié)構(gòu)的特殊性,使得該平臺上的C語言編譯器無法充分發(fā)揮DSP器件的性能優(yōu)勢。同樣功能的C語言程序,效率往往只有直接書寫的匯編程序的幾分之一甚至幾十分之一。

l TMS320C6000處理器介紹

TMS320C6000是TMS320系列產(chǎn)品中的新一代高性能DSP芯片,共分為兩大系列。其中定點系列為TMS320C62xx和TMS320C64xx;浮點系列為TMS320C67xx。由于TMS320C6000的開發(fā)主要面向數(shù)據(jù)密集型算法,它有著豐富的內(nèi)部資源和強大的運算能力。

C6000系列CPU中的8個功能單元可以并行操作,并且其中兩個功能單元為硬件乘法運算單元,大大地提高了乘法速度。DSP采用具有獨立程序總線和數(shù)據(jù)總線的哈佛總線結(jié)構(gòu),僅片內(nèi)程序總線寬度就可達(dá)到256位;片內(nèi)兩套數(shù)據(jù)總線的寬度分別為32位;此外,DSP還有一套32位DMA專用總線用于傳輸。靈活的總線結(jié)構(gòu)使得數(shù)據(jù)瓶頸對系統(tǒng)性能的限制大大緩解。C6000的通用寄存器組能支持32位和40位定點數(shù)據(jù)操作,另外C67xx和C64xx還分別支持64位雙精度數(shù)據(jù)和64位雙字定點數(shù)據(jù)操作。微處理器是低成本的,主要執(zhí)行智能定向控制任務(wù)的通用處理器能很好執(zhí)行智能控制任務(wù),但是數(shù)字信號處理功能很差。而DSP的功能正好與之相反。在許多應(yīng)用中均需要同時具有智能控制和數(shù)字信號處理兩種功能,如數(shù)字蜂窩電話就需要監(jiān)測和聲音處理功能。因此,把DSP和微處理器結(jié)合起來,用單一芯片的處理器實現(xiàn)這兩種功能,將加速個人通信機、智能電話、無線網(wǎng)絡(luò)產(chǎn)品的開發(fā),同時簡化設(shè)計,減小PCB體積,降低功耗和整個系統(tǒng)的成本。

2 C6000軟件開發(fā)流程

圖1為C6000的軟件開發(fā)流程圖。圖中陰影部分是開發(fā)C代碼的常規(guī)流程,其他部分用于輔助和加速開發(fā)討程。

C/C++源文件首先經(jīng)過C/C++編譯器(C/C++cornpiler)轉(zhuǎn)換為C6000匯編源代碼。編譯器、優(yōu)化器(optimizer)和交疊工具是C/C++編譯器的組成部分。編譯器使用戶能一步完成編譯、匯編和連接;優(yōu)化器調(diào)整合修改代碼以提高C程序的效率;交疊工具把C/C++語句和對應(yīng)的匯編語句交疊列出。

匯編源代碼再經(jīng)過匯編器(Assembier)翻譯為機器語言目標(biāo)文件。機器語言是基于通用目標(biāo)文件格式(CommON Object File Format,COFF)的。

連接器(Linker)連接目標(biāo)文件,生成一個可執(zhí)行文件。它要完成地址的重分配(Relocation)和解析外部引用(Resolve External References)。

得到可執(zhí)行文件之后就可以進(jìn)行調(diào)試??捎密浖抡嫫鳎⊿imulator)在PC機上對指令和運行時間進(jìn)行精確仿真;用XDS硬件仿真器(Emulator)在目標(biāo)板上進(jìn)行調(diào)試。

調(diào)試通過后即可下載到目標(biāo)板進(jìn)行獨立運行。

3 程序優(yōu)化流程及方法

3.1 程序優(yōu)化階段

由于DSP應(yīng)用的復(fù)雜度,在用C語言進(jìn)行DSP軟件開發(fā)時,一般先在基于通用微處理器的PC機或工作站上對算法進(jìn)行仿真,仿真通過后再將C程序移植到DSP平臺中。

所以,DSP的軟件開發(fā)與優(yōu)化流程主要分為3個階段:C代碼開發(fā)階段;C代碼優(yōu)化階段;手工匯編代碼重編寫階段。如圖2所示。
 

在圖2中,第一階段:沒有C6000知識的用戶能開發(fā)自己的C代碼,然后使用CCS中的代碼剖析工具,確定C代碼中可能存在的低效率段,為進(jìn)一步代碼優(yōu)化做好準(zhǔn)備。第二階段:C代碼優(yōu)化階段。在這個階段,主要利用intrinsics函數(shù)以及編譯器編譯選項來提高代碼的性能。優(yōu)化后利用軟件模擬器檢查代碼的效率,如仍不能達(dá)到期望的效率,則進(jìn)入第三階段。第三階段:寫線性匯編優(yōu)化。在這個階段中,用戶把最耗費時間的代碼抽取出來,重新用線性匯編寫,然后使用匯編優(yōu)化器優(yōu)化這些代碼。在第一次寫線性匯編時,可以不考慮流水線和寄存器分配。然后,提高線性匯編代碼性能,往代碼中添加更多的細(xì)節(jié)。

3.2 C/C++代碼優(yōu)化方法

為了使C/C++代碼獲得最好的性能,可以使用編譯選項、軟件流水、內(nèi)聯(lián)函數(shù)和循環(huán)展開等方法來對代碼進(jìn)行優(yōu)化,以提高代碼執(zhí)行速度,并減小代碼尺寸。

3.2.1 編譯器選項優(yōu)化

C/C++編譯器可以對代碼進(jìn)行不同級別的優(yōu)化。高級優(yōu)化由專門的優(yōu)化器完成,低級的和目標(biāo)DSP有關(guān)的優(yōu)化由代碼生成器完成。圖3為編譯器、優(yōu)化器和代碼生成器的執(zhí)行圖。

當(dāng)優(yōu)化器被激活時,將完成圖3所示的過程。C/C++語言源代碼首先通過一個完成預(yù)處理的解析器(Parser),生成一個中間文件(。if)作為優(yōu)化器(Optimi-zer)的輸入。

最簡單執(zhí)行優(yōu)化的方法是采用cl6x編譯程序,在命令行設(shè)置一On選項即可。n是優(yōu)化的級別(n為0,1,2,3),它控制優(yōu)化的類型和程度。

3.2.2 軟件流水優(yōu)化

軟件流水是編排循環(huán)指令,使循環(huán)的多次迭代并行執(zhí)行的技術(shù)。使用一02和一03選項編譯C/C++程序時,編譯器就從程序中收集信息,嘗試對程序循環(huán)做軟件流水。

圖4顯示一個軟件流水循環(huán)。圖4中A,B,C,D和E表示1次迭代中的各條指令;A1,A2,A3,A4和A5表示一條指令執(zhí)行的各階段。循環(huán)中,一個周期最多可并行執(zhí)行5條指令,即圖中陰影部分所示的循環(huán)核(Loop Kernel)部分。

3.2.3 內(nèi)聯(lián)函數(shù)優(yōu)化

通過下面的方法改進(jìn)C語言程序,可使編譯出的代碼性能顯著提高:

(1)使用intrinsics(內(nèi)聯(lián)函數(shù))替代復(fù)雜的C/C++代碼;

(2)使用字(Word)訪問存放在32位寄存器的高16位和低16位字段的數(shù)據(jù);

(3)使用雙字訪問存放在64位寄存器的32位數(shù)據(jù)(僅指C64xx/C67XX)。

C6000編譯器提供了許多內(nèi)聯(lián)函數(shù),它們直接對應(yīng)著C62X/C64X/C67X指令可快速優(yōu)化C代碼。這些內(nèi)聯(lián)函數(shù)不易用C/C++語言實現(xiàn)其功能。內(nèi)聯(lián)函數(shù)用前下劃線“_”特別標(biāo)示,其使用方法與調(diào)用函數(shù)一樣。例如C語言的飽和加法只能寫為需要多周期的函數(shù):
 

這段復(fù)雜的代碼可以用_sadd()內(nèi)聯(lián)函數(shù)實現(xiàn),它是一個單周期的C6x指令。

result=_sadd(a,b);

要提高C6000數(shù)據(jù)處理率,應(yīng)使一條Load/STore指令能訪問多個數(shù)據(jù)。C6000有與內(nèi)聯(lián)函數(shù)相關(guān)的指令,例如_add2(),_mpyhl(),_mpylh()等,這些操作數(shù)以16位數(shù)據(jù)形式存儲在32位寄存器的高位部分和低位部分。當(dāng)程序需要對一連串短型數(shù)據(jù)進(jìn)行操作時,可使用字1次訪問2個短型數(shù)據(jù),然后使用C6000相應(yīng)指令來處理數(shù)據(jù)。相似的在C64x或C67x中,有時需要執(zhí)行64位的LDDW來訪問兩個32位數(shù)據(jù),4個16位數(shù)據(jù),甚至8個8位數(shù)據(jù)。

3.2.4 循環(huán)展開

循環(huán)展開是改進(jìn)性能的另一種,即把小循環(huán)的迭代展開,以讓循環(huán)的每次迭代出現(xiàn)在代碼中。這種方法可增加并行執(zhí)行的指令數(shù)。

有3種使循環(huán)展開的方法:

(1)編譯器自動執(zhí)行循環(huán)展開;

(2)在程序中使用UNROLL偽指令建議編譯器做循環(huán)展開;

(3)用戶自己在C/C++代碼中展開。

3.3 匯編優(yōu)化

在對C/C++代碼使用了所有的C/C++優(yōu)化手段之后,如果仍然不滿意代碼的性能,就可以寫線性匯編程序,然后用匯編優(yōu)化器進(jìn)行優(yōu)化,生成高性能的代碼。

3.3.1 寫線性匯編

使用C6000的剖析工具(Profiling Tools)可以找到代碼中最耗費時間的部分,就是這部分需要用線性匯編重寫。線性匯編代碼與匯編源代碼相似,但是,線性匯編代碼中沒有指令延遲和寄存器使用信息。

寫線性匯編代碼時,需要知道:匯編優(yōu)化器偽指令、影響匯編優(yōu)化器行為的選項、TMS320C6000指令、線性匯編源語句語法、指定寄存器或寄存器組、指定功能單元、源代碼注釋等。

3.3.2 匯編優(yōu)化器優(yōu)化

匯編優(yōu)化器的任務(wù)主要有:

(1)編排指令,最大限度的利用C6000的并行能力;

(2)確保指令滿足C6000的延遲要求(Latency Requirements);

(3)為源代碼分配寄存器。

4 結(jié) 語

C6000系列的DSP C/c++代碼優(yōu)化比傳統(tǒng)的代碼優(yōu)化要方便的多,但要真正發(fā)揮其芯片的工作效率還是需要一定的經(jīng)驗和技巧。這不僅要求開發(fā)人員熟悉其硬件體系,還要求對編譯器的編譯原理有一定的理解。另外,在C語言層面上要達(dá)到DSP芯片的峰值即8條指令并行是很難的,大多情況下都只能達(dá)到6.7條指令并行。在實際開發(fā)中,若優(yōu)化結(jié)果已達(dá)到6,7條指令并行卻還離實時的要求相差很遠(yuǎn),再花大量的人力去力求達(dá)到8條指令并行是不經(jīng)濟的。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉