利用C和匯編語(yǔ)言混合編程實(shí)現DSP軟件設計
編譯器內部函數(Compiler intrinsics):是指能夠使用專(zhuān)門(mén)的宏或函數調用觸發(fā)的內建編譯器功能總稱(chēng)。沒(méi)有內部函數支持的編譯器必須調用用戶(hù)定義的函數,這樣做可能會(huì )令用戶(hù)定義函數可能會(huì )在一個(gè)環(huán)路里產(chǎn)生函數調用和返回(見(jiàn)圖4),從而產(chǎn)生巨大的開(kāi)銷(xiāo)。
圖4:ETSI的mult_r(乘法和取整)基本操作的C代碼實(shí)現(左)和對應的由CEVA-TeakLite-III編譯器生成的匯編代碼(右)。
匯編內部函數:是將匯編代碼內聯(lián)進(jìn)C代碼的一種先進(jìn)方法,下文將有詳細介紹。
把匯編指令當作C語(yǔ)句一樣來(lái)編寫(xiě)
內聯(lián)匯編功能具有顯著(zhù)的缺點(diǎn)。它會(huì )破壞各種編譯器優(yōu)化操作,因為編譯器不了解內聯(lián)代碼的內容,會(huì )使用最壞假設;以及它可能迫使編程人員處理底層問(wèn)題,如寄存器分配和指令調度。
匯編內部函數可以幫助編程人員實(shí)現內聯(lián)匯編代碼,并且不存在這些缺點(diǎn)。從編程人員的角度看,匯編內部函數就像是C語(yǔ)言宏或函數。它們接收C語(yǔ)言變量,返回C語(yǔ)言輸出結果,同時(shí)表現為單個(gè)匯編指令。由于涉及該功能的所有代碼都在C語(yǔ)言等級,因此編程人員不必擔心寄存器分配、指令調度和其它底層問(wèn)題。匯編內部函數不僅不會(huì )妨礙編譯器優(yōu)化操作,還會(huì )參與優(yōu)化過(guò)程,就像它們是編譯器正常產(chǎn)生的匯編指令一樣。這些特征使得匯編內部函數的功能非常強大。
利用匯編內部函數,編程人員可以從編譯器不可能產(chǎn)生的獨特匯編指令中受益。例如,CEVA-X1641的bitrev(位反向)指令就是為FFT等算法定制的。由于編譯器不太可能把一個(gè)程序看作一個(gè)FFT并使用bitrev指令,因此編程人員可以完全把bitrev匯編內部功能嵌入到C代碼中。結合對應用的透徹了解,編程人員還可以使用C應用程序的性能決定段里的精確序列匯編內部函數,從而能夠確保編譯器生成的代碼效率就像手工編寫(xiě)的一樣高。
圖5是CEVA-X1641編譯器與匯編內部函數一起使用的例子。匯編內部函數還受益于由CEVA-X1641編譯器處理的問(wèn)題所決定的機器,如寄存器分配、指令調度和硬件單元分配。
圖5:CEVA-X1641編譯器支持的匯編內部函數的使用。
調試混合代碼的應用程序
匯編代碼的調試需要對延遲和存儲器對齊限制等架構和機器級問(wèn)題有深入的了解。只是簡(jiǎn)單地把C代碼和匯編代碼放在一起會(huì )使事情更麻煩,因為編程人員現在還必須調試C代碼和匯編代碼之間的連接。
調試混合代碼應用程序的第一步就是分隔問(wèn)題。假設保持匯編代碼的C語(yǔ)言實(shí)現不變以及C語(yǔ)言實(shí)現方案工作正常,那么將匯編函數轉換成C語(yǔ)言實(shí)現并重新測試應用程序就相對比較容易。為了迅速檢測出問(wèn)題,編程人員可以在每一步把受懷疑函數的一半轉換為相應的C語(yǔ)言實(shí)現方案。
一旦有問(wèn)題的匯編函數被確定,它就應該同時(shí)作為獨立的匯編問(wèn)題和C與匯編的連接問(wèn)題加以分析。調試獨立的匯編問(wèn)題對匯編編程人員來(lái)說(shuō)十分簡(jiǎn)單明了,但C與匯編的連接問(wèn)題就有點(diǎn)麻煩。在考慮匯編函數本身時(shí),C與匯編的連接問(wèn)題是不可見(jiàn)的,這與獨立的匯編問(wèn)題有所不同。為了找出這些問(wèn)題,編程人員必須檢查編譯器的約定,比如調用約定和寄存器使用約定。
編程人員還必須檢查編譯器假設,比如匯編指令的行蹤。為了節省調試時(shí)間,編程人員應該在第一次實(shí)現匯編函數時(shí)驗證是否遵循所有的編譯器約定和假設。
案例研究:H.264視頻編碼器和AMR-NB
本文討論的技術(shù)和方法已被CEVA公司用于各種各樣的應用,包括視頻編解碼器、音頻編解碼器、聲音合成器和設備驅動(dòng)器。而本文所述的功能在這些應用中都可以顯著(zhù)提高性能。H.264視頻編碼器是一個(gè)很好的研究案例。它在處理能力及其它資源方面要求非常嚴格,尤其是相比語(yǔ)音編解碼器等其它類(lèi)型的編解碼器而言。
CEVA公司的CEVA-X16xx高端DSP內核系列及其MM2000多媒體平臺可以為這種編碼器提供所需的處理能力。先用高級跟蹤技術(shù)確定這種編碼器的關(guān)鍵函數,然后逐步對之進(jìn)行優(yōu)化。首先,利用匯編內部函數在C語(yǔ)言級對這些函數進(jìn)行全面優(yōu)化。然后,在匯編語(yǔ)言級對編譯器提供的匯編代碼作進(jìn)一步優(yōu)化。
圖6展示了通過(guò)對這種編碼器的關(guān)鍵函數進(jìn)行全面優(yōu)化所獲得的性能提高。只有最后一個(gè)優(yōu)化階段涉及到純匯編編程,所有其它階段都基于帶有匯編內部函數的C代碼。這些匯編內部函數主要用于SIMD操作,如avg_acW_acX_acZ_4b。這條指令對8個(gè)輸入字節取平均,產(chǎn)生4字節結果。這種SIMD操作對執行大量字節級計算的視頻編解碼器非常有用。
圖6:對H.264編碼器的關(guān)鍵函數進(jìn)行優(yōu)化以提升性能。
評論