摘 "要: 國產(chǎn)化申威處理器出現(xiàn)較晚,其在多媒體領(lǐng)域中的性能還不突出,同時(shí)通用處理器中的單指令流多數(shù)據(jù)流(SIMD)因能有效提升并行處理能力而受到處理器廠商的青睞。為提高國產(chǎn)化自主平臺(tái)申威架構(gòu)的多媒體處理能力,結(jié)合申威架構(gòu)Core3B體系的SIMD指令系統(tǒng),提出一種基于申威架構(gòu)的SIMD指令集H.264編碼優(yōu)化方法。結(jié)合申威處理器的并行結(jié)構(gòu)特點(diǎn),利用申威適配的Perf、Top指令等系統(tǒng)性能分析工具,采集兩種主流視頻分辨率下與編碼性能強(qiáng)相關(guān)的高頻熱點(diǎn)函數(shù),詳細(xì)分析其程序并行化可行性,采用手工嵌入申威SIMD和訪存擴(kuò)展等匯編指令進(jìn)行細(xì)粒度優(yōu)化。實(shí)驗(yàn)結(jié)果表明,該方法在申威架構(gòu)下的H.264平均編碼性能提升了約30%。相應(yīng)工作成果已推送到申威社區(qū),增強(qiáng)了基于申威處理器的國產(chǎn)計(jì)算機(jī)在桌面多媒體應(yīng)用領(lǐng)域的工作體驗(yàn)。
關(guān)鍵詞: 單指令流多數(shù)據(jù)流; H.264標(biāo)準(zhǔn); 申威處理器; 熱點(diǎn)函數(shù); 程序并行化; 細(xì)粒度
中圖分類號(hào): TN911?34; TP3 " " " " " " " " " " " 文獻(xiàn)標(biāo)識(shí)碼: A " " " " " " " " " " 文章編號(hào): 1004?373X(2024)06?0049?06
H.264 encoding optimization based on SW SIMD instruction
HUANG Pu, LIU Shiwei, ZHANG Hao, WANG Cong
(CETC Suntai Information Technology Co., Ltd., Wuxi 214000, China)
Abstract: Domestic Shenwei processors emerged relatively late, and their performance in the multimedia field is not yet outstanding. At the same time, single instruction multiple data (SIMD) in general?purpose processors are favored by processor manufacturers for effectively improving parallel processing capabilities. In order to improve the multimedia processing capability of the domestic independent platform Shenwei architecture, a SIMD instruction set H.264 encoding optimization method based on the Shenwei architecture is proposed by combining with the SIMD instruction system of the Core3B system of the Shenwei architecture. Based on the parallel structure characteristics of the Shenwei processor, high?frequency hotspot functions strongly related to encoding performance under two mainstream video resolutions are collected by means of system performance analysis tools such as Perf and Top instructions adapted by Shenwei. The experimental results show that this method can improve the average encoding performance of H.264 under the Shenwei architecture by about 30%, and the corresponding work results have been pushed to the Shenwei community, enhancing the work experience of domestic computers based on Shenwei processors in the field of desktop multimedia applications.
Keywords: SIMD; H.264 standard; Shenwei processor; hotspot function; program parallelization; fine grained
0 "引 "言
單指令流多數(shù)據(jù)流(Single Instruction Multiple Data, SIMD)是計(jì)算機(jī)處理器中的一種指令集架構(gòu),主要用于執(zhí)行并行計(jì)算[1]。為提升CPU的圖形圖像數(shù)據(jù)處理能力,SIMD架構(gòu)被廣泛應(yīng)用于各種類型的計(jì)算機(jī)處理器中,包括常見的桌面和移動(dòng)設(shè)備處理器[2?3]。
申威是我國自主設(shè)計(jì)、具有完全自主知識(shí)產(chǎn)權(quán)的64位字長(zhǎng)Load/Store型RISC架構(gòu)多核處理器[4]。經(jīng)過多年發(fā)展,申威形成了Core3B核心處理器指令系統(tǒng),包括基本指令系統(tǒng)和SIMD擴(kuò)展指令系統(tǒng)。所有指令均采用定長(zhǎng)的32位格式,支持32位單精度和64位雙精度浮點(diǎn)運(yùn)算,支持256位單指令流多數(shù)據(jù)流(SIMD)的短向量運(yùn)算,通過指令集適配優(yōu)化,可以大幅度提升系統(tǒng)性能。
盡管H.265已發(fā)布多年,但H.264仍是目前市場(chǎng)應(yīng)用最廣泛的視頻編解碼標(biāo)準(zhǔn)[5]。對(duì)該編解碼算法的結(jié)構(gòu)并行性研究,主要集中在X86和ARM平臺(tái)上[6?7],而在國產(chǎn)化CPU平臺(tái)上的相關(guān)研究還不多見[2],大部分為針對(duì)解碼器或?yàn)V波模塊的優(yōu)化工作。文獻(xiàn)[8]介紹了基于開源編碼器匯編優(yōu)化幀內(nèi)預(yù)測(cè)的率失真代價(jià)計(jì)算過程。文獻(xiàn)[9]設(shè)計(jì)了一種基于4×4基本塊復(fù)用的18路預(yù)測(cè)模式并行的高吞吐量全流水線硬件架構(gòu)。文獻(xiàn)[10]完成了視差估計(jì)算法的并行映射。文獻(xiàn)[11]設(shè)計(jì)了一種新的幀內(nèi)率失真優(yōu)化預(yù)測(cè)模式的并行流水線硬件架構(gòu)。
本文針對(duì)申威威焱831平臺(tái)特點(diǎn),基于Core3B SIMD指令優(yōu)化了H.264視頻編碼器的處理效率,工作成果已推送到申威開源社區(qū),為加快國產(chǎn)申威計(jì)算機(jī)的圖形化應(yīng)用發(fā)揮了積極作用。
1 "申威SIMD技術(shù)
目前,程序向量化通常由兩種途徑來實(shí)現(xiàn):其一是利用編譯器自身的功能實(shí)現(xiàn)程序的自動(dòng)向量化,即編譯器經(jīng)過對(duì)程序的依賴分析、對(duì)齊分析等自動(dòng)把標(biāo)量代碼轉(zhuǎn)變成相應(yīng)的向量化指令,從而實(shí)現(xiàn)程序的并行計(jì)算;其二是手工向量化,開發(fā)人員利用SIMD程序接口或使用內(nèi)嵌匯編的方法,通過SIMD擴(kuò)展的體系結(jié)構(gòu)和指令集,對(duì)串行程序重新進(jìn)行向量化程序的編寫,在一定程度上省去編譯器進(jìn)行向量化分析查找后端指令等工作,并且對(duì)性能提升有明顯效果。本次研究主要基于威焱831處理器,使用手工嵌入式匯編的方式將普通程序替換為申威SIMD指令來提升多媒體程序性能。
1.1 "申威SIMD概述
申威處理器提供了200多條指令來實(shí)現(xiàn) SIMD的功能,支持浮點(diǎn)雙256位SIMD流水線和整數(shù)單256位SIMD流水線。
1.2 "數(shù)據(jù)類型、寄存器與指令擴(kuò)展
C3B核心擴(kuò)展指令系統(tǒng)設(shè)置有32個(gè)256位向量寄存器,與浮點(diǎn)寄存器文件共用地址,其低64位即是浮點(diǎn)寄存器;向量寄存器與浮點(diǎn)寄存器在硬件實(shí)現(xiàn)上不同,但是在匯編代碼中的表示格式是相同的。此外所有寄存器均以字符$開頭,所以在匯編代碼中向量寄存器和浮點(diǎn)寄存器均以$f0~$f31表示。
C3B核心支持短向量數(shù)據(jù)類型,包括長(zhǎng)度為8的字整數(shù)向量(8×32位)、長(zhǎng)度為4的單精度浮點(diǎn)向量(4×32位)與雙精度浮點(diǎn)向量(4×64位),還有限支持長(zhǎng)度為32的字節(jié)整數(shù)向量(32×8位)、長(zhǎng)度為16的半字整數(shù)向量(16×16位)、長(zhǎng)度為4的長(zhǎng)字整數(shù)向量(4×64位)以及256位的8倍字整數(shù)數(shù)據(jù)。
C3B的擴(kuò)展指令系統(tǒng)較為全面,在多媒體優(yōu)化中經(jīng)常用到的指令包括加法減法指令、可重構(gòu)邏輯運(yùn)算指令、位移指令、條件判斷選擇指令以及裝入和存儲(chǔ)指令等。
1.3 "向量化限制
理論上來說,對(duì)于完全SIMD向量化的程序,32×8 的向量運(yùn)算性能可以達(dá)到標(biāo)量的8倍,64×4的向量運(yùn)算性能可以達(dá)到標(biāo)量的4倍。但是,程序向量化通常存在以下限制,因此很難做到完全SIMD向量化。
首先是硬件限制:向量化受限于硬件的限制。在 SIMD擴(kuò)展中,向量化訪存操作必須是地址連續(xù)的,且要求32字節(jié)對(duì)界。因此,雖然有些循環(huán)是可向量化的,但具體針對(duì)威焱831體系結(jié)構(gòu),需要進(jìn)行程序變換后才能向量化。
1) 循環(huán)結(jié)構(gòu)的限制:循環(huán)必須是只有一個(gè)入口和一個(gè)出口時(shí)才能被向量化。
2) 更有效的使用Cache:高效地使用各級(jí)Cache對(duì)于性能的提高是極為重要的,一級(jí)Cache中訪問數(shù)據(jù)的速度比主存儲(chǔ)器中訪問數(shù)據(jù)快數(shù)十倍。為了更好地使用Cache,程序需要盡量使用同一個(gè)Cache行的所有數(shù)據(jù)而不是各不同Cache行的部分?jǐn)?shù)據(jù),而且程序最好能在數(shù)據(jù)被替換出Cache以前盡量多地重用這些數(shù)據(jù)。當(dāng)然,為了從SIMD部件中獲得性能的提升,也要求程序最好訪問連續(xù)的內(nèi)存區(qū)域,這一點(diǎn)來講,Cache與SIMD 部件對(duì)程序的要求是一樣的。
3) 對(duì)界問題:大部分情況下,申威架構(gòu)下使用擴(kuò)展存儲(chǔ)與裝入指令進(jìn)行變量映射的時(shí)候,需要保證標(biāo)準(zhǔn)類型變量為32字節(jié)對(duì)界。若進(jìn)行了不對(duì)界訪存,程序運(yùn)行時(shí),系統(tǒng)需要不斷處理該訪存引起的異常,這將極大拖慢程序與系統(tǒng)的運(yùn)行速度。數(shù)據(jù)Cache中跨32字節(jié)的不對(duì)界訪存如圖1所示。
上述三個(gè)問題的處理,1)關(guān)系到能否實(shí)施向量化,2)、3)則是向量化后能否發(fā)揮預(yù)期性能的關(guān)鍵。
2 "FFmpeg的H.264編碼優(yōu)化
2.1 "H.264視頻編碼標(biāo)準(zhǔn)
H.264(AVC)視頻編碼標(biāo)準(zhǔn)作為目前應(yīng)用最廣的標(biāo)準(zhǔn)意義非凡,其既能帶來較高的壓縮率,又能保證編碼質(zhì)量,在安防、直播等視頻領(lǐng)域都有很廣泛的應(yīng)用。
從編碼途徑上分類,視頻編碼可分為硬件編碼和軟件編碼。硬件編碼依靠專門的解碼芯片,編碼效率高;軟件編碼則可以支持不同的視頻編解碼標(biāo)準(zhǔn),系統(tǒng)兼容性好,當(dāng)然軟件編碼對(duì)CPU的性能要求也較高。目前基于H.264標(biāo)準(zhǔn)的媒體應(yīng)用最廣泛,因此從實(shí)用性角度看,優(yōu)化H.264的軟件編碼效率,性價(jià)比最高。
2.2 "H.264編碼器優(yōu)化實(shí)現(xiàn)
FFmpeg是一套完善的開源的音視頻處理軟件框架[12],編譯時(shí)可集成x264庫。在申威處理器上,其H.264編碼流程由通用分支基于高級(jí)語言實(shí)現(xiàn),雖然具有格式兼容性好和算法升級(jí)靈活的優(yōu)勢(shì),但單純依靠CPU性能,編碼效率較低。
FFmpeg調(diào)用x264的流程如圖2所示。圖中,用戶傳入命令參數(shù)后,解析指令、進(jìn)行查找編碼器等操作,由avcodec_open2打開編碼器接口進(jìn)入編解碼器部分,隨后初始化x264編碼器并進(jìn)行相關(guān)配置;其次是編碼階段,由avcodec_alloc_frame()函數(shù)為編碼幀分配內(nèi)存,av_read_frame()函數(shù)從碼流中讀取幀數(shù)據(jù),判斷幀類型后調(diào)用avcodec_encode_video()函數(shù)編碼;最后是收尾階段,釋放數(shù)據(jù)內(nèi)存、編碼器和關(guān)閉輸入文件。
2.2.1 "性能瓶頸分析
x264的編碼運(yùn)算主要集中在x264_encoder_encode()函數(shù),可細(xì)分成: 幀間和幀內(nèi)預(yù)測(cè)、變換與量化、濾波、熵編碼四部分。H.264碼流的基本單位是NALU(碼流單元),分為多種類型,比如:圖像數(shù)據(jù)分片(Slice)、增強(qiáng)信息(SEI)、序列參數(shù)集(SPS)、圖像參數(shù)集(PPS)。一個(gè)Slice分片通常由多個(gè)宏塊(MB)組成,宏塊是編碼運(yùn)算處理的基本單位。
1) 幀間和幀內(nèi)預(yù)測(cè):幀間預(yù)測(cè)指利用視頻時(shí)間域相關(guān)性,使用鄰近已編碼圖像像素預(yù)測(cè)當(dāng)前圖像的像素,以達(dá)到有效去除視頻時(shí)間域冗余的目的。由于視頻序列通常包括較強(qiáng)的時(shí)間域相關(guān)性,因此預(yù)測(cè)殘差值接近于0。將殘差信號(hào)作為后續(xù)模塊的輸入進(jìn)行變換、量化、掃描及熵編碼,可實(shí)現(xiàn)對(duì)視頻信號(hào)的高效壓縮,核心函數(shù)是x264_mb_analyse_inter_*()。
幀內(nèi)預(yù)測(cè)則是利用圖像內(nèi)空間域相關(guān)性,使用已編碼像素預(yù)測(cè)圖像鄰近像素,以達(dá)到有效去除圖像空間域冗余的目的,其核心函數(shù)是x264_mb_analyse_intra()。
2) 變換與量化:變換編碼將圖像時(shí)域信號(hào)變換成頻域信號(hào),在頻域中圖像信號(hào)能量大部分集中在低頻區(qū)域,相對(duì)時(shí)域信號(hào),碼率有較大的下降。H.264對(duì)圖像或預(yù)測(cè)殘差采用4×4整數(shù)離散余弦(DCT)變換技術(shù)。
量化過程就是根據(jù)圖像的動(dòng)態(tài)范圍大小確定量化參數(shù),既保留圖像必要的細(xì)節(jié),又可以減少碼流。在圖像編碼中,變換編碼和量化從原理上講是兩個(gè)獨(dú)立的過程;但在H.264中,將兩個(gè)過程中的乘法合二為一,并進(jìn)一步采用整數(shù)運(yùn)算,減少編解碼的運(yùn)算量,提高圖像壓縮的實(shí)時(shí)性,這些措施對(duì)峰值信噪比(PSNR)的影響很小,一般低于0.02 dB,可不計(jì)。
宏塊編碼函數(shù)x264_macroblock_encode是完成變換與量化的主要函數(shù)。
3) 濾波:H.264視頻編碼標(biāo)準(zhǔn)中,在編解碼器反變換量化后,圖像會(huì)出現(xiàn)方塊效應(yīng),盡管H.264采用較小的4×4變換尺寸,可以降低這種不連續(xù)現(xiàn)象,但仍需要一個(gè)去方塊濾波器,以最大程度提高編碼性能。在x264中,x264_slice_write()函數(shù)中調(diào)用x264_fdec_filter_row()的源代碼,x264_fdec_filter_row()對(duì)應(yīng)著x264中的濾波模塊。
4) 熵編碼:熵編碼函數(shù)x264_macroblock_write_cabac()或x264_macroblock_write_cavlc()讀取碼流數(shù)據(jù),進(jìn)行CABAC或CAVLC熵編碼。
在申威平臺(tái)上,通過性能分析發(fā)現(xiàn),編碼過程絕大多數(shù)CPU性能消耗在幀內(nèi)預(yù)測(cè)、運(yùn)動(dòng)補(bǔ)償、DCT變換、濾波等過程運(yùn)算上。另外,在視頻輸出方面,大量的數(shù)據(jù)拷貝操作同樣消耗了不少的CPU時(shí)間。
表1統(tǒng)計(jì)了CPU占比的熱點(diǎn)函數(shù),并刪掉了其中不滿足向量化限制性條件的內(nèi)容。
針對(duì)上述分析,在申威平臺(tái)上進(jìn)行編碼器優(yōu)化的流程如圖3所示。首先,使用性能分析工具perf記錄編碼全程的高頻熱點(diǎn)函數(shù);其次,逐項(xiàng)分析熱點(diǎn)函數(shù),在滿足向量化限制條件的基礎(chǔ)上研究并行化方法;然后采用SIMD指令以嵌入式匯編手段重構(gòu)熱點(diǎn)函數(shù),包括循環(huán)展開、數(shù)據(jù)分組打包、并行運(yùn)算等步驟;最后結(jié)合申威流水線特點(diǎn),考慮指令延遲及循環(huán)間隔等因素,進(jìn)一步調(diào)整指令流,減少因數(shù)據(jù)相關(guān)而引入的不必要延遲,使用更高效的指令進(jìn)行替換。如果性能結(jié)果不滿意,則繼續(xù)查找新的優(yōu)化點(diǎn),重復(fù)上述過程。
2.2.2 "優(yōu)化實(shí)現(xiàn)
1) SIMD優(yōu)化。利用微處理器的并行部件,SIMD技術(shù)通過一條指令對(duì)一組數(shù)據(jù)進(jìn)行相同的操作,從而完成之前需要多條指令才能完成的處理任務(wù)。以方塊濾波函數(shù)x264_pixel_sad_16×16為例,其通用分支代碼實(shí)現(xiàn)和采用SIMD擴(kuò)展指令將內(nèi)層循環(huán)進(jìn)行并行優(yōu)化后的代碼如下:
//C代碼節(jié)選
for( int y = 0; y lt; ly; y++ )
{
for( int x = 0; x lt; lx; x++ )
{
i_sum+=abs(pix1[x]?pix2[x]);
}}
//并行化改造
for(int y = 0; y lt; ly; y++) {
for(int i = 0,x = 0;i lt; idx ; i++,x+=8){
_asm_ _volatile_(
\"VLDD $f2,0(%0)\n\t\"
\"VLDD $f3,0(%1)\n\t\"
\"VSUBW $f3,$f2,$f4\n\t\"
\"VSUBW $f2,$f3,$f5\n\t\"
\"VSELLTW $f4,$f5,$f4,$f6\n\t\"
\"VSTD $f6,0(%2)\n\t\"
:
:\"r\"(amp;v_pix1[x]),\"r\"(amp;v_pix2[x]),\"r\"(amp;v_result)
:);}}
其中v_pix1、v_pix2為源代碼中像素?cái)?shù)據(jù)pix1及pix2轉(zhuǎn)換并進(jìn)行對(duì)齊操作的向量數(shù)組。使用VLDD指令加載到向量寄存器$f2、$f3后,使用VSUBW指令進(jìn)行v_pix1-v_pix2、vpix2-v_pix1減法操作。將二者的差值分別存儲(chǔ)到$f4、$f5,通過指令VSELLTW判斷$f4向量中每個(gè)元素的值,如果小于0則選取$f5中相應(yīng)元素的值;否則,將$f4相應(yīng)元素的值存儲(chǔ)至$f6。最終使用VSTD指令將結(jié)果$f6儲(chǔ)存至對(duì)齊數(shù)組v_result中,該數(shù)組的各元素之和即為源代碼中的i_sum。內(nèi)層循環(huán)一次可操作8個(gè)數(shù)據(jù),整體來看循環(huán)次數(shù)減少為原來的[18],有效提升了性能。
又如子函數(shù)x264_clip_pixel()被2的整數(shù)倍次調(diào)用,改造時(shí)需先展開再進(jìn)行并行化改造,同時(shí)其運(yùn)算完全由位運(yùn)算、加減法及條件判斷組成,是比較理想的可改寫函數(shù)。其代碼如下:
//簡(jiǎn)化C代碼
for( int y = 0; y lt; i_h; y++, dst += i_dst, src += i_src)
for( int x = 0; x lt; i_w; x++ )
dst[x] = x264_clip_pixel(x);
// x264_clip_pixel()
x264_clip_pixel(x){
return ((xamp;~A)?(?x)gt;gt;31amp;A;x;
}
其中x = src[x]*A + B;
for( y = 0; y lt; i_height; y++, dst += i_dst_stride, src += i_src_stride ){
for( x = 0; x lt; j; x++ ){
for( i = 0; i lt; 8; i++){
tmp_res[i] = src[i+off] * scale;}
_asm_ _volatile_(
\"VLDD $f10,0(%0)\n\t\"
\"VLDD $f11,0(%1)\n\t\"
\"VADDW $f10,$f11,$f12\n\t\"
\"VSTD $f12,0(%2)\n\t\"
:
:\"r\"(amp;tmp_res),\"r\"(amp;tmp_offset),\"r\"(amp;tmp_dst)
:);
_asm_ _volatile_(
\"VLDD $f10,0(%0)\n\t\" " " " " " " " " " " " " " " " " " "http://tmp_dst
\"VLDD $f11,0(%1)\n\t\" " " " " " " " " " " " " " " "http://PIXEL_MAX
\"VLDD $f12,0(%2)\n\t\" " " " " " " " " " " " " " " " "http://tmp_const0
\"VADDW $f11,1,$f13\n\t\" " " " " " " " " " " " " " "http://tmp_max+1
\"VSUBW $f12,$f13,$f13\n\t\" " //?(tmp_max+1)=~PIXEL_MAX
\"VLOG08 $f12,$f10,$f13,$f14\n\t\" " //tmp_dstamp;~PIXEL_MAX
\"VSUBW $f12,$f10,$f15\n\t\" " " " " " " " " " " " " " "http://?tmp_dst
\"VSRAW $f15,31,$f15\n\t\" " " " " " " " " " " " " " " //gt;gt;31算術(shù)
\"VLOG08 $f12,$f15,$f11,$f15\n\t\" " " " " " " " " " " " " " " "http://amp;
\"VSELEQW $f14,$f10,$f15,$f16\n\t\" " " " " " " " " " " " " " "http://?
\"VSTD $f16,0(%3)\n\t\" " " " " " " " " " " " " " " " " " " " " " " //
:
:\"r\"(amp;tmp_dst),\"r\"(amp;tmp_max),\"r\"(amp;tmp_const0),\"r\" (amp;tmp_
return)
:);
首先改造最內(nèi)層數(shù)據(jù)變量x,由于缺少乘法指令,因此src[x]*A保留,將其8次循環(huán)的值賦給對(duì)齊向量數(shù)組tmp_res;然后B值賦給向量tmp_offset,通過指令VADDW相加存儲(chǔ)到tmp_dst,即完成變量x的向量化;其次改造x264_clip_pixel(x):x向量值tmp_dst加載到$f10,常量A對(duì)齊轉(zhuǎn)換為tmp_max后加載$f11,0對(duì)齊轉(zhuǎn)換為tmp_const0加載到$f12;由于缺少向量取反指令, tmp_max首先加1存儲(chǔ)至$f13,隨后通過VSUBW進(jìn)行tmp_const0?tmp_max間接實(shí)現(xiàn)取反操作;最后通過可重構(gòu)指令VLOG08實(shí)現(xiàn)tmp_dstamp;~PIXEL_MAX的邏輯與操作,其中數(shù)據(jù)8通過與操作的真值表求出,剩余部分可查看注釋釋義。
2) 對(duì)界問題的處理。申威架構(gòu)中,一般情況下可采用兩種方式來處理對(duì)界問題:一是采用SIMD整理指令對(duì)數(shù)組b進(jìn)行拼接;二是使用不對(duì)界訪存接口直接處理。理論上,方法2比方法1性能要好。但實(shí)際使用中,不對(duì)界仿存指令依舊會(huì)帶來不可接受的巨大開銷。因此申請(qǐng)?jiān)S多新內(nèi)存空間,并利用_attribute_((aligned(n)))強(qiáng)制對(duì)界,配合內(nèi)存拷貝優(yōu)化方式來初始化能有效提升性能。
3) 內(nèi)存拷貝優(yōu)化。幀拷貝大量使用memcpy()函數(shù)。該部分通過SW平臺(tái)下優(yōu)化的mem庫直接鏈接使用。
上述三種優(yōu)化手段里面,SIMD向量?jī)?yōu)化主要集中在運(yùn)動(dòng)補(bǔ)償和去塊濾波方面,效果明顯;而幀拷貝優(yōu)化屬于通用優(yōu)化方法,在編碼的各個(gè)階段都可以獲益,尤其是在編碼后的視頻輸出階段。
3 "實(shí) "驗(yàn)
3.1 "實(shí)驗(yàn)平臺(tái)
實(shí)驗(yàn)的硬件平臺(tái)采用威焱831臺(tái)式計(jì)算機(jī)。威焱831為64位字長(zhǎng)的國產(chǎn)高性能8核通用處理器,該處理器集成了8個(gè)64位RISC結(jié)構(gòu)的申威處理器核心,采用Core3B核心指令系統(tǒng),主頻2.5 GHz,配置16 GB DDR3內(nèi)存,搭載UOS 20操作系統(tǒng),采用Linux 4.19?sw內(nèi)核。視頻編碼器x264版本為0.164.x,測(cè)試視頻片段為h264格式視頻文件通過FFmpeg軟件解碼出來的YUV文件,包括1 080P、4K兩種主流分辨率。
3.2 "實(shí)驗(yàn)數(shù)據(jù)
表2統(tǒng)計(jì)了上述主要耗時(shí)函數(shù)在兩種分辨率的YUV文件編碼H.264格式視頻過程中的CPU耗時(shí)占比,以10億個(gè)CPU周期(G Cycles)為單位。從表2可以看出,經(jīng)過SIMD向量化優(yōu)化后,去塊效應(yīng)濾波模塊和運(yùn)動(dòng)補(bǔ)償模塊計(jì)算效率明顯改善,結(jié)合表1可發(fā)現(xiàn)性能改善主要集中在去塊效應(yīng)濾波模塊。SIMD向量化充分利用了各種系統(tǒng)資源和程序的計(jì)算并行性特征,編碼過程中的計(jì)算效率明顯提升。在保證了幀率和圖像質(zhì)量的前提下,各主要熱點(diǎn)函數(shù)經(jīng)過SIMD優(yōu)化后,在整個(gè)編碼過程中的耗時(shí)占比大幅下降。其中,在1 080P分辨率下耗時(shí)均下降到2%以下,相對(duì)于4K分辨率的編碼情景,改善效果感性上更為顯著。
表3統(tǒng)計(jì)了優(yōu)化前后兩種分辨率視頻的整體編碼性能,主要以編碼時(shí)的FPS作為性能比較基準(zhǔn)單位。
從表3可以看出:與表2占比耗時(shí)提升推測(cè)相對(duì)應(yīng),1 080P分辨率的編碼性能效果提升更為顯著,整體編碼性能由4.9提升到7.4,平均提升幅度達(dá)到50%以上;4K分辨率提升效果則達(dá)到近20%,不過CPU占用率基本達(dá)到飽和。
4 "結(jié) "語
本文對(duì)申威處理器上使用FFmpeg編碼H.264標(biāo)準(zhǔn)視頻的性能瓶頸進(jìn)行了較詳細(xì)的分析,針對(duì)其中比較耗時(shí)的操作,提出了在申威架構(gòu)下適用SIMD進(jìn)行優(yōu)化的具體方法。各項(xiàng)數(shù)據(jù)表明,在保證圖像視頻質(zhì)量下,編碼器在主流分辨率下的性能提升了15%以上,平均性能提升了30%以上。這種基于申威SIMD技術(shù)的優(yōu)化方法充分利用了總線、數(shù)據(jù)通道資源,并且沒有改變處理算法的基本結(jié)構(gòu),在基于軟件編碼的國產(chǎn)處理器多媒體領(lǐng)域中有著廣泛應(yīng)用。
參考文獻(xiàn)
[1] 劉浩浩.面向SIMD超長(zhǎng)向量加速部件的向量化方法研究[D].鄭州:中原工學(xué)院,2022.
[2] 陽飛.基于龍芯2K1000B的H.264視頻解碼系統(tǒng)軟件適配與優(yōu)化[D].南京:東南大學(xué),2020.
[3] 裴航.基于申威421處理器的視頻解碼SIMD優(yōu)化技術(shù)研究[D].鄭州:中原工學(xué)院,2021.
[4] 張振東,王彤,劉鵬.面向申威眾核處理器的規(guī)則處理優(yōu)化技術(shù)[J/OL].計(jì)算機(jī)研究與發(fā)展:1?19[2023?09?13]. http://kns.cnki.net/kcms/detail/11.1777.TP.20230720.0940.004.html.
[5] 馮德邦.支持超高清的H.264熵解碼器的設(shè)計(jì)與驗(yàn)證[D].哈爾濱:哈爾濱工業(yè)大學(xué),2022.
[6] 谷一鑫.面向ARM架構(gòu)的圖像高性能計(jì)算庫研究與移植優(yōu)化[D].西安:西安電子科技大學(xué),2022.
[7] 馬浩.基于Tilera多核處理器的HEVC解碼主要模塊并行處理方案設(shè)計(jì)與實(shí)現(xiàn)[D].南京:南京郵電大學(xué),2021.
[8] 佘成龍.“魂芯”DSP H.265幀內(nèi)預(yù)測(cè)實(shí)現(xiàn)及預(yù)測(cè)模式并行化設(shè)計(jì)[D].合肥:合肥工業(yè)大學(xué),2019.
[9] 熊啟金,丁永強(qiáng),林志堅(jiān).高效視頻編碼幀內(nèi)預(yù)測(cè)算法優(yōu)化與硬件架構(gòu)設(shè)計(jì)[J].無線電通信技術(shù),2023,49(5):953?959.
[10] 蔣林,馮茹.基于視頻陣列處理器的3D?HEVC視差估計(jì)算法并行設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2023,40(7):260?265.
[11] 林志堅(jiān),丁永強(qiáng),楊秀芝,等.HEVC幀內(nèi)率失真優(yōu)化預(yù)測(cè)模式的并行流水線硬件設(shè)計(jì)[J].華南理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2023,51(5):95?103.
[12] FFmpeg documentation. FFmpeg source code [EB/OL]. [2022?04?30]. http://www.ffmpeg.org/download.html#get?sources/.
[13] 屠要峰,陳河堆.面向GoldenX軟硬協(xié)同優(yōu)化的異構(gòu)加速列式存儲(chǔ)引擎研究[J].計(jì)算機(jī)學(xué)報(bào),2022(1):207?223.