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