高速率AVS整数变换的汇编实现与优化
1 引言
AVS標(biāo)準(zhǔn)Ⅲ采用的8x8整數(shù)變換在獲得較H.264更高的壓縮率和主觀圖像質(zhì)量的同時,增加了算法的實現(xiàn)復(fù)雜性和時間開銷。本文重點研究AVS編解碼器的整數(shù)變換模塊,針對不同的算法實現(xiàn)模式,在原有Visual C++6.0整數(shù)變換模塊基礎(chǔ)上,分別應(yīng)用MMX,SSE2和加強了乘法操作的SSE2內(nèi)聯(lián)匯編指令技術(shù),優(yōu)化整數(shù)變換的關(guān)鍵算法,實驗結(jié)果表明,性能最優(yōu)的SSE優(yōu)化算法將單次整數(shù)變換的平均時延減少到0.5。ms以內(nèi),其編碼速度比Visual C++6.0整數(shù)變換模塊提高了6.3倍,實現(xiàn)了高速率的AVS整數(shù)變換,具有較大的實用價值。
2 AVS整數(shù)變換及蝶形算法
由于AVS正變換、反變換的基本原理近似,本文僅以正變換的分析與優(yōu)化為例來詳細(xì)說明。AVS對殘差矩陣X的二維整數(shù)正變換定義為
式中:T8為變換矩陣,如圖1所示。AVS整數(shù)變換的變換系數(shù)存在對稱性,僅用加法和移位就可實現(xiàn),消除了逆變換的不匹配,容易使用基8蝶形算法快速實現(xiàn)。圖2所示為水平變換XT8的一維8點快速蝶形算法。顯然,采用兩個近似的C語言代碼段就可實現(xiàn)由X到H的變換過程。依此設(shè)計的Visual C++6.O整數(shù)變換模塊的算法清晰簡單,容易更改數(shù)據(jù)長度,代碼冗余少,但由于C程序不針對硬件編程,其較低的編解碼速度不能滿足HDTV實時性要求。
| |
3 整數(shù)變換的優(yōu)化設(shè)計
3.1 AVS整數(shù)變換的算法模式
利用矩陣乘法的結(jié)合律,公式(1)可以改寫為
從而AVS整數(shù)變換的算法模式可分為4類:
1)水平變換一垂直變換:先水平變換H′=XT8再垂直變換
2)水平變換一轉(zhuǎn)置一水平變換一轉(zhuǎn)置:計算次序為
3)垂直變換一水平變換:計算次序為
4)垂直變換一轉(zhuǎn)置一垂直變換一轉(zhuǎn)置:計算次序為
無論采用上述哪種算法模式,為獲得高質(zhì)量主觀圖像效果并避免數(shù)據(jù)溢出,第一次變換前殘差塊X的每個元素均要由8位整型數(shù)據(jù)擴(kuò)展為16位,第二次變換結(jié)果H的每個元素均要擴(kuò)展為32位。為兼顧較高的圖像壓縮效率,最終輸出結(jié)果需緊縮為16位的整型數(shù)據(jù)。
整數(shù)變換是典型的以計算為主的編碼過程[2-3],為改進(jìn)數(shù)字視頻系統(tǒng)的實時性,需在Visual C++6.0基礎(chǔ)上使用內(nèi)聯(lián)匯編,采用:Intel單指令多數(shù)據(jù)并行加速技術(shù)(SIMD)作面向硬件的程序流程和代碼級優(yōu)化[4]。
3.2基于MMX的優(yōu)化
根據(jù)上面的分析,垂直變換比水平變換的匯編實現(xiàn)復(fù)雜很多,且轉(zhuǎn)置過程中要并行處理多列數(shù)據(jù),此時MMx指令集使用的64位寄存器遇到每次只能并行處理4個16位元素和2個32位元素的性能瓶頸,適合選擇"水平變換一垂直變換"的算法模式:
1)水平變換H′=XT8:各矩陣元素均為16位,每次循環(huán)分兩步處理殘差矩陣X的一行元素,組合運算后得到矩陣H′相應(yīng)行的元素,8次循環(huán)后計算得到矩陣H′。
2)垂直變換:每次取矩陣H′的兩列向量的前兩個元素,擴(kuò)展為32位數(shù)據(jù)后作組合運算,再將結(jié)果緊縮為16位數(shù)據(jù);此過程分4次循環(huán)計算得到矩陣H。
圖3為基于MMX的整數(shù)變換匯編優(yōu)化的算法流程。程序中多次使用混排指令pshufw,節(jié)省了大量movq和punpckhdq指令的時間開銷。
3.3基于SSE2的優(yōu)化
SSE2是基于128位寄存器的指令集,并行處理能力強大,水平變換和矩陣轉(zhuǎn)置比基于MMX的優(yōu)化更易實現(xiàn),采用"水平變換一轉(zhuǎn)置一水平變換一轉(zhuǎn)置"模式能僅以兩次轉(zhuǎn)置過程的延時為代價減少垂直變換的代碼和時間開銷。具體實現(xiàn)步驟:
1)第一次水平變換H′=XT8:各矩陣元素占一個字,每次變換一個行向量;
2)第一次矩陣轉(zhuǎn)置得到H′;
3)第二次水平變換J=H′TT8:矩陣各元素占一個雙字,每次取矩陣H′各列的前4個元素并擴(kuò)展為32位數(shù)據(jù),作一系列組合運算即每次對4個行向量水平變換,變換后結(jié)果緊縮為16位數(shù)據(jù),只需2次循環(huán)就能變換完H′T的全部元素得到矩陣J;
4)第二次矩陣轉(zhuǎn)置:采用與第一次矩陣轉(zhuǎn)置相同的代碼段得到H=JT。
根據(jù)圖4所示的算法流程,編寫的優(yōu)化程序可使用大量相同的代碼段實現(xiàn)第一次水平變換,而第二次水平變換僅用2次循環(huán)實現(xiàn),2次轉(zhuǎn)置由相同的混排程序?qū)崿F(xiàn),可見整個優(yōu)化程序減少了循環(huán)調(diào)用和運算復(fù)雜度。
3.4側(cè)重使用SSE2乘法指令的優(yōu)化
研究表明,垂直變換是匯編代碼開銷最高、時間消耗最大的環(huán)節(jié)。根據(jù)增強乘法功能SSE2指令集能在多媒體處理中大量減少乘加運算的特點,圖2和基于MMx的整數(shù)變換匯編程序中大量不可替換的乘加步驟可由側(cè)重使用SSE2乘法指令進(jìn)行優(yōu)化。
假定矩陣
直接計算垂直變換 得到
如果利用寄存器特性,公式(4)對日的行向量計算可由圖5所示快速算法求出。圖中每個方框代表一個128位的寄存器空間,每個寄存器存儲8個16位數(shù)據(jù),左右兩邊每對寄存器相同位置的數(shù)據(jù)對應(yīng)相乘后結(jié)果相加,即得到所求矩陣H的行向量。這一算法大大減少了求和次數(shù),而且乘積與求和可以循環(huán)運算,提高了寄存器的利用率。
筆者分別使用MMx,SSE2并側(cè)重使用SSE2乘法指令內(nèi)聯(lián)匯編,按照上文提出的優(yōu)化算法在P4,1.8 GHz。512 Mbyte內(nèi)存環(huán)境下進(jìn)行了實驗仿真,結(jié)果如表1所示。
5 小結(jié)
AVS整數(shù)變換的延時對數(shù)字電視系統(tǒng)的實時性有著重要的影響。筆者針對AVS整數(shù)變換的不同實現(xiàn)模式進(jìn)行了研究,結(jié)合MMX,SSE2和側(cè)重使用乘法的SSE2等指令集的特性,在Visual C++6.0實現(xiàn)整數(shù)變換模塊的基礎(chǔ)上使用內(nèi)聯(lián)匯編,對整數(shù)變換模塊進(jìn)行了優(yōu)化。實驗結(jié)果表明,基于SSE2的整數(shù)變換優(yōu)化算法的性能最優(yōu),單次變換的平均時延減至0.5 ms以內(nèi),實現(xiàn)了高速率的AVS整數(shù)變換,適合高端硬件實現(xiàn)并獲得較高的性價比;基于MMX的優(yōu)化算法適合低端硬件實現(xiàn)獲得較高的性價比,而側(cè)重使用SSE2乘法指令的優(yōu)化算法也具有進(jìn)一步研究的價值。創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的高速率AVS整数变换的汇编实现与优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中map的使用
- 下一篇: 深入浅出MFC:DDX_Control本