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