色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > EDA/PCB > 設計應用 > 利用C和匯編語言混合編程實現(xiàn)DSP軟件設計

          利用C和匯編語言混合編程實現(xiàn)DSP軟件設計

          作者: 時間:2012-08-29 來源:網(wǎng)絡 收藏

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


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

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

          把匯編指令當作C語句一樣來編寫

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

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

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

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


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

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

          匯編代碼的調(diào)試需要對延遲和存儲器對齊限制等架構(gòu)和機器級問題有深入的了解。只是簡單地把C代碼和匯編代碼放在一起會使事情更麻煩,因為編程人員現(xiàn)在還必須調(diào)試C代碼和匯編代碼之間的連接。

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

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

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

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

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

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

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


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



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉