摘" 要: 為提高威焱831平臺的多媒體處理能力,解決H.264解碼器解碼效率低的問題,在提出SIMD指令級優(yōu)化方法的同時,提出一種面向幀拷貝的優(yōu)化方法。通過分析開源軟件FFmpeg中H.264解碼器的并行化特性,使用威焱平臺性能分析工具解析影響視頻解碼性能的熱點函數(shù)。采用手工嵌入SIMD匯編指令的方式對關(guān)鍵模塊熱點函數(shù)進行優(yōu)化,通過FFmpeg源碼編譯過程鏈接匯編實現(xiàn)的內(nèi)存操作函數(shù)memcpy提升內(nèi)存拷貝速度。實驗結(jié)果表明,威焱831平臺視頻解碼的平均性能提高26%,推動了威焱831處理器在多媒體應(yīng)用領(lǐng)域的發(fā)展。
關(guān)鍵詞: 威焱831平臺; SIMD; H.264解碼器; FFmpeg; 熱點函數(shù); 解碼效率
中圖分類號: TN919.81?34" " " " " " " " " " " " " 文獻標(biāo)識碼: A" " " " " " " " " " "文章編號: 1004?373X(2024)10?0086?05
H.264 video decoder optimization based on Weiyan 831 platform
Abstract: In order to improve the capability of multimedia processing and the decoding efficiency of H.264 decoder on Weiyan 831, an optimization method for frame copy is proposed while the SIMD instruction level optimization method is proposed. By analyzing the parallel characters of the H.264 decoder in the open source Ffmpeg, the performance analysis tool on Weiyan platform is used to analyze the hot functions that influence the video decoding. The key module hotspot functions are optimized by manually embedding SIMD assembly instructions, and the memory operation function memcpy is implemented by means of FFmpeg source code compilation linked to assembly, so as to improve memory copying speed. The experimental results show that the average video decoding performance on Weiyan 831 platform is improved by up 26%, which can effectively promote the development of Weiyan 831 processors in multimedia applications.
Keywords: Weiyan 831 platform; SIMD; H. 264 decoder; FFmpeg; hotspot function; decoding efficiency
0" 引" 言
隨著科技的發(fā)展和社會的進步,人們對高質(zhì)量視頻的需求不斷增加,傳統(tǒng)的編解碼模式已難以保證高質(zhì)量視頻的流暢播放[1]。
SIMD(Single Instruction Multiple Data)可以高效地對多媒體數(shù)據(jù)進行處理,通過一條SIMD指令實現(xiàn)對向量寄存器中所有數(shù)據(jù)的并行處理[2]。為增強計算機多媒體處理能力,SIMD技術(shù)被廣泛應(yīng)用于各種類型的處理器。
Intel公司率先在Pentium處理器中應(yīng)用了支持MMX[3]的SIMD技術(shù),通過不斷改進SIMD擴展部件,發(fā)展到現(xiàn)在的AVX2技術(shù)。威焱831處理器是我國自主設(shè)計、具有完全自主知識產(chǎn)權(quán)的通用處理器[4],該處理器支持的SIMD數(shù)據(jù)處理長度為256位。
H.264編解碼器不管是在視頻編碼的壓縮效率上,還是在網(wǎng)絡(luò)適應(yīng)性上,表現(xiàn)都比較優(yōu)秀[5]。針對H.264解碼器的優(yōu)化研究,主要集中在X86和ARM平臺[6],而在國產(chǎn)化CPU平臺上相關(guān)研究并不多見[7]。文獻[8]設(shè)計了一種在X86平臺使用SIMD技術(shù)對視頻處理子系統(tǒng)進行優(yōu)化的方法,縮短了視頻流處理過程中圖像縮放的處理時間;文獻[9]設(shè)計了一種基于FPGA的視頻處理系統(tǒng),充分利用ARM平臺SIMD技術(shù)對Sobel算法進行優(yōu)化加速。
針對上述問題,本文基于SIMD技術(shù),開展了H.264解碼器的優(yōu)化設(shè)計,進而提升威焱831平臺的多媒體處理能力。實驗結(jié)果表明威焱831平臺視頻解碼的平均性能提高了26%。CPU開銷中環(huán)路濾波模塊占比的降低,驗證了SIMD優(yōu)化方法的可行性;幀拷貝優(yōu)化方法的提出,使得解碼器各個階段都可以獲益。
1" 基于FFmpeg的H.264解碼器
1.1" H.264標(biāo)準(zhǔn)
H.264是由ISO圖像專家組和ITU視頻編碼專家組共同提出的數(shù)字視頻編解碼器標(biāo)準(zhǔn)。H.264最大的優(yōu)勢是在高壓縮比方面,在相同條件下,采用H.264技術(shù)壓縮后的數(shù)據(jù)量比MPEG?2、MPEG?4、H.263的數(shù)據(jù)量小得多。
視頻解碼可分為軟件解碼和硬件解碼。硬件解碼依靠專門的解碼芯片,解碼效率高;軟件解碼則可以支持不同的視頻編解碼標(biāo)準(zhǔn),系統(tǒng)兼容性好。當(dāng)然軟件解碼對CPU的性能要求較高。
1.2" FFmpeg解碼
FFmpeg作為一款主流的音視頻編解碼基礎(chǔ)軟件,開發(fā)者能夠很容易使用其提供的音視頻處理方案[10?11]。目前,多媒體軟件FFmpeg中的AVCodec模塊除了支持H.264解碼器,還支持H.265[12]、MPEG?4[13]、VP9[14]等編解碼標(biāo)準(zhǔn)。FFmpeg調(diào)用H.264的解碼流程如圖1所示。
FFmepg調(diào)用H.264的解碼流程可以分為3個階段:
1) 初始化階段,由av_register_all函數(shù)來注冊解碼器,通過av_open_input_file函數(shù)打開視頻序列文件,av_find_stream_info函數(shù)用來提取視頻文件的信息,調(diào)用avcodec_find_decoder函數(shù)來查找CODEC_TYPE_VIDEO類型的解碼器;
2) 解碼階段,通過avcode_open函數(shù)打開解碼器,通過avcodec_alloc_frame函數(shù)來分配內(nèi)存空間,通過av_read_frame函數(shù)讀取視頻碼流中的幀數(shù)據(jù),然后調(diào)用avcodec_decode_video函數(shù)進行解碼;
3) 收尾階段,調(diào)用avcodec_close函數(shù)關(guān)閉解碼器,調(diào)用av_close_input_file函數(shù)關(guān)閉輸入視頻文件。
2" H.264解碼器優(yōu)化
2.1" 性能瓶頸分析
perf是官方的Linux性能分析工具,能夠輔助用戶快速定位和處理軟件性能問題[15]。在程序運行過程中,被多次調(diào)用且長時間執(zhí)行的一系列函數(shù),通常被稱為熱點函數(shù)。H.264解碼運算的CPU消耗主要集中在avcodec_decode_video函數(shù),該函數(shù)包含熵解碼[16]、反變換與反量化、幀間和幀內(nèi)預(yù)測[17]、環(huán)路濾波[18]四個模塊。
1) 熵解碼
熵解碼模塊的功能在于解析碼流。熵解碼作為解碼過程的第一步,利用熵編碼的反向操作,將編碼端寫入輸出碼流的語法元素解析出來,并按照H.264的語法和語義規(guī)則將其分配到解碼器相應(yīng)的變量中。其中熵解碼方面的函數(shù)有ff_h264_decode_mb_cabac和ff_h264_decode_mb_cavlc,分別用于解碼CABAC編碼方式和CAVLC編碼方式的H.264數(shù)據(jù)。
2) 反變換與反量化
在變換方面,H.264采用了整數(shù)IDCT變換,只使用整數(shù)和定點數(shù)運算,從而消除了浮點數(shù)IDCT變換造成的誤差累計。在量化方面,H.264將放大系數(shù)移到量化階段進行,根據(jù)圖像的動態(tài)范圍大小確定量化參數(shù)。
3) 幀間和幀內(nèi)預(yù)測
幀間預(yù)測和幀內(nèi)預(yù)測的目的都是為了盡可能去除時間和空間上的冗余信息,以減小視頻數(shù)據(jù)的大小。
4) 環(huán)路濾波
環(huán)路濾波函數(shù)loop_filter的功能是對解碼后的數(shù)據(jù)進行濾波操作,去除圖像變換后可能存在的塊狀視覺效應(yīng)。調(diào)用filter_mb_edgev和filter_mb_edgecv函數(shù),分別對亮度和色度的垂直邊界進行濾波,調(diào)用filter_mb_edgeh和filter_mb_edgech函數(shù),分別對亮度和色度的水平邊界進行濾波。
2.2" 優(yōu)化實現(xiàn)
H.264解碼器在威焱831平臺進行優(yōu)化的流程如圖2所示。
首先,在威焱831平臺使用性能分析工具對H.264解碼器進行性能瓶頸分析;根據(jù)數(shù)據(jù)相關(guān)性、內(nèi)存對界要求等向量化條件,篩選可以進行向量化的熱點函數(shù);FFmpeg源碼編譯過程鏈接匯編實現(xiàn)的內(nèi)存操作函數(shù)memcpy來提升內(nèi)存拷貝速度;結(jié)合威焱831平臺指令流水線特點,以更高效的指令進行替換。重復(fù)上述步驟對程序進行不斷改進,達到最佳優(yōu)化效果。
2.2.1" 向量化條件
理論上來說,對于完全SIMD向量化的程序,32×8的向量運算性能可以達到標(biāo)量的8倍,64×4 的向量運算性能可以達到標(biāo)量的4倍。但是,程序向量化通常存在一定限制,很難做到完全向量化。對熱點函數(shù)進行向量化改寫,受限于以下條件。
1) 硬件限制。訪存操作的內(nèi)存地址在進行向量化操作時必須是連續(xù)的,并且要滿足32 B(單精度浮點向量為16 B)的內(nèi)存對界要求。
2) 數(shù)據(jù)相關(guān)性限制。向量化必須要求數(shù)據(jù)在迭代過程中可以滿足并行執(zhí)行條件,并且不能改變原始循環(huán)的語義。
3) 循環(huán)結(jié)構(gòu)的限制。向量化要求循環(huán)體只能有一個入口和一個出口,并且循環(huán)的迭代次數(shù)是有限的。
2.2.2" 優(yōu)化過程
本研究針對環(huán)路濾波函數(shù)和內(nèi)存操作函數(shù)進行優(yōu)化,使用perf工具,采用cpu?clock事件對1 080P視頻序列進行解碼采樣,列出環(huán)路濾波函數(shù)和內(nèi)存操作函數(shù)熱點占比,如表1所示。
1) SIMD優(yōu)化
申威SIMD擴展指令集提供VLDD、VSTD對齊裝入、存儲指令。使用VLDD指令可以從對界內(nèi)存中讀取32個8 bit或8個32 bit元素到256位向量寄存器中,同時支持不同長度的移位、加減等運算。以函數(shù)h264_v_loop_filter_chroma_8_c為例,程序1顯示了函數(shù)原型的部分代碼。
使用訪存裝入指令VLDD,從原像素點src_p0、src_q0起始地址讀取8個32位整數(shù)像素點到向量寄存器中,使用VSUBW指令進行src_p0-src_q0、src_q0-src_p0減法操作,VSELLTW是字整數(shù)向量小于零選擇指令,用于實現(xiàn)FFABS(src_p0-src_q0)求絕對值的功能。VCMPLTW是字整數(shù)向量小于比較指令,用于實現(xiàn)條件判斷功能。最后使用VSTD指令,將比較結(jié)果存儲到result目的內(nèi)存地址中。使用SIMD方式完成一組數(shù)據(jù)計算,相當(dāng)于標(biāo)量多次循環(huán)完成的計算。對環(huán)路濾波模塊采用手工嵌入SIMD匯編指令的方式,減少了目標(biāo)代碼的循環(huán)次數(shù),提高了解碼器的解碼性能。
2) 幀拷貝優(yōu)化
視頻輸出部分,大量的幀拷貝操作同樣占據(jù)了較多的CPU開銷。幀拷貝過程大量使用memcpy函數(shù),系統(tǒng)庫中memcpy函數(shù)接口為標(biāo)量實現(xiàn)。在威焱831平臺使用SIMD實現(xiàn)的memcpy接口可以提高幀拷貝的速度。
對FFmpeg源碼進行適配,在源代碼的configure配置文件中添加與申威體系結(jié)構(gòu)相關(guān)的選項,并使用??extra?ldflags編譯選項鏈接SIMD匯編實現(xiàn)的內(nèi)存操作函數(shù)memcpy。幀拷貝優(yōu)化屬于通用優(yōu)化方法,各個階段都可以獲益,尤其是在解碼后的視頻輸出階段。
3" 實驗與分析
3.1" 軟硬件環(huán)境
實驗硬件環(huán)境為國產(chǎn)威焱831平臺,搭配國產(chǎn)uos20操作系統(tǒng)。威焱831為64位字長的國產(chǎn)高性能八核通用處理器,該處理器集成了8個64位RISC 結(jié)構(gòu)的申威處理器核心,采用Core3B核心指令系統(tǒng),主頻為2.5 GHz,配置16 GB DDR3內(nèi)存。使用perf性能分析工具對解碼器進行瓶頸分析。實驗選取高分辨率的4K、1 080P視頻序列進行測試。
3.2" 實驗數(shù)據(jù)
表2統(tǒng)計了環(huán)路濾波函數(shù)向量化前后的CPU耗時占比,以10億個CPU周期(G Cycles)為單位。表3統(tǒng)計了優(yōu)化前后視頻的整體解碼性能,主要以解碼時的FPS作為性能比較基準(zhǔn)單位。
通過實驗對比,對環(huán)路濾波模塊和幀拷貝過程進行優(yōu)化,提高了解碼器的解碼性能。從表2可知,優(yōu)化后,環(huán)路濾波模塊計算效率明顯改善。其中,h264_v_loop_filter_luma_8_c系列函數(shù)優(yōu)化前后的加速比達到了6以上,而指令更加復(fù)雜的h264_v_loop_filter_chroma_8_c系列函數(shù),加速比也達到了3以上,并且分辨率越高,優(yōu)化的效率越明顯。
從表3可知,優(yōu)化后解碼器整體解碼性能明顯改善,其中解碼幀率是指100%的CPU資源用于解碼能夠達到的幀率。使用容易量化的解碼幀率作為性能指標(biāo),測試視頻序列中,4K視頻的解碼幀率提升了27%,1 080P視頻解碼幀率提升了25%。需要說明的是,H.264解碼效率依賴于視頻序列的內(nèi)容變化程度,不同視頻序列的優(yōu)化效果并不一樣??偟膩碚f,視頻序列的分辨率越高,優(yōu)化的效率越明顯。
4" 結(jié)" 語
本文在威焱831平臺使用SIMD擴展部件對環(huán)路濾波系列函數(shù)和幀拷貝過程進行了優(yōu)化,提高了H.264解碼器的解碼性能,威焱831平臺視頻解碼的平均性能提高了26%。CPU開銷中環(huán)路濾波模塊占比的降低,驗證了SIMD優(yōu)化方法的可行性;幀拷貝優(yōu)化方法的提出,使得解碼器各個階段都可以獲益。下一步工作將針對SIMD非對界內(nèi)存讀取情況進行分析,更深層次地挖掘熱點函數(shù)向量化的可行性。
在國家大力發(fā)展自主可控技術(shù)的背景下,國產(chǎn)CPU將迎來更大的舞臺,高效的解碼效率將會推動威焱831平臺在多媒體領(lǐng)域的發(fā)展。
參考文獻
[1] 楊華,趙香華.基于x264編碼的碼率控制模型優(yōu)化方法[J].計算機仿真,2023,40(8):249?253.
[2] 韋薇,羅敏,白野,等.基于SIMD指令集的SM2數(shù)字簽名算法快速實現(xiàn)[J].密碼學(xué)報,2023,10(4):720?736.
[3] AMIRI H, SHAHBAHRAMI A. SIMD programming using Intel vector extensions [J]. Journal of parallel and distributed computing, 2009, 135(2): 134?135.
[4] 李善榮,孫超,韓嬌,等.一種基于申威平臺的全國產(chǎn)化計算機設(shè)計方法[J].工業(yè)控制計算機,2023,36(1):17?19.
[5] 周新虹,宋維.基于協(xié)議分析技術(shù)的多點H.264視頻顯示終端的設(shè)計與實現(xiàn)[J].電子技術(shù)與軟件工程,2022(24):112?116.
[6] 谷一鑫.面向ARM架構(gòu)的圖像高性能計算庫研究與移植優(yōu)化[D].西安:西安電子科技大學(xué),2023.
[7] 陽飛.基于龍芯2K1000B的H.264視頻解碼系統(tǒng)軟件適配與優(yōu)化[D].南京:東南大學(xué),2022.
[8] 于向前.基于GSireamer框架的視頻處理子系統(tǒng)設(shè)計與實現(xiàn)[D].南京:東南大學(xué),2022.
[9] 陳炎,袁國順,劉小強.基于NEON優(yōu)化技術(shù)的視頻處理系統(tǒng)設(shè)計[J].微電子學(xué)與計算機,2018,35(7):62?66.
[10] 張楨,梁軍,賈海鵬,等.基于RISC?V的FFmpeg多媒體算法庫優(yōu)化策略[J].計算機工程,2023,49(4):159?165.
[11] 劉引濤,劉楠.基于ARM與4G網(wǎng)絡(luò)的視頻監(jiān)控設(shè)計與實現(xiàn)[J].電子設(shè)計工程,2019,27(3):146?149.
[12] 李宇峰,李平安,歐澤強.H.265視頻壓縮算法優(yōu)化設(shè)計與實現(xiàn)[J].電子技術(shù)與軟件工程,2022(23):193?197.
[13] 徐福濤.基于MPEG4下多硬盤視頻存儲系統(tǒng)的解析[J].電子世界,2018(10):76.
[14] 黃永鋮,宋利,解蓉.基于深度殘差網(wǎng)絡(luò)的VP9超級塊快速劃分算法[J].電視技術(shù),2019,43(8):10?14.
[15] 李殿濤.Linux內(nèi)核性能診斷分析[J].電腦編程技巧與維護,2021(10):47?48.
[16] 馮德邦.支持超高清的H.264熵解碼器的設(shè)計與驗證[D].哈爾濱:哈爾濱工業(yè)大學(xué),2022.
[17] 方凌峰.針對AVS3的幀內(nèi)預(yù)測優(yōu)化技術(shù)的研究[D].北京:北京郵電大學(xué),2022.
[18] 胡建華,吳偉美,楊忠明,等.用于視頻編碼的低復(fù)雜度自適應(yīng)環(huán)路濾波方法[J].信息技術(shù)與信息化,2021(11):196?198.