TMS320C6000嵌入式系統優(yōu)化編程的研究
下面例子是算法中計算幀能量的函數,其中包含兩個(gè)單循環(huán)體。進(jìn)行優(yōu)化時(shí),首先要確定循環(huán)的次數。對于循環(huán)次數是變量的情況,優(yōu)化器不進(jìn)行并行優(yōu)化;其次盡量減少數據存取次數,例如以32位存取指令對16位數據進(jìn)行存取,可以節省一半的存取周期。仔細觀(guān)察C代碼,會(huì )發(fā)現兩次循環(huán)次數相同。第二個(gè)循環(huán)要用到第一個(gè)循環(huán)的結果,因此可以將兩個(gè)循環(huán)合并在一起,這樣就避免了在第二個(gè)循環(huán)中再從存儲器中取結果,減少了一半的Load操作。
long Comp_En( short *Dpnt)
{ int i ;
long Rez ;
short Temp[60] ;
for ( i = 0 ; i 60 ; i ++)
Temp[i] = shr( Dpnt[i], (short) 2) ;
Rez=(long) 0 ;
for (i=0; i 60; i ++)
Rez=L_mac(Rez, Temp[i], Temp[i]);
return Rez ;
}
相應的線(xiàn)性匯編程序如下:
.global _Comp_En ;函數名定義,對c變量前加__Comp_En .cproc Dpnt;函數頭定義,Dpnt是參數
.reg Rez,Rez1,Rez2,I ;寄存器定義,不必考慮實(shí)際的寄存器分配
.reg t1,t2,x1,c1,m1,m2
zero Rez
zero Rez1
zero Rez2
mv Dpnt,c1
mvk 30,i ;確定循環(huán)次數。因為用LDW代替LDH,循環(huán)次數減少一半。
loop1 .trip 30
ldw *c1++,x1
shl x1,16,t1
shr t1,2,t1
shr x1,2,t2 ;將兩個(gè)循環(huán)合在一起,又減少了一半的從內存取數據的時(shí)間。
smpyh t1,t1,m1
smpyh t2,t2,m2
sadd Rez1,m1,Rez1
sadd Rez2,m2,Rez2
[i] sub i,1,i ;循環(huán)計數器從30遞減
[i] b loop1
sadd Rez1,Rez2,Rez
.return Rez
.endproc
消耗時(shí)間(時(shí)鐘周期):C語(yǔ)言為32971;線(xiàn)性匯編語(yǔ)言為93。
2.3 使用線(xiàn)性匯編改寫(xiě)復雜函數中的循環(huán)體
當函數的邏輯關(guān)系復雜,判斷、跳轉、函數調用情況特別多時(shí),上面方法的效果就會(huì )大打折扣。這時(shí)可以使用線(xiàn)性匯編將其中的循環(huán)部分改寫(xiě)成一個(gè)函數,以?xún)?yōu)化后的函數調用代替循環(huán)部分,而不是優(yōu)化整個(gè)復雜函數。
高速數字信號處理器件的應用范圍越來(lái)越廣,特別是在移動(dòng)通信領(lǐng)域中,軟件無(wú)線(xiàn)電、智能天線(xiàn)等新技術(shù)的實(shí)現都需要強大的實(shí)時(shí)數字信號處理的支持。TMS320C6000系列DSP完全可以滿(mǎn)足此類(lèi)要求。但目前對于并行DSP技術(shù)的軟硬件開(kāi)發(fā)還處在摸索階段,如何充分利用高速DSP的資源,是這方面的研究重點(diǎn)。本文研究了最新推出的TMS320C6000的優(yōu)化策略,從工程和系統的角度總結出一套既能滿(mǎn)足實(shí)時(shí)性又能保證開(kāi)發(fā)時(shí)效性的實(shí)用的優(yōu)化編程方法,以供分饗。
評論