基于SIMD 的AVS 整數反變換算法設計與
優化
王玲娟,張剛**
作者簡介:王玲娟,(1987-),女,在讀碩士,主要研究方向:視頻解碼算法
通信聯系人:張剛,(1953-),男,教授,主要研究方向:語音編碼、視頻編碼、嵌入式系統. E-mail:
princessjuan520@163.com
5 (太原理工大學信息工程學院,太原 030024)
摘要:AVS 整數反變換是典型的以計算為主的解碼過程。為提高解碼速率,本文通過改進反
變換算法并用SIMD 技術對其中計算量最大、耗時最長的部分代碼進行了優化。在此之前先
進行全零塊處理以減少不必要的計算。實驗結果表明該優化方案可行并且解碼器的運算速度
得到顯著提高。
10 關鍵詞:AVS;反變換;SIMD
中圖分類號:TN919.8
?25 0 引言
AVS 作為中國具有自主知識產權的新一代音視頻編解碼標準,在高清數字視頻及網絡
多媒體應用方面表現出好的性能和低的復雜度[1]。在同等畫面質量的前提下,AVS 標準的數
據壓縮率比傳統的MPEG-2 效率提高了2 到3 倍,與MPEG-4AVC/H.264 標準壓縮效率相
當,但比H.264 降低30%到50%的計算資源,大大節省了軟硬件成本,發展前景巨大[2]。而
30 目前AVS 官方提供的解碼參考軟件對于大部分視頻圖像不能進行實時解碼,不利于AVS
產業化的推廣,有待于不斷地進行改進和優化以達到對基本的CIF、D1 等格式圖像的實時
解碼要求。
本文正是基于上面的應用需求,對AVS 解碼標準進行了研究。依據AVS 整數反變換算
法的特點,對算法的實現進行結構上的設計,并在vc 下利用SIMD 技術對其進行優化。在
35 保證解碼質量的前提下,提高了解碼軟件的運行速度,具有實際的意義。
1 SIMD 指令介紹
SIMD 指令能在一個指令周期中完成多組數據并行操作計算,是當前多媒體信息處理實
時實現中一個重要的技術[3]。目前, IA-32 的SIMD 指令包括MMX、SSE、SSE2、SSE3 等
幾級,它們都是在原來的處理器指令集的基礎上添加的擴展指令集, 都是SIMD 指令。
?40 (1)MMX 簡介
在通用處理器中, Intel 為了提高其多媒體處理能力, 在PentiumⅡ中引入了MMX 指令,
MMX 中定義了57 條新指令、8 個64 位的寄存器和4 種新的數據類型,新指令包括算術、
比較、轉換、邏輯、移位、數據傳輸指令和狀態清空7 類,只能處理整數類型數據。
(2)SSE 簡介
45 由于MMX 的寄存器只有64 位,在處理浮點運算時就力不從心了,容易出現overflow
的現象,所以在PentiumⅢ中又加入了SSE(String SIMD Extension) 指令集。SSE 指令增加
了單精度浮點數的SIMD 支持,并且SSE 定義了8 個全新的128 位寄存器,每個寄存器可以
存放128 位的整數或浮點數。
(3)SSE2 簡介
50 在PentiumⅣ中擴充了SSE 指令集形成了SSE2 指令集。SSE2 在SSE 基礎上增加了對
雙精度浮點數的支持和一些新指令。SSE2 共有144 個SIMD 指令,能處理128 位整數和雙
精度浮點數運算。SSE2 由兩個不同的部分組成: SSE 部分和MMX 部分。前者主要負責處理
浮點數, 后者則專門計算整數。在指令處理速度保持不變的情況下,通過SSE2 優化后的應用
軟件運行速度將提高2 倍。由于SSE2 指令集與MMX 相兼容, 因此將被MMX 優化過的程
55 序再進行一次SSE2 的優化, 則優化的程度會更加徹底。
2 全零塊處理
AVS 使用的是預測編碼,進行反變換的矩陣存放的是殘差數據,而殘差數據很明顯的
特點是:殘差值都很小,并且很多整個8*8 塊的殘差數據都為零。統計三個典型標清測試視
頻的全零殘差塊的比例,如表1。
60
表1 全零塊比例統計
Tab.1 All-zero block ratio statistics
QP
測試
序列
(720x480)
22
28
36
football 15.9% 40.5% 65.0%
bus 21.9% 47.4% 72.9%
tempete 24.4% 49.4% 76.5%
由表1 可以看出,殘差值全為零的塊在整個視頻幀中占很大比例,特別是量化系數QP
65 較大時。利用這個特性,本文在解碼端進行一些特殊處理:解碼當前宏塊CBP 值后對四個
亮度塊和兩個色度塊進行全零檢測標志,如式(2-1)所示。
?若當前解碼8*8 塊對應coeff 系數為0,即為全零塊。根據全零的矩陣反變換后仍為零[4],
省去對該塊的反變換操作,則該塊的預測值即為像素值。這樣利用宏塊系數特征就極大的減
70 少了運算量。而不全為零的塊則需反變換后加上預測值才能得到像素值,如圖1 所示。
?圖1 全零塊的優化示意圖
Fig.1 Optimization of all-zero block diagram
75 3 反變換模塊的算法分析
AVS 采用基于8×8 塊的整數IDCT 算法。二維整數IDCT 算法可以轉換為水平和垂直方
向的一維IDCT 算法的組合。反變換計算公式為:
H T C T T 8 8 = × × (3-1)
其中,H 表示反變換后的8×8矩陣,C 是8×8變換系數矩陣, 8 T 是8×8 反變換矩陣
(圖2),T T 8 是8 80 T 的轉置矩陣。
?圖2 AVS 中的整數變換矩陣
Fig.2 Integral Transformation Matrix of AVS
85 AVS 整數反變換的變換系數存在對稱性,僅用加法、減法和移位就可實現,容易使用
基8 蝶形算法快速實現[5]。
?圖3 一維反變換蝶形算法
Fig.3 One-dimensional Inverse Transform Butterfly Algorithm
90
圖3 為水平反變換的一維8 點快速蝶形算法原理。顯然,采用兩個近似的C 語言代碼
段就可實現由X 到H 的變換過程。依此設計的Visual C++6.0 整數變換模塊的算法清晰簡單,
容易更改數據長度,代碼冗余少,但由于C 程序不針對硬件編程,其較低的編解碼速度不
能滿足實時性要求,因此需要利用單指令多數據技術對AVS 整數IDCT 模塊進行優化。
95 4 反變換算法的設計與優化
4.1 反變換算法的計算次序分析
利用矩陣乘法的結合律,公式(3-1)可以改寫為:
H = T ×C ×T T = T × (C ×T T )=(T ×C)×T T = [(C ×T T )T ×T T ]T =[T ×(T ×C)T]T 8 8 8 8 8 8 8 8 8 8
從而AVS 整數反變換算法的計算次序可分為4 類:
1) 垂直反變換-水平反變換:計算次序為H (T C) T T 8 8 100 = × × ,即先垂直反變換
H = T ×C 8
' 再水平反變換H H T T 8
= ' × ;
2) 水平反變換-垂直反變換:計算次序為H T (C T T ) 8 8 = × × ;
3) 水平反變換-轉置-水平反變換-轉置:計算次序為[( ) ]T
H C T T T T T 8 8 = × × ;
4) 垂直反變換-轉置-垂直反變換-轉置:計算次序為H = [T ×(T ×C)T ]T 8 8 。
105 無論采用上述哪種計算次序,為獲得高質量主觀圖像效果并避免數據溢出,第一次反變
換前C 的每一個元素都要由8 位整型數據擴展為16 位,第二次反變換結果H 的每個元素都
要擴展為32 位。為兼顧較高的圖像壓縮效率,最終輸出結果需要緊縮為16 位的整型數據。
4.2 基于SSE2 的反變換算法設計
考慮到算法精度要求和寄存器有限的情況,若采用MMX 指令進行優化,則需要多次的
110 數據讀取,而內存單元的訪問速度也制約了多媒體指令的優化[6]。因此本文最終決定采用
SSE2 指令集實現反變換模塊。SSE2 是基于128 位寄存器的指令集,其指令功能與MMX 類
似,但是并行處理能力更強大,反變換和矩陣轉置比基于MMX 的優化更易實現。
?采用:“垂直反變換-轉置-垂直反變換-轉置”計算次序能僅以兩次轉置過程的延時為代價
減少水平反變換的代碼和時間開銷。具體實現步驟:
1) 第一次垂直反變換H = T ×C 8
115 ' :各矩陣元素為16 位,每次變換一個行向量,8
次循環后計算得到矩陣H ' ;
2) 第一次矩陣轉置得到
T H ' ;
3) 第二次垂直反變換
T H T H '
8
'' = × :每次取矩陣
T H ' 各列的前4 個元素,擴展為
32 位數據后作組合運算,每次變換4 個行向量,變換后結果緊縮為16 位數據,2
120 次循環后計算得到矩陣H '' ;
4) 第二次矩陣轉置得到
T H = H '' :采用與第一次矩陣轉置相同的代碼段得到H 。
4.3 基于SSE2 的反變換算法優化
4.3.1 PMADDWD 指令介紹
125 圖4 PMADDWD 指令
Fig.4 PMADDWD instruction
圖4 中寄存器是128 位的,上面兩個寄存器分別存儲8 個16 位數據。圖中顯示了緊縮
字乘、積相加PMADDWD 指令的執行:將兩個寄存器相同位置的字組數據對應相乘,然后
130 將32 位結果逐對相加并作為雙字存于寄存器中。該指令用于以下矩陣乘法。
4.3.2 矩陣乘法的高效實現
以4*4 矩陣為例,設計一種高效的矩陣乘法的方法。
?圖5 4*4矩陣乘法
135 Fig.5 4*4matrix multiplications
圖5 中顯示了一個典型的4*4 矩陣乘法[7]。如果簡單的存儲X 的行向量和Y 的列向量
分別到兩個寄存器后使用PMADDWD 指令,顯然,乘法運算太多和寄存器資源有限使得這
樣直接變換的匯編代碼和時間開銷代價非常大。為避免這種問題,下面顯示了一個高效的矩
140 陣乘法的方法。
?圖6 高效的4*4 矩陣乘法的實現
Fig.6 Efficient 4*4 matrix multiplication implementation
145 圖6 中顯示了計算結果矩陣的第一行的例子。矩陣X 和Y 以特定的形式存儲到寄存器
中,在這些寄存器對上執行PMADDWD 指令,使每對寄存器相同位置的數據對應相乘后結
果相加。用類似的方法計算矩陣的后三行,在這種情況下,不需要重載矩陣Y,而每行最后
的結果是完全一致的,不需要任何額外的操作重新安排他們的順序。
這種以特定形式加載過程的算法將乘積與求和循環運算,可用SIMD 指令的組合高效實
150 現,提高了寄存器的利用率。這種方法可應用于多個4*4 矩陣乘法運算,也可以通過修改適
應其他大小的矩陣乘法。
4.4 優化結果分析
本文設計的AVS 解碼器的開發平臺為Windows7 操作系統,編譯與調試環境為Visual
Studio2008。對反變換模塊優化前后的解碼速率進行了測試。測試用了兩個視頻序列:(1)
155 幀數為300 幀的Foreman(CIF 352x288)格式序列,由xAVS 編碼器編碼foreman.yuv 標準序
列獲得;(2)幀數為2380 幀的Rili(D1 720x576)序列。測試結果如表2 所示。
表2 測試序列數據
Tab.2 Test Sequences Result
解碼速度(fps) 測試序列 分辨率 幀數
優化前 優化后
Foreman CIF 300 60.53 90.62
Rili D1 2380 14.65 22.43
160
從以上測試結果可以看出,對于解碼cif 格式的視頻流,速率大約提高了30fps;對于解
優化
王玲娟,張剛**
作者簡介:王玲娟,(1987-),女,在讀碩士,主要研究方向:視頻解碼算法
通信聯系人:張剛,(1953-),男,教授,主要研究方向:語音編碼、視頻編碼、嵌入式系統. E-mail:
princessjuan520@163.com
5 (太原理工大學信息工程學院,太原 030024)
摘要:AVS 整數反變換是典型的以計算為主的解碼過程。為提高解碼速率,本文通過改進反
變換算法并用SIMD 技術對其中計算量最大、耗時最長的部分代碼進行了優化。在此之前先
進行全零塊處理以減少不必要的計算。實驗結果表明該優化方案可行并且解碼器的運算速度
得到顯著提高。
10 關鍵詞:AVS;反變換;SIMD
中圖分類號:TN919.8
?25 0 引言
AVS 作為中國具有自主知識產權的新一代音視頻編解碼標準,在高清數字視頻及網絡
多媒體應用方面表現出好的性能和低的復雜度[1]。在同等畫面質量的前提下,AVS 標準的數
據壓縮率比傳統的MPEG-2 效率提高了2 到3 倍,與MPEG-4AVC/H.264 標準壓縮效率相
當,但比H.264 降低30%到50%的計算資源,大大節省了軟硬件成本,發展前景巨大[2]。而
30 目前AVS 官方提供的解碼參考軟件對于大部分視頻圖像不能進行實時解碼,不利于AVS
產業化的推廣,有待于不斷地進行改進和優化以達到對基本的CIF、D1 等格式圖像的實時
解碼要求。
本文正是基于上面的應用需求,對AVS 解碼標準進行了研究。依據AVS 整數反變換算
法的特點,對算法的實現進行結構上的設計,并在vc 下利用SIMD 技術對其進行優化。在
35 保證解碼質量的前提下,提高了解碼軟件的運行速度,具有實際的意義。
1 SIMD 指令介紹
SIMD 指令能在一個指令周期中完成多組數據并行操作計算,是當前多媒體信息處理實
時實現中一個重要的技術[3]。目前, IA-32 的SIMD 指令包括MMX、SSE、SSE2、SSE3 等
幾級,它們都是在原來的處理器指令集的基礎上添加的擴展指令集, 都是SIMD 指令。
?40 (1)MMX 簡介
在通用處理器中, Intel 為了提高其多媒體處理能力, 在PentiumⅡ中引入了MMX 指令,
MMX 中定義了57 條新指令、8 個64 位的寄存器和4 種新的數據類型,新指令包括算術、
比較、轉換、邏輯、移位、數據傳輸指令和狀態清空7 類,只能處理整數類型數據。
(2)SSE 簡介
45 由于MMX 的寄存器只有64 位,在處理浮點運算時就力不從心了,容易出現overflow
的現象,所以在PentiumⅢ中又加入了SSE(String SIMD Extension) 指令集。SSE 指令增加
了單精度浮點數的SIMD 支持,并且SSE 定義了8 個全新的128 位寄存器,每個寄存器可以
存放128 位的整數或浮點數。
(3)SSE2 簡介
50 在PentiumⅣ中擴充了SSE 指令集形成了SSE2 指令集。SSE2 在SSE 基礎上增加了對
雙精度浮點數的支持和一些新指令。SSE2 共有144 個SIMD 指令,能處理128 位整數和雙
精度浮點數運算。SSE2 由兩個不同的部分組成: SSE 部分和MMX 部分。前者主要負責處理
浮點數, 后者則專門計算整數。在指令處理速度保持不變的情況下,通過SSE2 優化后的應用
軟件運行速度將提高2 倍。由于SSE2 指令集與MMX 相兼容, 因此將被MMX 優化過的程
55 序再進行一次SSE2 的優化, 則優化的程度會更加徹底。
2 全零塊處理
AVS 使用的是預測編碼,進行反變換的矩陣存放的是殘差數據,而殘差數據很明顯的
特點是:殘差值都很小,并且很多整個8*8 塊的殘差數據都為零。統計三個典型標清測試視
頻的全零殘差塊的比例,如表1。
60
表1 全零塊比例統計
Tab.1 All-zero block ratio statistics
QP
測試
序列
(720x480)
22
28
36
football 15.9% 40.5% 65.0%
bus 21.9% 47.4% 72.9%
tempete 24.4% 49.4% 76.5%
由表1 可以看出,殘差值全為零的塊在整個視頻幀中占很大比例,特別是量化系數QP
65 較大時。利用這個特性,本文在解碼端進行一些特殊處理:解碼當前宏塊CBP 值后對四個
亮度塊和兩個色度塊進行全零檢測標志,如式(2-1)所示。
?若當前解碼8*8 塊對應coeff 系數為0,即為全零塊。根據全零的矩陣反變換后仍為零[4],
省去對該塊的反變換操作,則該塊的預測值即為像素值。這樣利用宏塊系數特征就極大的減
70 少了運算量。而不全為零的塊則需反變換后加上預測值才能得到像素值,如圖1 所示。
?圖1 全零塊的優化示意圖
Fig.1 Optimization of all-zero block diagram
75 3 反變換模塊的算法分析
AVS 采用基于8×8 塊的整數IDCT 算法。二維整數IDCT 算法可以轉換為水平和垂直方
向的一維IDCT 算法的組合。反變換計算公式為:
H T C T T 8 8 = × × (3-1)
其中,H 表示反變換后的8×8矩陣,C 是8×8變換系數矩陣, 8 T 是8×8 反變換矩陣
(圖2),T T 8 是8 80 T 的轉置矩陣。
?圖2 AVS 中的整數變換矩陣
Fig.2 Integral Transformation Matrix of AVS
85 AVS 整數反變換的變換系數存在對稱性,僅用加法、減法和移位就可實現,容易使用
基8 蝶形算法快速實現[5]。
?圖3 一維反變換蝶形算法
Fig.3 One-dimensional Inverse Transform Butterfly Algorithm
90
圖3 為水平反變換的一維8 點快速蝶形算法原理。顯然,采用兩個近似的C 語言代碼
段就可實現由X 到H 的變換過程。依此設計的Visual C++6.0 整數變換模塊的算法清晰簡單,
容易更改數據長度,代碼冗余少,但由于C 程序不針對硬件編程,其較低的編解碼速度不
能滿足實時性要求,因此需要利用單指令多數據技術對AVS 整數IDCT 模塊進行優化。
95 4 反變換算法的設計與優化
4.1 反變換算法的計算次序分析
利用矩陣乘法的結合律,公式(3-1)可以改寫為:
H = T ×C ×T T = T × (C ×T T )=(T ×C)×T T = [(C ×T T )T ×T T ]T =[T ×(T ×C)T]T 8 8 8 8 8 8 8 8 8 8
從而AVS 整數反變換算法的計算次序可分為4 類:
1) 垂直反變換-水平反變換:計算次序為H (T C) T T 8 8 100 = × × ,即先垂直反變換
H = T ×C 8
' 再水平反變換H H T T 8
= ' × ;
2) 水平反變換-垂直反變換:計算次序為H T (C T T ) 8 8 = × × ;
3) 水平反變換-轉置-水平反變換-轉置:計算次序為[( ) ]T
H C T T T T T 8 8 = × × ;
4) 垂直反變換-轉置-垂直反變換-轉置:計算次序為H = [T ×(T ×C)T ]T 8 8 。
105 無論采用上述哪種計算次序,為獲得高質量主觀圖像效果并避免數據溢出,第一次反變
換前C 的每一個元素都要由8 位整型數據擴展為16 位,第二次反變換結果H 的每個元素都
要擴展為32 位。為兼顧較高的圖像壓縮效率,最終輸出結果需要緊縮為16 位的整型數據。
4.2 基于SSE2 的反變換算法設計
考慮到算法精度要求和寄存器有限的情況,若采用MMX 指令進行優化,則需要多次的
110 數據讀取,而內存單元的訪問速度也制約了多媒體指令的優化[6]。因此本文最終決定采用
SSE2 指令集實現反變換模塊。SSE2 是基于128 位寄存器的指令集,其指令功能與MMX 類
似,但是并行處理能力更強大,反變換和矩陣轉置比基于MMX 的優化更易實現。
?采用:“垂直反變換-轉置-垂直反變換-轉置”計算次序能僅以兩次轉置過程的延時為代價
減少水平反變換的代碼和時間開銷。具體實現步驟:
1) 第一次垂直反變換H = T ×C 8
115 ' :各矩陣元素為16 位,每次變換一個行向量,8
次循環后計算得到矩陣H ' ;
2) 第一次矩陣轉置得到
T H ' ;
3) 第二次垂直反變換
T H T H '
8
'' = × :每次取矩陣
T H ' 各列的前4 個元素,擴展為
32 位數據后作組合運算,每次變換4 個行向量,變換后結果緊縮為16 位數據,2
120 次循環后計算得到矩陣H '' ;
4) 第二次矩陣轉置得到
T H = H '' :采用與第一次矩陣轉置相同的代碼段得到H 。
4.3 基于SSE2 的反變換算法優化
4.3.1 PMADDWD 指令介紹
125 圖4 PMADDWD 指令
Fig.4 PMADDWD instruction
圖4 中寄存器是128 位的,上面兩個寄存器分別存儲8 個16 位數據。圖中顯示了緊縮
字乘、積相加PMADDWD 指令的執行:將兩個寄存器相同位置的字組數據對應相乘,然后
130 將32 位結果逐對相加并作為雙字存于寄存器中。該指令用于以下矩陣乘法。
4.3.2 矩陣乘法的高效實現
以4*4 矩陣為例,設計一種高效的矩陣乘法的方法。
?圖5 4*4矩陣乘法
135 Fig.5 4*4matrix multiplications
圖5 中顯示了一個典型的4*4 矩陣乘法[7]。如果簡單的存儲X 的行向量和Y 的列向量
分別到兩個寄存器后使用PMADDWD 指令,顯然,乘法運算太多和寄存器資源有限使得這
樣直接變換的匯編代碼和時間開銷代價非常大。為避免這種問題,下面顯示了一個高效的矩
140 陣乘法的方法。
?圖6 高效的4*4 矩陣乘法的實現
Fig.6 Efficient 4*4 matrix multiplication implementation
145 圖6 中顯示了計算結果矩陣的第一行的例子。矩陣X 和Y 以特定的形式存儲到寄存器
中,在這些寄存器對上執行PMADDWD 指令,使每對寄存器相同位置的數據對應相乘后結
果相加。用類似的方法計算矩陣的后三行,在這種情況下,不需要重載矩陣Y,而每行最后
的結果是完全一致的,不需要任何額外的操作重新安排他們的順序。
這種以特定形式加載過程的算法將乘積與求和循環運算,可用SIMD 指令的組合高效實
150 現,提高了寄存器的利用率。這種方法可應用于多個4*4 矩陣乘法運算,也可以通過修改適
應其他大小的矩陣乘法。
4.4 優化結果分析
本文設計的AVS 解碼器的開發平臺為Windows7 操作系統,編譯與調試環境為Visual
Studio2008。對反變換模塊優化前后的解碼速率進行了測試。測試用了兩個視頻序列:(1)
155 幀數為300 幀的Foreman(CIF 352x288)格式序列,由xAVS 編碼器編碼foreman.yuv 標準序
列獲得;(2)幀數為2380 幀的Rili(D1 720x576)序列。測試結果如表2 所示。
表2 測試序列數據
Tab.2 Test Sequences Result
解碼速度(fps) 測試序列 分辨率 幀數
優化前 優化后
Foreman CIF 300 60.53 90.62
Rili D1 2380 14.65 22.43
160
從以上測試結果可以看出,對于解碼cif 格式的視頻流,速率大約提高了30fps;對于解
碼D1 格式的視頻流,速率大約提高了8fps。因為只是對程序進行了代碼級的優化,解碼器
的性噪比不會下降,圖像質量不會受到影響。
?5 結論
165 本文對AVS 整數反變換算法的實現進行了設計,并利用SIMD 指令對其進行了優化,
解決了直接變換的匯編代碼和時間開銷代價大的問題。在保證解碼質量的前提下,提高了解
碼速率,對AVS 解碼器在軟件平臺上的實時實現是十分必要的。測試實驗表明本文所選算
法的可行性。