<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于DSP的實(shí)時(shí)MPEG-4編碼的軟件優(yōu)化設計

基于DSP的實(shí)時(shí)MPEG-4編碼的軟件優(yōu)化設計

作者: 時(shí)間:2006-05-07 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:結合開(kāi)發(fā)工具TMS320C6201EVM板的結構和特點(diǎn),闡述了在實(shí)現MPEG-4實(shí)時(shí)視頻編碼中,對算法的軟件優(yōu)化所做的工作。

本文引用地址:http://dyxdggzs.com/article/242379.htm

關(guān)鍵詞:TMS320C6201 MPEG-4 優(yōu)化 并行處理

TMS320C6201芯片是TI公司新推出的并行處理的器。它的最高處理能力高達1600MIPS,即16億萬(wàn)次每秒定點(diǎn)運算,是目前市場(chǎng)上所有的芯片中速度較快、處理功能較強的處理器。其應用前景十分廣泛。本文利用C6201開(kāi)發(fā)工具EVM(模擬評估)板,用軟件實(shí)現實(shí)時(shí)MPEG-4編碼。詳細探討了MPEG-4視頻編碼中的關(guān)鍵模塊,并針對TMS320C6000的物理指令結構,對軟件優(yōu)化的特殊處理做了較深入的研究。

1 開(kāi)發(fā)工具的介紹

筆者采用的評估工具是TI公司的C6XEVM[2]。它的結構如圖1所示。

C6XEVM除核心之外,還提供了如下工具:一個(gè)64K×32bit、133MHz的z同步脈沖靜態(tài)隨機存取存儲器(SBSRAM);兩個(gè)1M×32bit、100MHz的同步動(dòng)態(tài)RAM(SDRAM);內含基于PCI或外部XDS510支持的JTAG仿真;支持采樣速率為5.5kHz~48kHz的立體聲16位音頻邊界碼;1.8V/2.5V直流電壓3.3V直流電單板轉換電壓調整器;模擬5V直流電壓的單板線(xiàn)電壓調整器;3個(gè)LED指示器(電壓,2個(gè)自定義指示)等。

SBSRAM映射到DSP的CE0存儲空間,把它用于程序自舉。通常SBSRAM都工作在133MHz。當采用全速接口時(shí),CPU時(shí)鐘就等于SBSRAM的時(shí)鐘;當采用半速接口時(shí),SBSRAM的速度是CPU時(shí)鐘速度的一半。

EVM提供的兩個(gè)1M×32bit的字存儲區間的SDRAM,每一個(gè)存儲空間包含兩512×2banks×16位的器件。它們映射到DSP的CE2和CE3存儲空間,每一個(gè)空間使用16Mbit的地址空間。SDRAM通常是CPU時(shí)鐘速度的一半。

EVM提供的異步存儲連接器允許給子板附加一個(gè)存儲區間或者存儲映射區間。擴展存儲的界面被映射到DSP的4M異步CE1存儲空間的低3M空間。CE1中擴展空間的地址從0x100000~12FFFFF,在MAP0和MAP1方式下為0x1400000~16FFFFF,CE1的最上面的1M字節可分配給板上外圍。CE1存儲空間的這種分配方式容許了板上器件和擴展器件的共存。

2 MPEG-4視頻編碼

MPEG-4編碼是基于VOP的編碼[3]。所謂VOP是指視頻目標平面,即視頻對象VO在某一時(shí)間的存在。VOP編碼器的結構框圖如圖2所示。

編碼器主要由兩部分組成:一是形狀編碼器;另一個(gè)是傳統的運動(dòng)估計和補償及紋理VOP編碼器。VOP可采用幀內編碼(Intera-VOP,簡(jiǎn)稱(chēng)I-VOP)和幀間預測編碼(Inter-VOP)。幀間預測編碼又可以分為前向因果預測編碼(P-VOP)和前后向非因果編碼(B-VOP)。幀間預測編碼消除了視頻信息的時(shí)間冗余。對于VOP的編碼,首先將各個(gè)VOP從上到下分成16×16大小的宏塊(MB)。具體的形狀、運動(dòng)和紋理編碼基于MB進(jìn)行,所以一個(gè)MB的信息是形狀、運動(dòng)、紋理(Shape-Motion-Texture)的總和。進(jìn)行MB編碼時(shí),再把它分成4個(gè)8×8塊(Block)的亮度Y分量,和2個(gè)8×8塊的色度Cr和Cb分量分別進(jìn)行編碼。然后對6個(gè)Block分別進(jìn)行8×8DCT二維變換、量化和Huffman編碼。

進(jìn)行測試使用的圖像是QCIF格式(176×144象素),圖像數據從主機讀入。通過(guò)CCS測得其各個(gè)模塊所消耗的時(shí)間周期比率如下:

其各個(gè)部分占總運算量的比例分別為:

分析顯示,運動(dòng)估計和運動(dòng)補償模塊及紋理編碼模塊是MPEG-4實(shí)現的最主要的瓶頸。所以在程序優(yōu)化上所做的工作主要是基于這兩個(gè)模塊進(jìn)行。

3 程序的優(yōu)化考慮

要想充分發(fā)揮TMS320C6201的運算能力,必須從它的硬件結構出發(fā),最大程度地利用八個(gè)功能單元,使用軟件流水線(xiàn),盡量讓程序無(wú)沖突地并行執行。并行執行的優(yōu)點(diǎn)在于,在處理彼此無(wú)沖突地并行執行。并行執行的優(yōu)點(diǎn)在于,在處理彼此之間沒(méi)有承接關(guān)系的運算時(shí),在CPU資源允許的情況下可以并行完成。但對于前后有承接關(guān)系或者判斷、跳轉頻繁的情況就無(wú)法發(fā)揮其優(yōu)勢。一般循環(huán)體都滿(mǎn)足并行處理的條件,并且循環(huán)體往往是程序中中耗時(shí)最長(cháng)的。因此在進(jìn)行優(yōu)化時(shí)將重點(diǎn)放在循環(huán)體上。

3.1 跳轉指令的優(yōu)化

DSP的指令多為單周期指令,但是轉移類(lèi)指令卻通常要耗費較多的時(shí)鐘周期,每個(gè)跳轉都有5個(gè)延遲間隙,從性能上考慮是一項很耗時(shí)的工作,因此應盡可能地減少程序中的分支。

事實(shí)上,通過(guò)對程序的分析,可以看到許多判斷轉移用簡(jiǎn)單的條件組合就可以得到實(shí)現。例如下面的小程序。

if(rcoeff[i]>(lim-1)) rcoeff[i]=(lim-1);

else if(rcoeff[i](-lim)) rcoeff[i]=(-lim);

可以改為:rcoeff[i]=MIN(rcoeff[i],(lim-1));

rcoeff[i]=MAX(rcoeff[i],(-lim));

還有一種常用的減少判斷轉移的方法是將循環(huán)展開(kāi)。特別是對多重循環(huán)的控制,若外層循環(huán)較少,可將內層循環(huán)直排,把轉移條件結合起來(lái),以減少層與層之間的相互聯(lián)系。

3.2 使用庫函數

TI公司對TMS320C62XX的用戶(hù)提供了功能強大的IMAGE LIB[4]庫支持。在這個(gè)庫中,包含許多常用函數,可以完成DCT/IDCT變換、小波變換、DCT量化、自適應濾波等功能。這些函數都是優(yōu)化過(guò)的,完全能夠實(shí)現軟件流水,效率很高。

3.3 改寫(xiě)線(xiàn)性匯編

線(xiàn)性匯編語(yǔ)言是TMS320C6000中獨有的一種編程語(yǔ)言,介于高級語(yǔ)言和低級語(yǔ)言之間。為了提高代碼的性能,可以用線(xiàn)性匯編來(lái)重寫(xiě)影響速度的關(guān)鍵代碼段。線(xiàn)性匯編中不需要給出使用的寄存器、指令的延遲周期及使用的哪個(gè)功能單元等信息,C6201強大的匯編優(yōu)化器會(huì )根據代碼的情況自動(dòng)確定這些信息[5]。然而很多時(shí)候,為了提高代碼的效率,必須指出使用哪個(gè)功能單元。使用線(xiàn)性匯編時(shí)要注意:對循環(huán)體進(jìn)行優(yōu)化時(shí)不能使用跳轉到循環(huán)體外的跳轉指令;計數器使用減計數等。

進(jìn)行優(yōu)化時(shí),首先要確定循環(huán)次數。對于循環(huán)次數是變量的情況,優(yōu)化器不能并行優(yōu)化;其次,要盡可能使用雙字或字存取操作。例如運動(dòng)估計和補償中的一個(gè)小程序段:

void MC_case_a(uchar ref[NUM_ROWS][NUM_COLS],

uchar curr[UNM_ROWS][NUM_COLS],const int r_x,const int c_x,const int r_y,const int c_y,const int size)

{

int m,n;

for(m=0;msize;m++) {

for(n=0;nsize;n++){

cuff[c_x+m][c_y+n]=ref[r_x+m][r_y+n];

}}

{

相應的線(xiàn)性匯編程序如下:

.def_MC_case_a

.sect .text

_MC_case_a: .cproc ref,curr,r_x,c_x,r_y,c_y,mum_cols

.reg r_temp1,r_temp2,c_temp1,c_temp2

.reg p_r,P_c,np_r

.reg lshift,rshift,count

.reg r_w1,r_w2,r_w3,r_w4

.reg temp

SHL r_x,0x05,r_temp1

SHL c_x,0x05,c_temp1

ADD r_y,ref,r_temp2

ADD c_y,curr,c_temp2

ADD r_temp1,r_temp2,p_r

ADD c_temp1,c_temp2,p_c

SUB num_cols,2,num_cols

MVK 8,count ; 循環(huán)次數為8

MVK 0xFFFc,temp

AND p_r,temp,np_r

AND p_r,0x0003,rshift

SUB.L 0x04,rshift,lshift

SHL rshift,0x03,rshift

SHL lshift,0x03,lshift

loo:.trip 8

LDW *np_r++[1],r_w1

LDW *np_r++[1],r_w2

LDW *np_r++[num_cols],r_w3

SHRU r_w1,rshift,r_w1

SHL r_w3,lshift,r_w3

SHL r_w2,lshift,r_w4

SHRU r_w2,rshift,r_w2

OR r_w1,r_w4,r_w1

OR r_w2,r_w3,r_w2

STW r_w1,*p_c++[1]

STW r_w2,*p_c++[num_cols]

ADD p_c,4,p_c

[count] SUB count,1,count

[count] B loop

.endproc

優(yōu)化前,在CCS(Code Composer Studio)上測得的C程序段消耗時(shí)鐘周期為574;而優(yōu)化后的線(xiàn)性匯編所耗時(shí)鐘周期數為58,效率顯著(zhù)提高。

3.4 存儲空間的考慮

DSP存儲空間的配置十分重要。因為DSP對不同的存儲單元的訪(fǎng)問(wèn)速度是有區別的,對片內寄存器的訪(fǎng)問(wèn)速度最快,對片內RAM的訪(fǎng)問(wèn)速度比片外RAM的訪(fǎng)問(wèn)速度快。因此合理地配置和使用存儲空間,對系統整體效率影響很大。應該盡可能地把訪(fǎng)問(wèn)比較頻繁的常數表和代碼段裝入片內RAM,如果過(guò)大,則把其中一部分裝入片外存儲器。

同時(shí),還要考慮存儲bank的沖突。由于C6201DSP使用交叉存儲方案,將存儲器分成4個(gè)或8個(gè)bank,每個(gè)bank都是單口存儲區,因此每個(gè)周期只允許一次訪(fǎng)問(wèn),在一個(gè)周期內對一個(gè)bank進(jìn)行兩次訪(fǎng)問(wèn)將產(chǎn)生存儲器阻塞。存儲器阻塞導致所有流水線(xiàn)操作停止一個(gè)周期,用來(lái)從存儲器讀取第2個(gè)數據。解決的辦法是對代碼段進(jìn)行修改。

3.5 其他優(yōu)化方法

除此之外,還有一些比較基本的方法,如:

·為了提高算法的實(shí)現效率,減少運算的實(shí)際開(kāi)銷(xiāo),盡可能把需運行時(shí)計算的參數做成查找表或常數數值,從而將運行時(shí)的計算轉化為編譯時(shí)的計算。這不僅適用于一些比較規整的參數表,對于一些并不規整的運行時(shí)計算,特別是比較耗時(shí)的計算(如浮點(diǎn)除),也可盡可能使其表格化。

·浮點(diǎn)數定點(diǎn)化,在編寫(xiě)MPEG-4的模擬算法時(shí),為了方便,C語(yǔ)言中一般既有有整型數,又有浮點(diǎn)數。由于使用的定點(diǎn)芯片,所以有必要把所有的浮點(diǎn)運算改為定點(diǎn)運算。

·使用字訪(fǎng)問(wèn)2個(gè)16位數據,將其分別放在32位寄存器的高16位和低16位字段。這樣可以使程序讀取數據的速率提高一倍,從而大大提高執行效率。

·使用移位指令替代乘除操作,移位指令只有一個(gè)時(shí)鐘周期,比之乘除運算則可以節約許多時(shí)鐘周期。

最初的C代碼在EVM板上執行,處理速率僅為0.8幀/秒。通過(guò)上述方法優(yōu)化源程序后,可在C6201的EVM板上實(shí)現實(shí)時(shí)的MPEG-4編碼,處理速度為30幀/秒。

DSP芯片的使用范圍已越來(lái)越廣。特別在移動(dòng)通信領(lǐng)域中,軟件無(wú)線(xiàn)電、智能天線(xiàn)等新技術(shù)的實(shí)現都需要強大的的支持。TMS320C6000系列能夠滿(mǎn)足這方面的需求。本文結合在其在MPEG-4編碼中應用的實(shí)例,具體闡述了TMS320C6000的軟件優(yōu)化開(kāi)發(fā)方法。工作中不可避免地存在某些不足,尚待進(jìn)一步探討。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>