国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

MIPS指令集G.729算法優(yōu)化

2013-08-22 08:02林善和
科技視界 2013年7期
關(guān)鍵詞:累加器編解碼流水線

林善和

(福建星網(wǎng)銳捷通訊股份有限公司,福建 福州 350002)

0 引言

G.729是目前比較優(yōu)質(zhì)的語(yǔ)音壓縮算法,10ms的語(yǔ)音,80個(gè)采樣點(diǎn),可以壓縮到10字節(jié),算法中用到了大量的移位,點(diǎn)乘,飽和,取整的運(yùn)算,使用普通的指令雖然可以實(shí)現(xiàn)功能,但是消耗過(guò)多的CPU資源,不實(shí)用。

早期的編解碼算法一般都是通過(guò)外掛的DSP來(lái)實(shí)現(xiàn),隨著技術(shù)的進(jìn)步,一般家庭網(wǎng)關(guān)SoC的CPU性能越來(lái)越高,從原來(lái)的100M到現(xiàn)在的400-600M甚至更高,同時(shí)CPU也增加了DSP增強(qiáng)的指令集,這樣很多算法直接就可以用CPU來(lái)處理,無(wú)需外掛DSP或者嵌一個(gè)DSP內(nèi)核。

RT305x使用MIPS32 24KE的核心,內(nèi)涵DSP ASE指令集,可以在一條指令完成2個(gè)short型數(shù)據(jù)的移位,4個(gè)short型數(shù)據(jù)的兩兩點(diǎn)乘相加,同時(shí)還順便進(jìn)行飽和,取整運(yùn)算。

如果G729編解碼算法運(yùn)行時(shí)能夠把CPU的占有率控制在30%以內(nèi),那么CPU還有足夠的資源實(shí)現(xiàn)其它功能。因此,優(yōu)化的目標(biāo)就是在G729編解碼時(shí),RT305x的CPU占有率控制在30%以內(nèi)。本文所闡述的優(yōu)化是指對(duì)用標(biāo)準(zhǔn)C語(yǔ)言編寫的代碼用DSP增強(qiáng)指令集進(jìn)行優(yōu)化。

1 G.729AB優(yōu)化步驟

1.1 準(zhǔn)備一個(gè)30秒以上的PCM源文件,要求采樣率8K,16位采樣

1.2 編寫g729_test.c和Make file,用來(lái)小工程編譯G729

1.3 編譯得到可執(zhí)行文件,例如g729

1.4 把可執(zhí)行文件g729及PCM的源文件復(fù)制到NFS目錄

1.5 在設(shè)備上執(zhí)行./g729 xx.pcm xx.g729,可以得到編碼后的g729文件和再解碼的pcm文件,還有完成編解碼所需要的總時(shí)間

1.6 修改源碼重新編譯,再次運(yùn)行,如果輸出文件與之前的相同,而且消耗時(shí)間更短,則修改有意義

1.7 如果發(fā)現(xiàn)輸出文件與之前不同,有可能是修改內(nèi)容有問題。但是如果修改內(nèi)容涉及到算法的優(yōu)化,例如使用了64位的累加器,精度提高了,運(yùn)算結(jié)果肯定與之前的不同,這是容許的,這時(shí),用Cooledit打開輸出的pcm文件,仔細(xì)查看,波形有沒有變形,音質(zhì)有沒有變差

2 重點(diǎn)優(yōu)化內(nèi)容

2.1 基本元操作的優(yōu)化

修改的內(nèi)容在basic_op.c和basic_op.h中。

2.1.1 首先是用宏匯編指令代替函數(shù)的調(diào)用,要求是執(zhí)行時(shí)間最短

2.1.2 很多的移位操作,需要判斷移位的方向和次數(shù),如果移位次數(shù)是常數(shù),可以使用不帶V的指令,例如用SRA代替SRAV

2.2 32位的常用運(yùn)算的優(yōu)化

內(nèi)容在oper_32b.c和oper_32b.h,主要是32位的點(diǎn)乘運(yùn)算,由于原始代碼是多個(gè)平臺(tái)公用,沒有通用的點(diǎn)乘指令,所以點(diǎn)乘是由多個(gè)16位的數(shù)之間相乘,左移,再相加。在本平臺(tái)的指令系統(tǒng)中,有專門的點(diǎn)乘指令,這是好東西,還可以提升運(yùn)算的精度,不要放過(guò)。

2.3 乘加運(yùn)算的集中優(yōu)化

在編解碼中,有許多地方用到了兩個(gè)組數(shù)的點(diǎn)乘相加,通過(guò)for循環(huán)來(lái)完成,這個(gè)不斷的點(diǎn)乘,不斷的相加,在本平臺(tái),可以用乘加指令來(lái)完成,只需要在循環(huán)開始時(shí)清空64位累加器,循環(huán)結(jié)束之后,根據(jù)需要,移位相應(yīng)的次數(shù),把數(shù)據(jù)用64位累加器中取出,即可。

在點(diǎn)乘算法中,兩個(gè)16位的數(shù)組兩兩點(diǎn)乘,首地址是4字節(jié)對(duì)齊,數(shù)組長(zhǎng)度是偶數(shù),我們同時(shí)把連續(xù)的兩個(gè)16位數(shù)按照32位數(shù)載入寄存器,一起進(jìn)行點(diǎn)乘運(yùn)算,可以使循環(huán)次數(shù)減半。

在不少的算法中,由于擔(dān)心乘加的數(shù)據(jù)會(huì)溢出,先把原始數(shù)據(jù)集體右移了幾位,再點(diǎn)乘相加,為了保證精度,運(yùn)算結(jié)果可能還左移了幾位,對(duì)于這種情況,我們不需要先把數(shù)據(jù)集體右移,而是直接點(diǎn)乘,然后再取出數(shù)據(jù)時(shí),再右移,保證運(yùn)算結(jié)果不溢出,這個(gè)優(yōu)化屬于算法的優(yōu)化,不僅省力,精度還更高。

2.4 循環(huán)的展開

在循環(huán)中,如果數(shù)據(jù)量比較大,循環(huán)的次數(shù)是比較多的,每次循環(huán),開銷至少需要3條指令(i++,判斷,跳轉(zhuǎn)),而且使得流水線中斷。如果每次循環(huán)所干的事情多一些,循環(huán)的次數(shù)就會(huì)大大減少。

在從數(shù)組取出數(shù)據(jù)的時(shí)候,如果偏移地址是變量,會(huì)引入加法運(yùn)算,聰明的做法是用x[0],x[1],x[-1]這種固定偏移的方式取數(shù)據(jù),循環(huán)結(jié)束后修改x的值,代替用x[i]來(lái)訪問內(nèi)容,i++這種循環(huán),循環(huán)的判斷也不用i,而是直接判斷數(shù)據(jù)的地址是否到達(dá)末地址。

在本平臺(tái)的指令系統(tǒng)中,一條指令不能做到判斷大于或小于非零而跳轉(zhuǎn),只能判斷不相等,或大于或等于0而跳轉(zhuǎn),所以,把for(i=0;i<j;i++)寫成for(i=0;i!=j;i++),會(huì)省一條指令。

如果i是short型,而j是常數(shù)或int型,在判斷之前,會(huì)把i進(jìn)行一次符號(hào)擴(kuò)展。多一條指令,所以,在定義i的時(shí)候,建議保證待比較的兩個(gè)變量,位寬一致。

2.5 流水線優(yōu)化

MIPS32 CPU號(hào)稱大部分指令是單周期指令,但實(shí)際上,單單一條指令上來(lái)看,一條指令包括,取指令,取操作數(shù),執(zhí)行,存儲(chǔ)運(yùn)算結(jié)果等幾個(gè),各需要一個(gè)指令周期,但是這些指令周期可以疊加,如果流水線不間斷的運(yùn)行,相當(dāng)于一條指令只需要一個(gè)指令周期。

打斷流水線,會(huì)引入額外的等待,本條指令使用上一條指令的運(yùn)算結(jié)果,判斷跳轉(zhuǎn)指令,都會(huì)導(dǎo)致流水線的中斷。

在純C的代碼中,編譯器會(huì)自動(dòng)優(yōu)化流水線,但是,當(dāng)嵌入?yún)R編時(shí),如果加了volatile屬性,或者源操作數(shù)和目的操作數(shù)是隱含的,或者和內(nèi)存交互數(shù)據(jù),編譯器是不會(huì)幫助優(yōu)化流水線的,這時(shí)需要通過(guò)反匯編自己調(diào)整流水線。

為了使流水線不中斷,通常的做法是本條指令的目的操作數(shù),不要馬上作為下一條指令的源操作數(shù),而是間隔2條或2條指令以上。

對(duì)于跳轉(zhuǎn)指令,由于流水線的緣故,該指令的下一條指令也會(huì)被執(zhí)行到。這是特別需要注意的。

2.6 減少訪問內(nèi)存的次數(shù)

訪問內(nèi)存是比較慢的,如果沒有Cache,訪問一次內(nèi)存大約需要100ns,CPU內(nèi)有24個(gè)通用可用的寄存器,在函數(shù)調(diào)用時(shí),4個(gè)及以內(nèi)的形參傳遞,返回值,都不需要入棧。

在運(yùn)行過(guò)程中,應(yīng)盡量減少內(nèi)存的訪問次數(shù),比如一次載入32bit數(shù)據(jù),而不是分兩次載入16bit的數(shù)據(jù)。

2.7 C內(nèi)嵌匯編的實(shí)例

其中mult dpaq_sa.l.w mfhi是3條指令,$ac0是64位累加器,$zero是 0 寄存器,%0,%1,%2 的意思是用“:”后面的操作數(shù)代替,第一個(gè)”:”后面是目前操作數(shù),第二個(gè)”:”的后面是源操作數(shù),”=r”的意思是目的操作數(shù),且為寄存器,”r”的意思是源操作數(shù),且為寄存器,與內(nèi)容交互數(shù)據(jù)的指令,可以用”m”。

2.8 DSP常用的運(yùn)算結(jié)果處理

2.8.1 飽和

飽和處理就是運(yùn)算結(jié)果限制在固定的位寬所能表示的數(shù)的范圍,例如short型的最大數(shù)為0x7fff,最小數(shù)為0x8000,如果運(yùn)算結(jié)果超出了這個(gè)范圍,就根據(jù)正負(fù),調(diào)整為0x7fff或0x8000,普通CPU的累加器沒有對(duì)運(yùn)算結(jié)果進(jìn)行飽和處理,因此需要額外判斷結(jié)果,再調(diào)整,DSP的累加器一般都能對(duì)運(yùn)算結(jié)果飽和處理。一般同符號(hào)數(shù)的加法,不同符號(hào)的減法,點(diǎn)乘,左移,甚至取負(fù),均有可能溢出。

2.8.2 取整

取整是在右移的操作中比較常用,右移會(huì)導(dǎo)致精度的丟失,根據(jù)移走的最高位,調(diào)整結(jié)果,有助于保留精度。

2.8.3 點(diǎn)乘

在物理上,點(diǎn)乘是已知力和位移求功。在數(shù)字信號(hào)處理中,這里的點(diǎn)乘其實(shí)是信號(hào)的相乘,信號(hào)幅度用小數(shù)表示,在本平臺(tái),用Q15(Word16)或 Q31(Word32)表示,兩個(gè) Q15 點(diǎn)乘,結(jié)果 Q31,但是直接數(shù)學(xué)相乘,只得到Q30,所以還需要左移一位。

3 優(yōu)化結(jié)果分析

3.1 用標(biāo)準(zhǔn)C語(yǔ)言進(jìn)行編解碼算法測(cè)試CPU的占用率達(dá)到55%,無(wú)法滿足實(shí)際應(yīng)用需求。

3.2 反匯編

3.2.1 局部?jī)?yōu)化之后,用反匯編objdump-d來(lái)查看匯編代碼,看看是否能得到預(yù)料中匯編代碼,注意從內(nèi)存中載入short型數(shù)據(jù),帶符號(hào)和不帶符號(hào),在擴(kuò)展到32bit時(shí),是不一樣的

3.2.2 看看編譯器是不是引入額外的指令,比如沒有必要的符號(hào)擴(kuò)展

3.2.3 看看流水線是否最佳

3.3 編解碼的輸出文件檢驗(yàn)

得到的g729文件和PCM文件,首先是查看二進(jìn)制是否和修改之前相同,如果不同,需要找到原因,如果是算法的優(yōu)化導(dǎo)致的不同,需仔細(xì)查看聲音有沒有失真。最后用Abacus檢測(cè)音質(zhì),同時(shí)進(jìn)行長(zhǎng)時(shí)間通話拷機(jī)。優(yōu)化后的CPU占有率僅達(dá)30%。

4 結(jié)束語(yǔ)

在低成本家庭網(wǎng)關(guān)SoC芯片RT305x上使用MIPS32Kec帶的DSP AE指令集進(jìn)行G729編碼的進(jìn)行優(yōu)化后,CPU占用率不到30%,滿足家庭網(wǎng)關(guān)在語(yǔ)音、數(shù)據(jù)、Wifi的需求。隨著CPU性能的越來(lái)越強(qiáng)以及通信網(wǎng)絡(luò)IP話,這樣的技術(shù)將在各種各樣終端上使用,具有廣泛的應(yīng)用場(chǎng)景。

[1]王洪,唐凱.低速率語(yǔ)音編碼 Low Rate Speech Coding[M].北京:國(guó)防工業(yè)出版社,2006.

[2]Chinh Tran Chijioke Anyanwu,Sanjai Balakrishnan,Anshul Bhargava,James Jiang,Radhika Thekkath.The24KETMCore Family:High-Performance RISC Cores with DSP Enhancements[M].MIPS Technologies Inc.,2005.

[3]MIPS Technologies Inc.MIPS DSP ASE Instruction Set Quick Reference.MIPS Technologies Inc.,2005.

猜你喜歡
累加器編解碼流水線
Gen Z Migrant Workers Are Leaving the Assembly Line
密碼累加器研究進(jìn)展及應(yīng)用
1553B總線控制器編解碼設(shè)計(jì)
流水線
大型民機(jī)試飛遙測(cè)視頻編解碼方法研究
基于H.265編解碼的高清視頻傳輸系統(tǒng)研究
Fpga的信號(hào)發(fā)生器設(shè)計(jì)原理
報(bào)廢汽車拆解半自動(dòng)流水線研究
用于時(shí)間延遲積分型圖像傳感器的流水采樣列級(jí)運(yùn)放共享累加器*
SIMATIC IPC3000 SMART在汽車流水線領(lǐng)域的應(yīng)用
浦东新区| 昆山市| 玉树县| 新巴尔虎右旗| 定陶县| 克山县| 特克斯县| 来安县| 芮城县| 尼木县| 永嘉县| 自贡市| 女性| 肇东市| 青海省| 宁波市| 枣庄市| 高青县| 济南市| 丰都县| 遵义县| 深圳市| 广昌县| 靖江市| 和林格尔县| 恩平市| 建宁县| 长子县| 温宿县| 布拖县| 泗水县| 滦平县| 泾源县| 卫辉市| 紫阳县| 根河市| 祁东县| 蒲江县| 西宁市| 麻江县| 孟村|