廖 諍,黃海云,賈 楊
(國家知識產(chǎn)權(quán)局專利局 專利審查協(xié)作北京中心,北京 100190)
在C6000系列DSP芯片中實現(xiàn)H.264算法進(jìn)行視頻壓縮編碼,已廣泛應(yīng)用于多媒體、數(shù)字電視、圖像處理、視頻監(jiān)控、可視電話、視頻桌面系統(tǒng)等視頻信號處理領(lǐng)域,應(yīng)用單指令多數(shù)據(jù)流(Single Instruction Multiple Data,SIMD)技術(shù)對H.264算法進(jìn)行代碼級優(yōu)化,可在無PSNR(峰值信噪比)損失的情況下,有效提高程序運行速度,滿足視頻領(lǐng)域?qū)崟r信號處理的要求。
DSP端代碼的優(yōu)化主要分為三個層次:項目級優(yōu)化、算法級優(yōu)化和代碼級優(yōu)化[1]。代碼級優(yōu)化的優(yōu)點是,加入優(yōu)化函數(shù)模塊前后,程序運行結(jié)果不變,沒有PSNR(峰值信噪比)損失,且程序運行速度得到提高。
在進(jìn)行代碼優(yōu)化的過程中,主要采用了SIMD技術(shù)。類似于Intel公司的MMX/SSE/SSE2指令集所采用的奔騰單指令多數(shù)據(jù)(Single Instruction Multiple Data,SIMD)技術(shù),C6000 DSP中也提供了自己的單指令多數(shù)據(jù)流(SIMD)指令集,雖然沒有MMX指令集中的指令及寄存器資源豐富,但其仍可以通過對成組數(shù)據(jù)并行操作最大限度地提高運行速度。
進(jìn)行代碼級優(yōu)化的目標(biāo)主要是程序中耗時比較大和調(diào)用比較頻繁的運算模塊。對代碼進(jìn)行分析及查閱文獻(xiàn)的結(jié)果顯示,DCT、IDCT、量化、SAD、去方塊濾波、運動估計(1/2,1/4像素插值)和運動補(bǔ)償運算量占程序總運算量的比重很大[2-7],因此這部分函數(shù)是程序優(yōu)化的重點。下面分別對這幾個函數(shù)模塊的優(yōu)化方法及優(yōu)化結(jié)果進(jìn)行介紹。
對函數(shù)add4x4_idct,主要利用C64X提供的帶飽和的打包指令_spacku4進(jìn)行算法改進(jìn)。對函數(shù)dct4x4dc,優(yōu)化時打開函數(shù)中循環(huán),并采用SIMD技術(shù),一次對2個16 bit數(shù)據(jù)進(jìn)行操作。
對待優(yōu)化函數(shù)quant_4x4進(jìn)行分析,看出量化系數(shù)的范圍在16 bit之內(nèi),沒有必要采用int型的量化系數(shù)矩陣,因此將量化系數(shù)矩陣的數(shù)據(jù)格式改為short型。由于函數(shù)中存在判斷語句,考慮通過將判斷條件作為標(biāo)志量flag,使其參加運算,而不進(jìn)行條件判斷,但經(jīng)過實驗證明,該方法并沒有提高程序的運行速度。又考慮到判斷語句和運算同時存在于循環(huán)中,優(yōu)化編譯器無法對循環(huán)中的運算進(jìn)行流水,影響了運算整體的運行速度,因此,將循環(huán)中的判斷語句與運算分別放入兩個不同的循環(huán)中進(jìn)行,這樣編譯器會對含有運算的循環(huán)進(jìn)行優(yōu)化,從而提高程序速度。
對函數(shù)dequant_4x4,優(yōu)化時首先分析待優(yōu)化函數(shù)的數(shù)據(jù)范圍,將反量化矩陣的數(shù)據(jù)類型由(int)型改為(short)型,同時在兩個16 bit數(shù)據(jù)相乘時,根據(jù)其數(shù)據(jù)范圍判斷其乘積不會超過16 bit[8],因此進(jìn)行了直接截取,采用SIMD技術(shù),一次對2個16 bit數(shù)據(jù)進(jìn)行操作的方法,減少循環(huán)次數(shù)。
對deblock_v_luma_c函數(shù),優(yōu)化時考慮到函數(shù)中存在較多的判斷語句,比較耗時,因此主要采用了將函數(shù)中判斷語句簡化為標(biāo)志量的方法進(jìn)行優(yōu)化。在采用簡化函數(shù)中判斷語句的方法進(jìn)行優(yōu)化前,曾考慮采用SIMD方法進(jìn)行優(yōu)化,但存在2個比較主要的問題:一是DSP中SIMD指令相對MMX指令要少,很多相應(yīng)操作沒有找到合適的SIMD指令;二是在進(jìn)行horizon方向的濾波時,如果要進(jìn)行SIMD的優(yōu)化,首先要對輸入數(shù)據(jù)做比較復(fù)雜的打包處理,影響優(yōu)化效果。由于上述2個原因,對去方塊濾波函數(shù)沒有采用SIMD方法進(jìn)行優(yōu)化。
對deblock_h_luma_c,deblock_v_luma_intra_c及deblock_h_luma_intra_c函數(shù),優(yōu)化時均采用了與函數(shù)deblock_v_luma_c類似的優(yōu)化方法。
對mc_hh函數(shù),優(yōu)化函數(shù)主要通過調(diào)用x264_tapfilter1_opt4in1函數(shù),代替了原函數(shù)中調(diào)用的x264_tapfilter1及 x264_mc_clip1。x264_tapfilter1_opt4in1函數(shù)根據(jù)數(shù)據(jù)結(jié)構(gòu)的特點進(jìn)行了編排,由于x264_tapfilter1實際為6抽頭濾波器,因此在x264_tapfilter1_opt4in1函數(shù)中6次調(diào)用_mem4函數(shù),每次取出X方向上連續(xù)的4個unsigned char數(shù)據(jù),采用SIMD的內(nèi)聯(lián)函數(shù)指令,這樣進(jìn)行一次6抽頭的濾波操作,可同時完成對4組數(shù)據(jù)的6抽頭濾波,其數(shù)據(jù)處理的結(jié)構(gòu)如圖1所示。
在x264_tapfilter1_opt4in1函數(shù)中,還根據(jù)數(shù)據(jù)的范圍將 unsigned char通過_mpyu4(src[j],0x01010101)指令進(jìn)行無符號的擴(kuò)展,成為16 bit數(shù)據(jù),以進(jìn)行進(jìn)一步計算;通過_spacku4指令進(jìn)行數(shù)據(jù)鉗位操作[9]。
對函數(shù)mc_hv,優(yōu)化函數(shù)主要通過調(diào)用x264_tapfilter_opt4in1函數(shù),代替了原函數(shù)中調(diào)用的x264_tapfilter及x264_mc_clip1。x264_tapfilter_opt4in1函數(shù)根據(jù)數(shù)據(jù)結(jié)構(gòu)的特點進(jìn)行了編排,由于x264_tapfilter實際為6抽頭濾波器,因此在x264_tapfilter_opt4in1函數(shù)中6次調(diào)用_mem4函數(shù),每次取出X方向上連續(xù)的4個unsigned char數(shù)據(jù),采用SIMD的內(nèi)聯(lián)函數(shù)指令,這樣進(jìn)行一次6抽頭的濾波操作,可同時完成對4組數(shù)據(jù)的6抽頭濾波,其數(shù)據(jù)處理的結(jié)構(gòu)如圖2所示。
對于函數(shù)mc_hc,優(yōu)化時首先分析待優(yōu)化函數(shù)的處理過程,如圖3所示,在一次計算中首先對X方向6行像素點分別進(jìn)行6抽頭濾波,然后對濾波結(jié)果tap[0]~tap[5]進(jìn)行6抽頭垂直濾波,故對6×6的像素點進(jìn)行處理,可產(chǎn)生一個*out結(jié)果數(shù)據(jù)。在下一次的垂直濾波中,僅需再進(jìn)行一次水平6抽頭濾波,就可與已經(jīng)計算出的tap[1]~tap[5]進(jìn)行垂直濾波,產(chǎn)生新的結(jié)果數(shù)據(jù)*(out+i_dst_stride)。
前面已經(jīng)在對函數(shù)mc_hh的優(yōu)化中,完成了一次進(jìn)行4組6抽頭水平濾波的優(yōu)化,在對函數(shù)mc_hv的優(yōu)化中,完成了一次進(jìn)行4組6抽頭垂直濾波的優(yōu)化,因此mc_hc的優(yōu)化過程如圖4所示。
優(yōu)化后函數(shù)每次對9×9個數(shù)據(jù)進(jìn)行處理,先調(diào)用x264_tapfilter1_opt4in1函數(shù)對水平方向上的9個數(shù)據(jù)[3],進(jìn)行水平方向的6抽頭濾波,產(chǎn)生了4個tap數(shù)據(jù),然后利用部分tap數(shù)據(jù)的重復(fù)性,進(jìn)行了4次垂直方向的6抽頭濾波,每次濾波產(chǎn)生4個結(jié)果數(shù)據(jù),因此一次處理可產(chǎn)生16個unsigned char結(jié)果數(shù)據(jù)。
然而,由于在未優(yōu)化函數(shù)中,水平濾波時的結(jié)果沒有進(jìn)行求均值(右移)操作,而將中間結(jié)果數(shù)據(jù)保存為int型,然后在對int型數(shù)據(jù)進(jìn)行垂直濾波后才統(tǒng)一進(jìn)行了求均值(〉〉10)的操作,最后將垂直濾波后的結(jié)果保留為(unsigned char)型。但依照上面所述的優(yōu)化過程,在進(jìn)行水平濾波時,就已經(jīng)進(jìn)行了平均,保存的中間結(jié)果即為(unsigned char)型,垂直濾波也是對(unsigned char)型進(jìn)行的,因此優(yōu)化后的結(jié)果與未優(yōu)化函數(shù)產(chǎn)生的結(jié)果有一定的差距,但該差距是有計算精度帶來的,并不是錯誤。
為滿足與原版本程序結(jié)果一致性的需求,還對原函數(shù)采用其它方法進(jìn)行了優(yōu)化,但僅利用了水平濾波結(jié)果tap的重復(fù)性,因此優(yōu)化效果不太理想。
對于函數(shù)mc_luma,分析待優(yōu)化函數(shù),由于其存在條件判斷分支,但其中一個分支的運算比較復(fù)雜,一個僅是簡單的數(shù)據(jù)copy,并不適合采用類似去方塊中采用的標(biāo)志位方法,去掉條件判斷,因此僅對第一個分支中的pixel_avg函數(shù)采用SIMD方法進(jìn)行了優(yōu)化,優(yōu)化后該函數(shù)一次可對4個像素點進(jìn)行平均。
對于函數(shù)get_ref,優(yōu)化時采用了與函數(shù)mc_luma類似的優(yōu)化方法。
模塊優(yōu)化結(jié)果匯總在表1中。
表1 運動補(bǔ)償函數(shù)的優(yōu)化結(jié)果
綜上所述,在對DCT、IDCT進(jìn)行優(yōu)化的過程中主要采用了SIMD技術(shù);在對量化、反量化進(jìn)行優(yōu)化的過程中,主要將量化及反量化系數(shù)矩陣的數(shù)據(jù)類型由int型改為了short型,并將判斷語句與計算語句分別進(jìn)行循環(huán);在對去方塊濾波函數(shù)進(jìn)行優(yōu)化的過程中,主要通過將標(biāo)志位加入運算式的方法,去除了循環(huán)中的判斷語句;在對插值函數(shù)進(jìn)行優(yōu)化的過程中,主要利用了數(shù)據(jù)結(jié)構(gòu)的重復(fù)性,并采用了SIMD技術(shù);在對運動補(bǔ)償函數(shù)進(jìn)行優(yōu)化的過程中,也主要采用了SIMD技術(shù)。
將上述優(yōu)化后的函數(shù)模塊替換原函數(shù),其運行結(jié)果不變,運行時間如表2所示。
表2 加入優(yōu)化函數(shù)模塊前后單幀運行時間統(tǒng)計表
在今后的工作中還可對采用SIMD技術(shù)進(jìn)行代碼級優(yōu)化進(jìn)行進(jìn)一步研究,對圖像壓縮編碼程序中效率較低或之前優(yōu)化效果不理想的模塊進(jìn)行進(jìn)一步優(yōu)化。同時,也可將該方法應(yīng)用于除H.264算法以外的DSP程序中,提高嵌入式系統(tǒng)的運行效率,滿足用戶日益增長的對信號進(jìn)行實時處理的需求。
[1]張旭東,魏振宇,史鹍.H.264編解碼器在C6416 DSP上的實現(xiàn)與優(yōu)化[J].電子產(chǎn)品世界,2005(5):71-74.
[2]安向陽,沈庭芝.基于DSP TMS320DM642的H.264視頻編碼的實現(xiàn)和優(yōu)化[J].微計算機(jī)信息,2005(20):128-130.
[3]林冰,馮艷,李學(xué)明.基于Trimedia DSP的H.264解碼算法優(yōu)化[J].計算機(jī)工程與應(yīng)用,2005,41(31):41-45.
[4]陳維安,李典,余松煜,等.H.264軟件解碼器的優(yōu)化[J].數(shù)據(jù)采集與處理,2005,20(4):493-498.
[5]朱冬冬,丁嶸,尹亞光,等.H.264軟件解碼器的優(yōu)化[J].電視技術(shù),2003,27(12):4-6.
[6]朱林,馮燕.基于單指令多數(shù)據(jù)技術(shù)的H.264編碼優(yōu)化[J].計算機(jī)應(yīng)用,2005,25(12):2798-2799.
[7]鹿寶生,陳啟美.H.264高性能視頻編碼器的DSP實現(xiàn)[J].計算機(jī)應(yīng)用,2005,25(12):2824-2827.
[8]張琦,萬楓丹,段柯,等.基于MMX/SSE/SSE2的H.264解碼器關(guān)鍵算法優(yōu)化[J].信息與電子工程,2006,4(1):14-17.
[9]陳梅芳.基于TMS320DM642的H.264解碼器優(yōu)化[J].現(xiàn)代電子技術(shù),2006,29(3):112-115.