專利名稱:一種基于dm642的二維dct的優(yōu)化方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)字圖像和視頻信號處理,更明確地說,涉及從DM642的指令角度優(yōu)化DCT函數(shù)的方法DCT變換。
背景技術(shù):
H264具有很高的數(shù)據(jù)壓縮比率,同等圖像質(zhì)量的條件下,H.264的壓縮比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍,但是,高壓縮比和出色的畫質(zhì)給視頻編碼能力帶來了很大的挑戰(zhàn)。DCT變換是H264編碼中最耗時(shí)的計(jì)算模塊之一,在實(shí)時(shí)編碼系統(tǒng)中,對它的計(jì)算速度的提升要求是精益求精。TMS320DM642DSP是TI德州儀器公司推出的一款高性能數(shù)字多媒體處理器,它的多媒體指令集以及并行處理的特征,使得優(yōu)化DCT這樣的模塊有了更加靈活的發(fā)揮空間。本章主要研究從DM642的指令角度優(yōu)化DCT函數(shù)的方法。
DM642是TI公司采用TI的第二代高級超長指令字結(jié)構(gòu)(VelociTI),使得在一個(gè)指令周期能夠并行處理多條指令,它有四個(gè)運(yùn)算單元,分別為.L,.M,.S,.D,其中每個(gè)運(yùn)算單元分A,B兩區(qū),可分別處理不同類型的運(yùn)算,因此可以達(dá)到每個(gè)指令周期運(yùn)行八條指令。它可在600MHz時(shí)鐘頻率下工作,按照每個(gè)指令周期可并行8條32bit指令來計(jì)算,它可達(dá)到4800MIPS的峰值計(jì)算速度。DM642采用兩級緩存結(jié)構(gòu)第一級包括相互獨(dú)立的LIP(16kB)和LID(16kB),只能作為高速緩存使用;第二級L2(256kB)是一個(gè)統(tǒng)一的程序/數(shù)據(jù)空間,可整體作為SRAM映射到存儲空間,也可整體作為第二級Cache,或是二者按比例的一種組合來使用。因此若能合理使用和管理內(nèi)存以及運(yùn)算單元的最大化利用,將能大幅度提高程序的運(yùn)行性能。
存在勝于數(shù)字視頻通信和存儲的各種應(yīng)用,且已開發(fā)出并正在持續(xù)開發(fā)相應(yīng)的國際標(biāo)準(zhǔn)。例如視頻電話和會議的低位速率通信以及例如動畫的較大視頻文件壓縮產(chǎn)生各種視頻壓縮標(biāo)準(zhǔn)H.261、H.263、MPEG-1、MPEG-2、AVS等。這些壓縮方法依賴地離散余弦變換(DCT)或類似變換以及變換系數(shù)的量化來減少需用來編碼的位的數(shù)目。
以下是二維DCT與IDCT的變換公式 二維DCT變換 令f(x,y)為N×N離散圖像序列,二維DCT變換表示為 u,v=0,1,...N-1 二維IDCT為 x,y=0,1,...N-1 從公式中可以看出,DCT算法中存在大量的數(shù)據(jù)讀寫和加減法運(yùn)算,就拿一個(gè)4x4dct來說,其中的加減法運(yùn)算達(dá)到64次。并且在計(jì)算DCT的過程中,需要頻繁的存取數(shù)據(jù),一次4x4dct需要分別存取數(shù)據(jù)32次。導(dǎo)致大量的cpu cycle在等待存取數(shù)據(jù)的完成,使得該運(yùn)算效率低下 void dct4x4(int16_t dct[4][4],uint8_t*pix1,uint8_t*pix2) { for(i=0;i<4;i++) { const int s03=d[i]
+d[i][3]; const int s12=d[i][1]+d[i][2]; const int d03=d[i]
-d[i][3]; const int d12=d[i][1]-d[i][2]; tmp
[i]=s03+s12; tmp[1][i]=2*d03+d12; tmp[2][i]=s03-s12; tmp[3][i]=d03-2*d12; } for(i=0;i<4;i++) {const int s03=tmp[i]
+tmp[i][3];const int s12=tmp[i][1]+tmp[i][2];const int d03=tmp[i]
-tmp[i][3];const int d12=tmp[i][1]-tmp[i][2];dct[i]
=s03+s12;dct[i][1]=2*d03+d12;dct[i][2]=s03-s12;dct[i][3]=d03-2*d12; } } 按照以上DCT的原始計(jì)算方法,每次讀取16位的數(shù)據(jù),對16位的數(shù)據(jù)進(jìn)行加減運(yùn)算。這樣的話,就難以發(fā)揮DM642的特性,難以達(dá)到并行計(jì)算的目的,并且在等待存取數(shù)據(jù)的過程中,耗費(fèi)了大量的cpu cycle(處理器周期),導(dǎo)致DCT運(yùn)算成為H264編碼中主要的瓶頸之一。
由于h264的實(shí)時(shí)編碼要求,我們可以通過提升DCT模塊的計(jì)算速度來達(dá)到提升整體編碼性能的目的。
鑒于此,實(shí)有必要提出一種改進(jìn)的技術(shù)方案以克服現(xiàn)有技術(shù)的缺陷。
發(fā)明內(nèi)容
本發(fā)明提供一種基于DM642的二維DCT的優(yōu)化方法,DM642是第二代高級超長指令字結(jié)構(gòu)(VelociTI)的數(shù)字信號處理器,其特征在于通過兩個(gè)指令A(yù)DD2和SUB2,它們是針對32位數(shù)據(jù),分高低16位進(jìn)行相加和相減運(yùn)算,如使用ADD2指令時(shí)C=_add2(A,B),是將A與B的高16位相加,結(jié)果存放于C的高16位,將A與B的低16位相加,結(jié)果存放于C的低16位;使用SUB2指令時(shí)C=_sub2(A,B),是將A與B的高16位相減,結(jié)果存放于C的高16位,將A與B的低16位相減,結(jié)果存放于C的低16位。
優(yōu)選地,所述DM642數(shù)字信號處理器在一個(gè)指令周期能夠并行處理多條指令,它有四個(gè)運(yùn)算單元,分別為.L,.M,.S,.D,其中每個(gè)運(yùn)算單元分A,B兩區(qū),可分別處理不同類型的運(yùn)算,因此可以達(dá)到每個(gè)指令周期運(yùn)行八條指令。
優(yōu)選地,ADD2和SUB2指令同時(shí)并行運(yùn)用于.M,.L,.S,.D的八個(gè)運(yùn)算單元。
優(yōu)選地,其中改變程序的結(jié)構(gòu),主要是將矩陣進(jìn)行轉(zhuǎn)置,而轉(zhuǎn)置通過SPACK2指令。
相對于現(xiàn)有技術(shù),本發(fā)明方法在DCT計(jì)算的cpu cycle由原來的176降低到優(yōu)化后的56,即提升了3倍多,提升效果顯著。
無附圖。
具體實(shí)施方式
對現(xiàn)有方法的改進(jìn)在于,將循環(huán)展開,重新整理程序結(jié)構(gòu)。DM642可以一次存取64位的數(shù)據(jù)。因此,展開后的程序,可以一次存讀取64位的數(shù)據(jù),使得存取的次數(shù)一次降低到了原來的1/4。
DM642有一系列類似于DOTPSU2這樣的點(diǎn)積指令,它可以計(jì)算兩個(gè)32位數(shù)據(jù)高低16位的乘加運(yùn)算,比如C=_dotpsu2(A,B),是將A與B的高16位相乘,低16位相乘,相加的和賦給C。通過這條指令,可以將取得的32位數(shù)據(jù)的高低16位求和,而不用拆分,再計(jì)算。
使用類似DOTPSU2這樣的指令,可以使用32位的數(shù)據(jù),并且能夠達(dá)到一定的并行目的,節(jié)省計(jì)算cpu cycle。但是由于DOTPSU2只能在CPU.M單元進(jìn)行計(jì)算,即每個(gè)cpu cycle只能在A,B兩個(gè)單元并行計(jì)算兩次,沒有充分發(fā)揮八個(gè)計(jì)算單元同時(shí)計(jì)算的目的,經(jīng)過對程序的結(jié)構(gòu)進(jìn)一步優(yōu)化和排序,我們找到了更加有用的方法。
這個(gè)方法是基于兩個(gè)很簡單的指令A(yù)DD2和SUB2,與原始運(yùn)算不同的是,它們是對32位數(shù)據(jù),分高低16位進(jìn)行相加和相減運(yùn)算。比如C=_add2(A,B),是將A與B的高16位相加,結(jié)果存放于C的高16位,將A與B的低16位相加,結(jié)果存放于C的低16位。并且它相對于DOTPSU2這個(gè)指令,有一個(gè)十分明顯的優(yōu)勢,就是它不受限于在哪個(gè)計(jì)算單元運(yùn)算,也就是說,它可以在cpu的.M,.L,.S,.D的八個(gè)運(yùn)算單元同時(shí)進(jìn)行運(yùn)算。這樣,就更加有利于提高程序的并行度。因此,使用ADD2和SUB2,而完全不用DOTPSU2,極大的壓縮了cpucycle,即可以明顯提升DCT計(jì)算速度。
以下為優(yōu)化后的基于DM642的程序,其中改變程序的結(jié)構(gòu),主要是將矩陣轉(zhuǎn)置,而轉(zhuǎn)置只用了幾個(gè)SPACK2打包指令。
void 4x4dct(uint8_t*p_dst,int16_t dct[4][4]) { int16_t d[4][4]; int16_t tmp[4][4]; int x,y; int i; int tmp0_10,tmp0_32,tmp1_10,tmp1_32; int tmp2_10,tmp2_32,tmp3_10,tmp3_32;int pack0_10,pack1_10,pack0_32,pack1_32; int pack2_10,pack3_10,pack2_32,pack3_32; int pack3_10_r,pack3_32_r,pack1_10_r,pack1_32_r; int d0_10,d0_32,d1_10,d1_32,d2_10,d2_32,d3_10,d3_32; int dct0_32=_hi(_amemd8((void*)dct
)); int dct0_10=_lo(_amemd8((void*)dct
)); int dct1_32=_hi(_amemd8((void*)dct[1])); int dct1_10=_lo(_amemd8((void*)dct[1])); int dct2_32=_hi(_amemd8((void*)dct[2])); int dct2_10=_lo(_amemd8((void*)dct[2])); int dct3_32=_hi(_amemd8((void*)dct[3])); int dct3_10=_lo(_amemd8((void*)dct[3])); int h_dct3_32=_shr2(dct3_32,1); int h_dct3_10=_shr2(dct3_10,1); int h_dct1_32=_shr2(dct1_32,1); int h_dct1_10=_shr2(dct1_10,1); int add20_10=_add2(dct0_10,dct2_10); int add20_32=_add2(dct0_32,dct2_32); int sub20_10=_sub2(dct0_10,dct2_10); int sub20_32=_sub2(dct0_32,dct2_32); int add31_10=_add2(h_dct3_10,dct1_10); int add31_32=_add2(h_dct3_32,dct1_32); int sub13_10=_sub2(h_dct1_10,dct3_10); int sub13_32=_sub2(h_dct1_32,dct3_32); int round=32|(32<<16); tmp0_10=_add2(add20_10,add31_10); tmp0_32=_add2(add20_32,add31_32); tmp1_10=_add2(sub20_10,sub13_10); tmp1_32=_add2(sub20_32,sub13_32); tmp2_10=_sub2(sub20_10,sub13_10); tmp2_32=_sub2(sub20_32,sub13_32); tmp3_10=_sub2(add20_10,add31_10); tmp3_32=_sub2(add20_32,add31_32); pack0_10=_pack2(tmp1_10,tmp0_10); pack1_10=_packh2(tmp1_10,tmp0_10); pack0_32=_pack2(tmp3_10,tmp2_10); pack1_32=_packh2(tmp3_10,tmp2_10); pack2_10=_pack2(tmp1_32,tmp0_32); pack3_10=_packh2(tmp1_32,tmp0_32); pack2_32=_pack2(tmp3_32,tmp2_32); pack3_32=_packh2(tmp3_32,tmp2_32); pack3_10_r=_shr2(pack3_10,1); pack3_32_r=_shr2(pack3_32,1); pack1_10_r=_shr2(pack1_10,1); pack1_32_r=_shr2(pack1_32,1);add20_10=_add2(pack2_10,pack0_10);add20_32=_add2(pack2_32,pack0_32);add31_10=_add2(pack3_10_r,pack1_10); add31_32=_add2(pack3_32_r,pack1_32); sub20_10=_sub2(pack0_10,pack2_10); sub20_32=_sub2(pack0_32,pack2_32); sub13_10=_sub2(pack1_10_r,pack3_10); sub13_32=_sub2(pack1_32_r,pack3_32); d0_10=_shr2(_add2(_add2(add20_10,add31_10),round),6); d0_32=_shr2(_add2(_add2(add20_32,add31_32),round),6); d1_10=_shr2(_add2(_add2(sub20_10,sub13_10),round),6); d1_32=_shr2(_add2(_add2(sub20_32,sub13_32),round),6); d2_10=_shr2(_add2(_sub2(sub20_10,sub13_10),round),6); d2_32=_shr2(_add2(_sub2(sub20_32,sub13_32),round),6); d3_10=_shr2(_add2(_sub2(add20_10,add31_10),round),6); d3_32=_shr2(_add2(_sub2(add20_32,add31_32),round),6); {int dst32=_amem4((void*)p_dst); int p_dst10,p_dst32; p_dst10=_add2(d0_10,_unpklu4(dst32)); p_dst32=_add2(d0_32,_unpkhu4(dst32)); _amem4((void*)p_dst)=_spacku4(p_dst32,p_dst10); p_dst+=FDEC_STRIDE; dst32=_amem4((void*)p_dst); p_dst10=_add2(d1_10,_unpklu4(dst32)); p_dst32=_add2(d1_32,_unpkhu4(dst32)); _amem4((void*)p_dst)=_spacku4(p_dst32,p_dst10); p_dst+=FDEC_STRIDE; dst32=_amem4((void*)p_dst); p_dst10=_add2(d2_10,_unpklu4(dst32)); p_dst32=_add2(d2_32,_unpkhu4(dst32)); _amem4((void*)p_dst)=_spacku4(p_dst32,p_dst10); p_dst+=FDEC_STRIDE; dst32=_amem4((void*)p_dst); p_dst10=_add2(d3_10,_unpklu4(dst32)); p_dst32=_add2(d3_32,_unpkhu4(dst32)); _amem4((void*)p_dst)=_spacku4(p_dst32,p_dst10); p_dst+=FDEC_STRIDE; } } DCT計(jì)算的cpu cycle由原來的176降低到優(yōu)化后的56,即效率提升了3倍多,提升效果顯著。
在上述實(shí)施例中,僅對本發(fā)明進(jìn)行了示范性描述,但是本領(lǐng)域技術(shù)人員在不脫離本發(fā)明所保護(hù)的范圍和精神的情況下,可根據(jù)不同的實(shí)際需要設(shè)計(jì)出各種實(shí)施方式。
權(quán)利要求
1.一種基于DM642的二維DCT的優(yōu)化方法,DM642是第二代高級超長指令字結(jié)構(gòu)(VelociTI)的數(shù)字信號處理器,其特征在于通過兩個(gè)并行運(yùn)算指令A(yù)DD2和SUB2,它們是針對32位數(shù)據(jù),分高低16位進(jìn)行相加和相減運(yùn)算,如使用ADD2指令時(shí)C=_add2(A,B),是將A與B的高16位相加,結(jié)果存放于C的高16位,將A與B的低16位相加,結(jié)果存放于C的低16位;使用SUB2指令時(shí)C=_sub2(A,B),是將A與B的高16位相減,結(jié)果存放于C的高16位,將A與B的低16位相減,結(jié)果存放于C的低16位。
2.如權(quán)利要求1所述的基于DM642的二維DCT的優(yōu)化方法,其特征在于所述DM642數(shù)字信號處理器在一個(gè)指令周期能夠并行處理多條指令,它有四個(gè)運(yùn)算單元,分別為.L,.M,.S,.D,所述A、B為每個(gè)運(yùn)算單元分A,B兩區(qū),可分別處理不同類型的運(yùn)算,因此可以達(dá)到每個(gè)指令周期運(yùn)行八條指令。
3.如權(quán)利要求2所述的基于DM642的二維DCT的優(yōu)化方法,其特征在于ADD2以及SUB2指令同時(shí)并行運(yùn)用于.M,.L,.S,.D的八個(gè)運(yùn)算單元。
4.如權(quán)利要求1所述的基于DM642的二維DCT的優(yōu)化方法,其特征在于其中改變程序的結(jié)構(gòu),主要是將矩陣進(jìn)行轉(zhuǎn)置,而轉(zhuǎn)置通過打包指令SPACK2。
全文摘要
本發(fā)明涉及一種基于DM642的二維DCT的優(yōu)化方法,DM642是第二代高級超長指令字結(jié)構(gòu)(VelociTI)的數(shù)字信號處理器,通過兩個(gè)指令A(yù)DD2和SUB2,它們是針對32位數(shù)據(jù),分高低16位進(jìn)行相加和相減運(yùn)算,如使用ADD2指令時(shí)C=_add2(A,B),是將A與B的高16位相加,結(jié)果存放于C的高16位,將A與B的低16位相加,結(jié)果存放于C的低16位;使用SUB2指令時(shí)C=_sub2(A,B),是將A與B的高16位相減,結(jié)果存放于C的高16位,將A與B的低16位相減,結(jié)果存放于C的低16位。通過提升DCT變換的計(jì)算速度來達(dá)到提升整體編碼性能的目的。
文檔編號H04N7/30GK101610418SQ20091010868
公開日2009年12月23日 申請日期2009年7月14日 優(yōu)先權(quán)日2009年7月14日
發(fā)明者軍 喻 申請人:深圳市融創(chuàng)天下科技發(fā)展有限公司