廖 諍,黃海云,賈 楊
(國家知識產權局專利局 專利審查協作北京中心,北京 100190)
在C6000系列DSP芯片中實現H.264算法進行視頻壓縮編碼,已廣泛應用于多媒體、數字電視、圖像處理、視頻監控、可視電話、視頻桌面系統等視頻信號處理領域,應用單指令多數據流(Single Instruction Multiple Data,SIMD)技術對H.264算法進行代碼級優化,可在無PSNR(峰值信噪比)損失的情況下,有效提高程序運行速度,滿足視頻領域對實時信號處理的要求。
DSP端代碼的優化主要分為三個層次:項目級優化、算法級優化和代碼級優化[1]。代碼級優化的優點是,加入優化函數模塊前后,程序運行結果不變,沒有PSNR(峰值信噪比)損失,且程序運行速度得到提高。
在進行代碼優化的過程中,主要采用了SIMD技術。類似于Intel公司的MMX/SSE/SSE2指令集所采用的奔騰單指令多數據(Single Instruction Multiple Data,SIMD)技術,C6000 DSP中也提供了自己的單指令多數據流(SIMD)指令集,雖然沒有MMX指令集中的指令及寄存器資源豐富,但其仍可以通過對成組數據并行操作最大限度地提高運行速度。
進行代碼級優化的目標主要是程序中耗時比較大和調用比較頻繁的運算模塊。對代碼進行分析及查閱文獻的結果顯示,DCT、IDCT、量化、SAD、去方塊濾波、運動估計(1/2,1/4像素插值)和運動補償運算量占程序總運算量的比重很大[2-7],因此這部分函數是程序優化的重點。下面分別對這幾個函數模塊的優化方法及優化結果進行介紹。
對函數add4x4_idct,主要利用C64X提供的帶飽和的打包指令_spacku4進行算法改進。對函數dct4x4dc,優化時打開函數中循環,并采用SIMD技術,一次對2個16 bit數據進行操作。
對待優化函數quant_4x4進行分析,看出量化系數的范圍在16 bit之內,沒有必要采用int型的量化系數矩陣,因此將量化系數矩陣的數據格式改為short型。由于函數中存在判斷語句,考慮通過將判斷條件作為標志量flag,使其參加運算,而不進行條件判斷,但經過實驗證明,該方法并沒有提高程序的運行速度。又考慮到判斷語句和運算同時存在于循環中,優化編譯器無法對循環中的運算進行流水,影響了運算整體的運行速度,因此,將循環中的判斷語句與運算分別放入兩個不同的循環中進行,這樣編譯器會對含有運算的循環進行優化,從而提高程序速度。
對函數dequant_4x4,優化時首先分析待優化函數的數據范圍,將反量化矩陣的數據類型由(int)型改為(short)型,同時在兩個16 bit數據相乘時,根據其數據范圍判斷其乘積不會超過16 bit[8],因此進行了直接截取,采用SIMD技術,一次對2個16 bit數據進行操作的方法,減少循環次數。
對deblock_v_luma_c函數,優化時考慮到函數中存在較多的判斷語句,比較耗時,因此主要采用了將函數中判斷語句簡化為標志量的方法進行優化。在采用簡化函數中判斷語句的方法進行優化前,曾考慮采用SIMD方法進行優化,但存在2個比較主要的問題:一是DSP中SIMD指令相對MMX指令要少,很多相應操作沒有找到合適的SIMD指令;二是在進行horizon方向的濾波時,如果要進行SIMD的優化,首先要對輸入數據做比較復雜的打包處理,影響優化效果。由于上述2個原因,對去方塊濾波函數沒有采用SIMD方法進行優化。
對deblock_h_luma_c,deblock_v_luma_intra_c及deblock_h_luma_intra_c函數,優化時均采用了與函數deblock_v_luma_c類似的優化方法。
對mc_hh函數,優化函數主要通過調用x264_tapfilter1_opt4in1函數,代替了原函數中調用的x264_tapfilter1及 x264_mc_clip1。x264_tapfilter1_opt4in1函數根據數據結構的特點進行了編排,由于x264_tapfilter1實際為6抽頭濾波器,因此在x264_tapfilter1_opt4in1函數中6次調用_mem4函數,每次取出X方向上連續的4個unsigned char數據,采用SIMD的內聯函數指令,這樣進行一次6抽頭的濾波操作,可同時完成對4組數據的6抽頭濾波,其數據處理的結構如圖1所示。

在x264_tapfilter1_opt4in1函數中,還根據數據的范圍將 unsigned char通過_mpyu4(src[j],0x01010101)指令進行無符號的擴展,成為16 bit數據,以進行進一步計算;通過_spacku4指令進行數據鉗位操作[9]。
對函數mc_hv,優化函數主要通過調用x264_tapfilter_opt4in1函數,代替了原函數中調用的x264_tapfilter及x264_mc_clip1。x264_tapfilter_opt4in1函數根據數據結構的特點進行了編排,由于x264_tapfilter實際為6抽頭濾波器,因此在x264_tapfilter_opt4in1函數中6次調用_mem4函數,每次取出X方向上連續的4個unsigned char數據,采用SIMD的內聯函數指令,這樣進行一次6抽頭的濾波操作,可同時完成對4組數據的6抽頭濾波,其數據處理的結構如圖2所示。

對于函數mc_hc,優化時首先分析待優化函數的處理過程,如圖3所示,在一次計算中首先對X方向6行像素點分別進行6抽頭濾波,然后對濾波結果tap[0]~tap[5]進行6抽頭垂直濾波,故對6×6的像素點進行處理,可產生一個*out結果數據。在下一次的垂直濾波中,僅需再進行一次水平6抽頭濾波,就可與已經計算出的tap[1]~tap[5]進行垂直濾波,產生新的結果數據*(out+i_dst_stride)。

前面已經在對函數mc_hh的優化中,完成了一次進行4組6抽頭水平濾波的優化,在對函數mc_hv的優化中,完成了一次進行4組6抽頭垂直濾波的優化,因此mc_hc的優化過程如圖4所示。
優化后函數每次對9×9個數據進行處理,先調用x264_tapfilter1_opt4in1函數對水平方向上的9個數據[3],進行水平方向的6抽頭濾波,產生了4個tap數據,然后利用部分tap數據的重復性,進行了4次垂直方向的6抽頭濾波,每次濾波產生4個結果數據,因此一次處理可產生16個unsigned char結果數據。

然而,由于在未優化函數中,水平濾波時的結果沒有進行求均值(右移)操作,而將中間結果數據保存為int型,然后在對int型數據進行垂直濾波后才統一進行了求均值(〉〉10)的操作,最后將垂直濾波后的結果保留為(unsigned char)型。但依照上面所述的優化過程,在進行水平濾波時,就已經進行了平均,保存的中間結果即為(unsigned char)型,垂直濾波也是對(unsigned char)型進行的,因此優化后的結果與未優化函數產生的結果有一定的差距,但該差距是有計算精度帶來的,并不是錯誤。
為滿足與原版本程序結果一致性的需求,還對原函數采用其它方法進行了優化,但僅利用了水平濾波結果tap的重復性,因此優化效果不太理想。
對于函數mc_luma,分析待優化函數,由于其存在條件判斷分支,但其中一個分支的運算比較復雜,一個僅是簡單的數據copy,并不適合采用類似去方塊中采用的標志位方法,去掉條件判斷,因此僅對第一個分支中的pixel_avg函數采用SIMD方法進行了優化,優化后該函數一次可對4個像素點進行平均。
對于函數get_ref,優化時采用了與函數mc_luma類似的優化方法。
模塊優化結果匯總在表1中。

表1 運動補償函數的優化結果
綜上所述,在對DCT、IDCT進行優化的過程中主要采用了SIMD技術;在對量化、反量化進行優化的過程中,主要將量化及反量化系數矩陣的數據類型由int型改為了short型,并將判斷語句與計算語句分別進行循環;在對去方塊濾波函數進行優化的過程中,主要通過將標志位加入運算式的方法,去除了循環中的判斷語句;在對插值函數進行優化的過程中,主要利用了數據結構的重復性,并采用了SIMD技術;在對運動補償函數進行優化的過程中,也主要采用了SIMD技術。
將上述優化后的函數模塊替換原函數,其運行結果不變,運行時間如表2所示。

表2 加入優化函數模塊前后單幀運行時間統計表
在今后的工作中還可對采用SIMD技術進行代碼級優化進行進一步研究,對圖像壓縮編碼程序中效率較低或之前優化效果不理想的模塊進行進一步優化。同時,也可將該方法應用于除H.264算法以外的DSP程序中,提高嵌入式系統的運行效率,滿足用戶日益增長的對信號進行實時處理的需求。
[1]張旭東,魏振宇,史鹍.H.264編解碼器在C6416 DSP上的實現與優化[J].電子產品世界,2005(5):71-74.
[2]安向陽,沈庭芝.基于DSP TMS320DM642的H.264視頻編碼的實現和優化[J].微計算機信息,2005(20):128-130.
[3]林冰,馮艷,李學明.基于Trimedia DSP的H.264解碼算法優化[J].計算機工程與應用,2005,41(31):41-45.
[4]陳維安,李典,余松煜,等.H.264軟件解碼器的優化[J].數據采集與處理,2005,20(4):493-498.
[5]朱冬冬,丁嶸,尹亞光,等.H.264軟件解碼器的優化[J].電視技術,2003,27(12):4-6.
[6]朱林,馮燕.基于單指令多數據技術的H.264編碼優化[J].計算機應用,2005,25(12):2798-2799.
[7]鹿寶生,陳啟美.H.264高性能視頻編碼器的DSP實現[J].計算機應用,2005,25(12):2824-2827.
[8]張琦,萬楓丹,段柯,等.基于MMX/SSE/SSE2的H.264解碼器關鍵算法優化[J].信息與電子工程,2006,4(1):14-17.
[9]陳梅芳.基于TMS320DM642的H.264解碼器優化[J].現代電子技術,2006,29(3):112-115.