
圖1直觀地反映了數(shù)組16位h[ ]和16位X[ ]之間的乘加關(guān)系,從函數(shù)cor_h_X( )中可知,兩個(gè)數(shù)組的乘積之和要對(duì)應(yīng)的保存在臨時(shí)數(shù)組32位Y[ ]中。通過(guò)研究此分析圖,我們發(fā)現(xiàn)h[ ]與X[ ]中的一些元素進(jìn)行乘積和處理之后就不再被使用,那么存儲(chǔ)這些元素的寄存器可以存放中間結(jié)果(Y[]的元素),這樣就可節(jié)省寄存器的使用個(gè)數(shù),免去了開(kāi)辟內(nèi)存空間和中間變量的存取指令。
對(duì)于函數(shù)cor_h_X( ),利用上述思想編寫線性匯編,只需要定義57個(gè)寄存器就可以完成所用的操作,存取指令從1760條優(yōu)化到30條,僅為原來(lái)的1/60。同時(shí)執(zhí)行速度從390072個(gè)時(shí)鐘減少到35871個(gè),降為原來(lái)的1/10。
繪制的分析圖可以包含相關(guān)圖,相關(guān)表等,使資源安排更加合理。該方法在其他函數(shù)的改寫中也多次使用到。
5.2 功能相似的函數(shù)或代碼段合并為一個(gè)函數(shù)
線性匯編在提高代碼效率的同時(shí)也成倍的增加了代碼尺寸,以上述cor_h_X( )為例,它在該寫后代碼尺寸從660條增大到7776條(該數(shù)據(jù)由CCS剖析工具分析所得)。在工程應(yīng)用中,對(duì)于有限的內(nèi)存程序區(qū),我們會(huì)適當(dāng)減少程序占用的空間。合并功能相似的函數(shù)可以達(dá)到這一要求。
在LSP量化處理中,源代碼中給出了2個(gè)LSP選擇函數(shù):Lsp_select_1( )和Lsp_select_2( ),而我們發(fā)現(xiàn)它們具有相同的功能和相似的結(jié)構(gòu),因此,在對(duì)兩者的線性匯編改寫中,我們只需編寫一個(gè)函數(shù)(命名為L(zhǎng)sp_select)即可實(shí)現(xiàn)LSP量化處理中這兩個(gè)模塊的功能。
另外,在對(duì)于一些數(shù)組拷貝,數(shù)組初始化的代碼,我們同樣可以用此方法,編寫一個(gè)函數(shù)實(shí)現(xiàn),這樣可以在提高執(zhí)行效率的同時(shí),減少程序占用的內(nèi)存空間。
5.3 多個(gè)循環(huán)合并為一個(gè)循環(huán)
C代碼改寫線性匯編的時(shí)候,我們常常會(huì)發(fā)現(xiàn),只要作一些調(diào)整,兩個(gè)或多個(gè)循環(huán)完成的操作完全可以由一個(gè)循環(huán)來(lái)完成。以LPC子模塊240點(diǎn)加窗語(yǔ)音的自相關(guān)計(jì)算Autocorr()函數(shù)為例,經(jīng)過(guò)優(yōu)化改寫的C代碼(部分)如下:
for(i=0; i<L_WINDOW; i++) //第一個(gè)循環(huán)體
y[i] = (_smpy(x[i], hamwindow[i])+0x00008000L)>>16;
sum = 1; //避免為0的情況
for(i=0; i<L_WINDOW; i++) //第二個(gè)循環(huán)體
sum = _sadd(sum,_smpy(y[i], y[i]));
這段代碼包含了兩個(gè)for循環(huán),在CCS中直接編譯運(yùn)行并行度很差,利用線性匯編重寫代碼。我們發(fā)現(xiàn)兩個(gè)循環(huán)體的循環(huán)次數(shù)均為60(L_WINDOW=60),所處理的數(shù)組不同,并且兩個(gè)循環(huán)沒(méi)有相關(guān)性,可以把第一和第二個(gè)循環(huán)合并成一個(gè)循環(huán)。前者的功能是對(duì)語(yǔ)音信號(hào)進(jìn)行加窗;后者是實(shí)現(xiàn)乘累加(Mac)。兩者合并后采用線性匯編編寫,其代碼如下:
mvk 60,i //設(shè)置循環(huán)次數(shù)
loop1: lddw *ham++,hamih:hamil //hamwindow[]指針
lddw *x++,xih:xil //x[]指針
smpy2 hamil,xil,yi1:yi0 //兩對(duì)16位操作數(shù)相承,并行執(zhí)行
smpy2 hamih,xih,yi3:yi2
sadd yi0,con0x8000,yi0
sadd yi1,con0x8000,yi1
sadd yi2,con0x8000,yi2
sadd yi3,con0x8000,yi3
packh2 yi1,yi0,yl //數(shù)據(jù)打包技術(shù)
packh2 yi3,yi2,yh
stdw yh:yl,*y++ //雙字存取,提高執(zhí)行效率
smpy2 yl,yl,yi1:yi0
sadd sum0,yi1,sum0
sadd sum0,yi0,sum0
smpy2 yh,yh,yi3:yi2
sadd sum0,yi3,sum0
sadd sum0,yi2,sum0
add i,-1,i
[i] b loop1 //把第一和第二個(gè)循環(huán)合成一個(gè)大循環(huán),減少轉(zhuǎn)移次數(shù)
產(chǎn)生的匯編代碼并行流水性能大大增加,耗費(fèi)的時(shí)鐘周期數(shù)從1310000減少到15000,少于改編前的1/8。
6. 結(jié)束語(yǔ)
關(guān)于編解碼器執(zhí)行的時(shí)鐘周期,在線性匯編改寫前后,文件版本通過(guò)CCS的profiler剖析工具得知:每10幀(100ms)從159700000降至68500000,僅為原來(lái)的42%。硬件版本進(jìn)行測(cè)試得:編解碼的幀數(shù)提高到了88幀/s以上,鑒于編碼、解碼的時(shí)間比例為5:1,所以,本系統(tǒng)編碼已經(jīng)達(dá)到100幀/s,完全符合實(shí)時(shí)通信的要求。
參考文獻(xiàn):
[1] ITU-T Recommendation G.729,Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Excited Line-prediction, March 1996.
[2] ITU-T Coding of speech at 8kbit/s using Conjugate-Structure Algebraic-Code-Excited Linear-Prediction (CS-ACELP) Annex D: 6.4kbit/s CS-ACELP speech coding algorithm,1998.
[3] 王炳錫.語(yǔ)音編碼[M].西安:西安電子科技大學(xué)出版社,2002:1-293.
[4] 胡航.語(yǔ)音信號(hào)處理(第一版).哈爾濱:哈爾濱工業(yè)出版社,2000:1-178.
[5] 李方慧,王飛,何佩餛.TMS320C6000系列DSPs的原理與應(yīng)用(第二版).北京:電子工業(yè)出版社,2003:1-554.
[6] 許海燕,閆健恩,陳靜.H.264視頻編碼在DM 642上的實(shí)現(xiàn)與優(yōu)化[J].微計(jì)算機(jī)信息,2006,8-2:160-162.
[7] 劉為超,黎福海.G. 729在DSP應(yīng)用中代碼優(yōu)化研究,現(xiàn)代電子技術(shù),2005,196:59-61.
作者簡(jiǎn)介:
王偉(1977-),女,漢,黑龍江省牡丹江市人,講師,碩士,主要研究方向?yàn)榍度胧较到y(tǒng),多媒體技術(shù);
王偉達(dá)(1979-),男,漢,黑龍江省大慶市人,在讀博士,主要研究方向?yàn)橄冗M(jìn)制造技術(shù);
郭恒業(yè)(1949-),男,漢,黑龍江哈爾濱人,教授,主要研究方向嵌入式系統(tǒng),多媒體技術(shù);
通信地址:王偉 山東省威海市文化西路2# 哈爾濱工業(yè)大學(xué)(威海) 264209,
本文作者創(chuàng)新點(diǎn):在對(duì)G.729A的優(yōu)化中,針對(duì)TMS320DM642 DSP系列芯片提出了一些線性匯編優(yōu)化的新方法(這些新方法已在文章中詳細(xì)說(shuō)明)。這些創(chuàng)新點(diǎn)在很大程度上提高了代碼的執(zhí)行效率,在語(yǔ)音編解碼的DSP實(shí)時(shí)實(shí)現(xiàn)中起到了關(guān)鍵性作用。
[1]





