當(dāng)前位置:首頁(yè) > EDA > 電子設(shè)計(jì)自動(dòng)化
[導(dǎo)讀]眾所周知,匯編語(yǔ)言具有更高的性能優(yōu)勢(shì),而用C語(yǔ)言編碼則能更容易和快速地實(shí)現(xiàn)。DSP處理器功能的不斷增強(qiáng)以及編譯器優(yōu)化技術(shù)的提高,使得傳統(tǒng)的用匯編語(yǔ)言編寫DSP應(yīng)用程序的做法逐漸被淘汰?,F(xiàn)在的DSP應(yīng)用程序幾乎都

眾所周知,匯編語(yǔ)言具有更高的性能優(yōu)勢(shì),而用C語(yǔ)言編碼則能更容易和快速地實(shí)現(xiàn)。DSP處理器功能的不斷增強(qiáng)以及編譯器優(yōu)化技術(shù)的提高,使得傳統(tǒng)的用匯編語(yǔ)言編寫DSP應(yīng)用程序的做法逐漸被淘汰。現(xiàn)在的DSP應(yīng)用程序幾乎都是由C代碼和匯編代碼混合組成的。在那些對(duì)性能起決定性作用的關(guān)鍵功能中,DSP工程師將繼續(xù)使用高度優(yōu)化的匯編代碼,同時(shí)轉(zhuǎn)用C語(yǔ)言編寫那些不太關(guān)鍵的功能,這將有利于代碼維護(hù)和移植。而C和匯編代碼的這種結(jié)合要求DSP工程師具備專門的工具和方法。

正確混合C代碼和匯編代碼

問(wèn)題是在哪里劃分C代碼和匯編代碼的界限。這取決于跟蹤器(profiler)所能提供的性能分析結(jié)果。然而在使用跟蹤器之前,DSP工程師需要為應(yīng)用程序定義清晰的目標(biāo),這些目標(biāo)一般包括循環(huán)數(shù)、代碼規(guī)模和數(shù)據(jù)量。目標(biāo)一旦確定后,應(yīng)該先全部用C語(yǔ)言編寫和創(chuàng)建應(yīng)用程序,然后才使用跟蹤器來(lái)分析性能。

在某些特定情況下,主要是控制應(yīng)用中,C語(yǔ)言級(jí)的編碼就足夠了。但在大多數(shù)情況下,初始編寫的C語(yǔ)言應(yīng)用程序是不能滿足一個(gè)或更多目標(biāo)要求的。這通常意味著多少需要一些匯編代碼。在求助于匯編編程之前,強(qiáng)烈建議保存原始的C代碼。這樣不僅方便調(diào)試,而且當(dāng)條件成熟(比如采用更強(qiáng)大的平臺(tái)),還可以返回到這些C語(yǔ)言的實(shí)現(xiàn)。

匯編部分代碼應(yīng)盡可能少。為此,工程師需要認(rèn)真分析跟蹤器提供的性能結(jié)果,并確定應(yīng)用程序中的關(guān)鍵函數(shù)。關(guān)鍵函數(shù)是指占用大部分執(zhí)行時(shí)間,而必須用匯編語(yǔ)言重寫才能滿足性能目標(biāo)的那些函數(shù)。重寫其中的幾個(gè)關(guān)鍵函數(shù)后,需要重新進(jìn)行性能分析。如果仍達(dá)不到目標(biāo)要求,那就應(yīng)該確定其它關(guān)鍵函數(shù),再進(jìn)行重寫。圖1顯示了利用專用硬件機(jī)制獲得高度優(yōu)化的匯編代碼。


圖1:用C語(yǔ)言創(chuàng)建的循環(huán)緩沖器代碼(左)以及由CEVA-teakLite-III創(chuàng)建的等效匯編代碼(右)。

對(duì)編譯器的考慮事項(xiàng)

在編寫需要與C代碼結(jié)合的匯編代碼時(shí),匯編編程人員必須了解編譯器的約定和假設(shè)。匯編編程人員還必須了解編譯器的寄存器使用約定。通常,寄存器使用約定將硬件寄存器分成被調(diào)用方保存(或調(diào)用方使用)和被調(diào)用方使用(或調(diào)用方保存)寄存器。

圖2給出了從CEVA-X1641 DSP內(nèi)核FFT實(shí)現(xiàn)中摘取的匯編代碼例子。左邊第二行的add指令符合CEVA-X1641編譯器傳遞r0地址寄存器中指針參數(shù)的調(diào)用約定。右邊的pushd指令用于備份后面函數(shù)會(huì)用到的被調(diào)用方保存寄存器。


圖2:從CEVA-X1641 DSP內(nèi)核的FFT實(shí)現(xiàn)中摘取的一段匯編代碼。

除了調(diào)用約定和寄存器使用約定外,一些編譯器在人工編寫的匯編代碼方面可能還會(huì)有一些額外的假設(shè)。這些假設(shè)通常是專門針對(duì)某個(gè)編譯器的,因此編譯器提供商會(huì)提供完善的資料和說(shuō)明。

用于C和匯編連接的常用C語(yǔ)言擴(kuò)展

用于嵌入式平臺(tái)的大多數(shù)編譯器,特別是用于DSP編程的編譯器,都具有豐富的C語(yǔ)言和匯編語(yǔ)言連接功能。其中絕大部分功能不屬于標(biāo)準(zhǔn)C語(yǔ)言,因此被稱為C語(yǔ)言擴(kuò)展。下面列出的是其中有益于DSP編程的一些功能。

內(nèi)聯(lián)匯編(inline assembly):該功能可以幫助編程人員將匯編指令插入C代碼。

硬件寄存器綁定C變量:該功能經(jīng)常與匯編指令內(nèi)聯(lián)功能結(jié)合在一起,幫助內(nèi)聯(lián)匯編代碼訪問(wèn)C語(yǔ)言級(jí)的變量(見圖3)。


圖3:結(jié)合內(nèi)聯(lián)匯編和硬件寄存器綁定功能的代碼示例。

存儲(chǔ)區(qū)屬性:該功能允許編程人員將上述變量和函數(shù)分配到獨(dú)特的用戶定義存儲(chǔ)區(qū),可以讓編程人員將C語(yǔ)言級(jí)單元分配到實(shí)際的存儲(chǔ)器位置,這對(duì)DSP應(yīng)用來(lái)說(shuō)非常關(guān)鍵。

用戶定義的調(diào)用約定:在某些情況下,匯編函數(shù)可以通過(guò)用戶定義的調(diào)用約定取得更好的優(yōu)化效果。

編譯器內(nèi)部函數(shù)(Compiler intrinsics):是指能夠使用專門的宏或函數(shù)調(diào)用觸發(fā)的內(nèi)建編譯器功能總稱。沒(méi)有內(nèi)部函數(shù)支持的編譯器必須調(diào)用用戶定義的函數(shù),這樣做可能會(huì)令用戶定義函數(shù)可能會(huì)在一個(gè)環(huán)路里產(chǎn)生函數(shù)調(diào)用和返回(見圖4),從而產(chǎn)生巨大的開銷。


圖4:ETSI的mult_r(乘法和取整)基本操作的C代碼實(shí)現(xiàn)(左)和對(duì)應(yīng)的由CEVA-TeakLite-III編譯器生成的匯編代碼(右)。

匯編內(nèi)部函數(shù):是將匯編代碼內(nèi)聯(lián)進(jìn)C代碼的一種先進(jìn)方法,下文將有詳細(xì)介紹。

把匯編指令當(dāng)作C語(yǔ)句一樣來(lái)編寫

內(nèi)聯(lián)匯編功能具有顯著的缺點(diǎn)。它會(huì)破壞各種編譯器優(yōu)化操作,因?yàn)榫幾g器不了解內(nèi)聯(lián)代碼的內(nèi)容,會(huì)使用最壞假設(shè);以及它可能迫使編程人員處理底層問(wèn)題,如寄存器分配和指令調(diào)度。

匯編內(nèi)部函數(shù)可以幫助編程人員實(shí)現(xiàn)內(nèi)聯(lián)匯編代碼,并且不存在這些缺點(diǎn)。從編程人員的角度看,匯編內(nèi)部函數(shù)就像是C語(yǔ)言宏或函數(shù)。它們接收C語(yǔ)言變量,返回C語(yǔ)言輸出結(jié)果,同時(shí)表現(xiàn)為單個(gè)匯編指令。由于涉及該功能的所有代碼都在C語(yǔ)言等級(jí),因此編程人員不必?fù)?dān)心寄存器分配、指令調(diào)度和其它底層問(wèn)題。匯編內(nèi)部函數(shù)不僅不會(huì)妨礙編譯器優(yōu)化操作,還會(huì)參與優(yōu)化過(guò)程,就像它們是編譯器正常產(chǎn)生的匯編指令一樣。這些特征使得匯編內(nèi)部函數(shù)的功能非常強(qiáng)大。

利用匯編內(nèi)部函數(shù),編程人員可以從編譯器不可能產(chǎn)生的獨(dú)特匯編指令中受益。例如,CEVA-X1641的bitrev(位反向)指令就是為FFT等算法定制的。由于編譯器不太可能把一個(gè)程序看作一個(gè)FFT并使用bitrev指令,因此編程人員可以完全把bitrev匯編內(nèi)部功能嵌入到C代碼中。結(jié)合對(duì)應(yīng)用的透徹了解,編程人員還可以使用C應(yīng)用程序的性能決定段里的精確序列匯編內(nèi)部函數(shù),從而能夠確保編譯器生成的代碼效率就像手工編寫的一樣高。

圖5是CEVA-X1641編譯器與匯編內(nèi)部函數(shù)一起使用的例子。匯編內(nèi)部函數(shù)還受益于由CEVA-X1641編譯器處理的問(wèn)題所決定的機(jī)器,如寄存器分配、指令調(diào)度和硬件單元分配。


圖5:CEVA-X1641編譯器支持的匯編內(nèi)部函數(shù)的使用。

調(diào)試混合代碼的應(yīng)用程序

匯編代碼的調(diào)試需要對(duì)延遲和存儲(chǔ)器對(duì)齊限制等架構(gòu)和機(jī)器級(jí)問(wèn)題有深入的了解。只是簡(jiǎn)單地把C代碼和匯編代碼放在一起會(huì)使事情更麻煩,因?yàn)榫幊倘藛T現(xiàn)在還必須調(diào)試C代碼和匯編代碼之間的連接。

調(diào)試混合代碼應(yīng)用程序的第一步就是分隔問(wèn)題。假設(shè)保持匯編代碼的C語(yǔ)言實(shí)現(xiàn)不變以及C語(yǔ)言實(shí)現(xiàn)方案工作正常,那么將匯編函數(shù)轉(zhuǎn)換成C語(yǔ)言實(shí)現(xiàn)并重新測(cè)試應(yīng)用程序就相對(duì)比較容易。為了迅速檢測(cè)出問(wèn)題,編程人員可以在每一步把受懷疑函數(shù)的一半轉(zhuǎn)換為相應(yīng)的C語(yǔ)言實(shí)現(xiàn)方案。

一旦有問(wèn)題的匯編函數(shù)被確定,它就應(yīng)該同時(shí)作為獨(dú)立的匯編問(wèn)題和C與匯編的連接問(wèn)題加以分析。調(diào)試獨(dú)立的匯編問(wèn)題對(duì)匯編編程人員來(lái)說(shuō)十分簡(jiǎn)單明了,但C與匯編的連接問(wèn)題就有點(diǎn)麻煩。在考慮匯編函數(shù)本身時(shí),C與匯編的連接問(wèn)題是不可見的,這與獨(dú)立的匯編問(wèn)題有所不同。為了找出這些問(wèn)題,編程人員必須檢查編譯器的約定,比如調(diào)用約定和寄存器使用約定。

編程人員還必須檢查編譯器假設(shè),比如匯編指令的行蹤。為了節(jié)省調(diào)試時(shí)間,編程人員應(yīng)該在第一次實(shí)現(xiàn)匯編函數(shù)時(shí)驗(yàn)證是否遵循所有的編譯器約定和假設(shè)。

案例研究:H.264視頻編碼器和AMR-NB

本文討論的技術(shù)和方法已被CEVA公司用于各種各樣的應(yīng)用,包括視頻編解碼器、音頻編解碼器、聲音合成器和設(shè)備驅(qū)動(dòng)器。而本文所述的功能在這些應(yīng)用中都可以顯著提高性能。H.264視頻編碼器是一個(gè)很好的研究案例。它在處理能力及其它資源方面要求非常嚴(yán)格,尤其是相比語(yǔ)音編解碼器等其它類型的編解碼器而言。

CEVA公司的CEVA-X16xx高端DSP內(nèi)核系列及其MM2000多媒體平臺(tái)可以為這種編碼器提供所需的處理能力。先用高級(jí)跟蹤技術(shù)確定這種編碼器的關(guān)鍵函數(shù),然后逐步對(duì)之進(jìn)行優(yōu)化。首先,利用匯編內(nèi)部函數(shù)在C語(yǔ)言級(jí)對(duì)這些函數(shù)進(jìn)行全面優(yōu)化。然后,在匯編語(yǔ)言級(jí)對(duì)編譯器提供的匯編代碼作進(jìn)一步優(yōu)化。

圖6展示了通過(guò)對(duì)這種編碼器的關(guān)鍵函數(shù)進(jìn)行全面優(yōu)化所獲得的性能提高。只有最后一個(gè)優(yōu)化階段涉及到純匯編編程,所有其它階段都基于帶有匯編內(nèi)部函數(shù)的C代碼。這些匯編內(nèi)部函數(shù)主要用于SIMD操作,如avg_acW_acX_acZ_4b。這條指令對(duì)8個(gè)輸入字節(jié)取平均,產(chǎn)生4字節(jié)結(jié)果。這種SIMD操作對(duì)執(zhí)行大量字節(jié)級(jí)計(jì)算的視頻編解碼器非常有用。


圖6:對(duì)H.264編碼器的關(guān)鍵函數(shù)進(jìn)行優(yōu)化以提升性能。

AMR-NB(自適應(yīng)多速率-窄帶)是廣泛用于無(wú)線通信應(yīng)用的語(yǔ)音編解碼器。通常都是采用純匯編來(lái)實(shí)現(xiàn)聲音合成器,但C語(yǔ)言實(shí)現(xiàn)與CEVA-X1620編譯器利用本文討論的各種功能可以獲得與匯編實(shí)現(xiàn)媲美的結(jié)果。圖7顯示了整個(gè)AMR-NB應(yīng)用經(jīng)過(guò)全面優(yōu)化而取得的以MCPS(每秒百萬(wàn)周期)計(jì)的性能提高幅度。只有最后的優(yōu)化階段涉及到了純匯編編程,所有其它階段都基于帶有ETSI內(nèi)部函數(shù)和匯編內(nèi)部函數(shù)等的C代碼。


圖7:通過(guò)各種優(yōu)化方法取得的ARM-NB性能改進(jìn)。

總之,H.264編碼器和AMR-NB例子清楚地表明了匯編實(shí)現(xiàn)方案的性能優(yōu)勢(shì),但也表明純匯編實(shí)現(xiàn)并非首選的優(yōu)化方法。利用高質(zhì)量軟件開發(fā)工具提供的C與匯編功能,DSP編程人員無(wú)需純匯編語(yǔ)言也能使整個(gè)應(yīng)用程序達(dá)到令人滿意的性能。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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