999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于申威421的視頻解碼的向量化并行

2021-10-28 04:42:26張書欽
計算機技術與發展 2021年10期

裴 航,王 磊,王 威,張書欽

(1.中原工學院 計算機學院,河南 鄭州 451191; 2.中原工學院 前沿信息技術研究院,河南 鄭州 451191)

0 引 言

隨著互聯網的高速發展以及第五代移動通信技術的到來,人們對多媒體品質的需求日益提升,高清視頻的高效編解碼成為研究熱點。很多處理器平臺都研發出相應的擴展部件來增強計算機多媒體數據處理能力。單指令流多數據流(SIMD)[1]結構可以高效地對大規模數據進行并行處理,有效實現應用程序中規整的數據級并行(data level parallelism,DLP),從而提升了處理器的吞吐率,在一定程度上滿足了多媒體計算能力需求[2]。Intel公司在Pentium處理器中最早采用了支持MMX[3]的SIMD技術,一直不斷升級至現在的AVX2技術。ARM公司推出的Cortex-A系列處理器采用了NEON技術[4]。如今越來越多的廠商都在處理器內集成、升級SIMD擴展部件,很多應用程序都在尋求SIMD并行,以增強移動終端的多媒體處理能力。

申威[5]是國內自主研發的通用處理器,提供256位向量寄存器且包括支持256位向量訪存及運算的SIMD擴展指令。對于某些處理器體系結構,SIMD擴展指令允許將原來需要多次裝載的內存中地址連續的數據一次性裝載到向量寄存器中。使用一條SIMD擴展指令實現對SIMD向量寄存器中所有數據元素的并行處理,這種執行方式非常適合于處理計算密集、數據相關性少的多媒體程序,如音視頻編解碼[6]。

H.264[7]視頻編碼格式是目前發展比較成熟的編碼格式。常用的開源解碼器有JM[8]、T264[9]和FFmpeg[10],目前很多國產平臺都對FFmpeg視頻解碼器針對各個平臺特點做了相應的優化。文獻[11]針對視頻解碼時CPU占用率高,專用硬件解碼耗時長等問題,研究了飛騰平臺上GPU硬件加速視頻解碼技術,設計了基于VDPAU硬件解碼接口的GPU硬件視頻解碼方案。文獻[12]在實現FFmpeg解碼器到國產龍芯3B平臺的移植的基礎上,并通過龍芯3B所支持的向量擴展指令,對FFmpeg解碼器的各個關鍵模塊代碼進行了向量優化。文獻[13]結合飛騰多核DSP同構多核架構以及共享存儲的特點,采用面向共享存儲系統結構的工業標準Open MP,通過設立并行域以及設置私有變量對解碼程序有針對性地進行了并行優化。

文中基于國產自主可控平臺申威421,在對H.264解碼器的開源程序FFmpeg移植后,H.264視頻解碼效率低,高分辨率的視頻播放不流暢甚至卡頓,嚴重影響國產平臺桌面用戶體驗,阻礙了申威處理器的市場化進度。針對此現象,文中充分利用了申威SIMD擴展部件對多媒體程序進行向量化并行。H.264解碼器性能顯著提升,解決了視頻播放不流暢問題,推動了國產申威處理器市場化的發展。

1 基于FFmpeg的H.264解碼器

H.264是國際標準化組織(ISO)和國際電信聯盟(ITU)共同提出的繼MPEG4之后的新一代數字視頻編解碼標準。最大的優勢是具有比較高的數據壓縮比率,在相同圖像質量的條件下,H.264的壓縮比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。H.264視頻編解碼標準沒有明確規定如何實現編解碼器,但規定了編碼視頻比特流的語法和比特流的解碼步驟方法[14]。

本研究主要基于FFmpeg的H.264解碼器進行優化。FFmpeg是一套基于Linux操作系統的開源編解碼解決方案,它集成了音視頻錄制、格式轉換和編解碼器,也可在大多數操作系統中編譯和使用[15]。它不僅包含各種音頻和視頻編解碼庫,還支持基于流媒體的實時流傳輸。

FFmpeg中H.264解碼器的解碼流程如圖1所示。首先通過函數h264_decode_frame解碼一幀圖像數據,其中decode_nal_units是用于解碼NALU的函數。decode_nal_units首先調用ff_h264_decode_nal判斷NALU的類型,然后根據NALU類型的不同調用不同的解析函數和解碼函數,解析函數包括解析SPS/PPS/SEI以及slice_head。ff_h264_execute_decode_slices用于解碼獲取圖像信息,ff_h264_execute_decode_slices調用了decode_slice函數,在decode_slice函數中完成了熵解碼、變換與量化、宏塊解碼、環路濾波等解碼的細節工作。

圖1 H.264解碼器解碼流程

熵解碼部分的功能是讀取數據(宏塊類型、參考幀、運動矢量、殘差等),并按照H.264的語法和語義規則將其分配到H.264解碼器中相應的變量中。其中熵解碼方面的函數有ff_h264_decode_mb_cabac和ff_h264_decode_mb_cavlc。分別用于解碼CABAC編碼方式的H.264數據和CAVLC編碼方式的H.264數據。

根據熵解碼后各宏塊的信息,函數hl_decode_mb會根據宏塊類型的不同做處理,主要針對幀間或者幀內宏塊。如果是幀間預測宏塊,調用函數hl_motion_422或者函數hl_motion_420進行四分之一像素運動補償;如果是幀內預測宏塊,就會調用hl_decode_mb_predict_luma進行幀內預測。經過幀內預測或者幀間預測步驟之后,就得到了預測數據。最后hl_decode_mb會調用hl_decode_mb_idct_luma等幾個函數對殘差數據進行DCT反變換,并將變換后的數據疊加到預測數據上,形成解碼后的圖像數據。

Decode_slice在完成宏塊解碼后,調用loop_filter函數進行環路濾波工作。環路濾波主要是為了去除圖像變換量化后產生的塊狀視覺效應。loop_filter函數遍歷該行宏塊中的每個宏塊,并且針對每一個宏塊調用ff_h264_filter_mb_fast。函數ff_h264_filter_mb_fast中h264_filter_mb_fast_internal完成一個宏塊的環路濾波工作。該函數分別調用filter_mb_edgev或filter_mb_edgeh對亮度垂直或邊界進行濾波,和調用filter_mb_edgecv或filter_mb_edgech對色度的垂直或水平邊界進行濾波。

2 H.264關鍵模塊的向量化

文中在對H.264解碼器關鍵模塊進行向量化并行時首先對熱點函數中的循環進行向量化分析,分析循環內是否具有數據相關性、對齊、連續等條件。如果滿足向量化分析,使用SIMD指令進行替換。如果不滿足,分析是否可以通過循環變換數組重組等方法來滿足向量化分析,然后通過內嵌匯編進行向量指令替換。最后對向量化后的程序性能進行測試,如果沒有性能提升,繼續對下一個循環進行分析。

2.1 熱點函數分析

perf是內置于Linux內核源碼中的性能剖析工具。基于事件采樣和性能事件的原則,它支持處理器和操作系統相關性能指標的性能配置文件,并可用于查找瓶頸和定位熱點代碼。本研究針對視頻序列foreman,使用perf工具列出了H.264解碼器在在整個視頻解碼過程中所占比重較大的熱點函數,如表1所示。

表1 H.264解碼器熱點函數

熱點函數為應用程序中耗時較多,執行次數較多的函數,對熱點函數進行優化相對來講性能提升比較明顯。通過性能分析工具可以發現熱點函數主要集中在宏塊解碼的幀內預測、運動補償、環路濾波等模塊。上述函數幾乎占據整個解碼過程的55%,因此對上述函數中的循環做向量化,解碼器性能理論上可以得到顯著提升。

2.2 熱點函數向量化并行

熱點函數中h264_qpel系列函數用于對1/4像素內插做運動補償,其中h264_qpel_lowpass類函數完成了半像素內插函數的初始化工作,主要對2×2、4×4、8×8大小的圖像方塊通過水平或垂直方向濾波計算半像素。H.264標準采用了一個6抽頭的有限脈沖響應濾波器(finite impu1se response,FIR)進行計算,濾波器系數為(1/32,-5/32,5/8,5/8,-5/32,1/32),雖然6抽頭濾波器比較復雜,但可以明顯改善運動補償性能[16]。半像素插值計算如圖2所示,半像素點(如b,h,m)通過對相應整像素點(圖中灰色方塊)進行6抽頭濾波得出。半像素b的計算可由同一行中的整像素E、F、G、H、I、J得出。計算公式見式(1),其中CLIP用于將取值限幅在0~255。

b=CLIP[(E-5F+20G-20H+5I+J+16)>>5]

(1)

圖2 1/2像素插值

對于1/2像素插值計算,由于計算需要像素每行的存儲規則,且像素間不存在數據相關性,這種計算密集,復雜度較高的運算十分適合利用SIMD擴展部件對其進行向量計算,使用申威SIMD擴展指令集可以一次性裝入一行整像素點。通過向量計算得到每行的1/2像素點,循環8次就可以計算出8×8塊的64個1/2像素點。8×8圖像塊的每行的1/2像素點的SIMD計算如圖3所示。

圖3 1/2像素插值SIMD計算

申威擴展指令集提供VLDW_U/VSTW_U非對齊裝入/存儲指令,可以從存儲器中取出8個32 bit或32個8 bit元素到256位向量寄存器,并支持不同長度的加/減移位等運算。8 bit的像素可以一次裝入32個元素到256位向量寄存器/存儲器中,但對于8×8的圖像塊的1/2像素點的計算,只需使用向量寄存器的64位,每次進行8個元素的運算。函數put_h264_qpel8_h_lowpass優化前和優化后的代碼如下所示:

優化前:

for(i=0; i

{

dst[0]=CLIP((((src[0]+src[1])*20-(src[-1]+src[2])*5+(src[-2]+src[3]))+16)>>5);

dst[1]=CLIP((((src[1]+src[2])*20-(src[0]+src[3])*5+(src[-1]+src[4]))+16)>>5);

......

}

優化后:

for(i=0; i

{

vldw_u $f1,0(a0)

vldw_u $f2,0(a1)

vldw_u $f3,1(a1)

vldw_u $f4,-1(a1)

vldw_u $f5,2(a1)

vldw_u $f6,-2(a1)

vldw_u $f7,3(a1)

ldwe $f10,0,(a2)

vaddw $f2,$f3,$f2

vsllw $f2,4,$f8;

vsllw $f2,2,$f9

vaddw $f8,$f9,$f8

vaddw $f4,$f5,$f4

vsllw $f4,2,$f9

vaddw $f9,$f4,$f9

vsubw $f8,$f9,$f8

vaddw $f6,$f7,$f6

vaddw $f8,$f6,$f8

vaddw $f8,$10,$f8

vsrlw $f8,5,$f8

vstw_u $f8,0(a0)

}

首先從存儲器中取出以原像素點src[0]為起始的8個整像素點放置向量寄存器中,然后分別與依次擴展1位的連續8個整像素點進行向量運算。其中乘法直接用加法和移位來代替,最后將計算的8個結果分別放置8個目標分像素點,完成一行的分像素點計算。接著增加步長進行下一行的分像素點計算,循環8次完成8×8塊的分像素計算。使用申威SIMD指令進行替換,一條SIMD指令可以同時進行8次相同運算,計算出每行的分像素點,有效提升了分像素插值的效率。

對于4×4、2×2塊的水平或垂直方向的1/2像素插值計算向量化并行同8×8塊計算方法相似,只是4×4塊對于每行1/2像素點的計算只能一次進行4個像素點計算。而對于雙向預測的1/2像素點的計算更加復雜一些,同樣適合使用SIMD指令來進行向量化并行計算1/2插值點。

在H.264關鍵模塊算法中都存在滿足向量化分析的循環,對此可以直接進行向量指令替換。經過1/4像素運動補償的幀間或者幀內預測后,就需要將殘差數據進行DCT反變換,DCT系列函數中ff_h264_idct8_dc_add_8c對只有DC系數的8×8矩陣進行整數DCT反變換。最內層循環通過一條向量指令vaddw就可以實現對8×8像素每行與dc系數的累加來代替最內層的8次循環,降低了循環開銷。相對比較復雜的4×4整數DCT反變換函數ff_h264_idct_add_8_c,先對每列進行一維整數變換,然后對經過列變換塊的每行進行一維整數變換,最后將變換后的殘差數據疊加來實現傳統整數變換的矩陣乘法。由于數據是以行來存儲的,所以使用SIMD擴展指令可以先實現一行元素的整數變換,經過四次向量計算完成整個塊的縱向一維整數變換。再對經過縱向一維整數變換的塊進行另一維的向量整數變換,最后通過向量指令進行殘差數據疊加。而對于環路濾波中h264_loop_filter類函數由于循環內數組訪問不連續以及存在控制流,不能直接向量化,需要對數組進行重組,然后進行向量化。

3 實 驗

3.1 實驗環境

本次實驗平臺基于國產自主可控平臺申威421,操作系統為deepin15.5,編譯器為申威自主研發編譯器swgcc-5.3.0。實驗環境如表2所示,為使測試結果具有代表性,實驗分別選取了3組不同分辨率720×486、1 600×960、2 048×1 024的視頻序列,視頻播放采用FFmpeg組件ffplay。

表2 實驗環境

3.2 實驗結果分析

基于移植到申威平臺的H.264解碼器有很大性能提升。表3表示對各個熱點函數向量化與向量化后的性能對比,表4表示3個視頻序列在對解碼器中關鍵模塊向量化后的性能對比。

表3 各函數向量化前后性能對比

表4 測試視頻向量化前后性能對比

通過實驗對比,對熱點函數中滿足向量化分析的循環進行向量指令替換,增加了指令吞吐率,在保證原視頻清晰度的基礎上,視頻解碼性能有大幅度提升。其中函數put_h264_qpel8_h_lowpass向量化后加速比達到3.4,而函數put_h264_chroma_mcXY_8_c中由于對未知變量的乘法,需要對系數進行判斷再執行移位運算來代替乘法繼續向量運算,向量化指令更加復雜,加速比只有1.1。測試的3個視頻序列中football的解碼性能最高有35.3%的提升。并且CPU占用率明顯降低,釋放了CPU資源,2 048×1 024分辨率高的視頻播放流暢度更高,提高了國產申威平臺用戶的多媒體視覺體驗。

4 結束語

本次研究針對H.264解碼器中的熱點函數使用SIMD擴展部件來進行向量化計算,提升解碼器性能。但是由于并沒有充分利用到256位向量寄存器,向量重組等技術存在一定開銷,向量化效果并沒有達到理想的提升。接下來將會針對熱點函數中由于數組非對齊及存在數據依賴等程序進行重點分析,充分利用256位向量寄存器,更深層次地挖掘數據的并行性。隨著高性能計算的發展,SIMD擴展部件仍然是程序加速的重要手段,SIMD擴展部件結構簡單、功耗低、加速效果明顯,不需要增加通信以及cache和內存的開銷,在多媒體領域,數字信號處理中都起著關鍵作用。而如何充分利用SIMD擴展部件更深層次地挖掘數據并行性,提升程序性能,是長久的工作重心。

主站蜘蛛池模板: 成年片色大黄全免费网站久久| 久久久久久高潮白浆| 伊人久热这里只有精品视频99| 久久先锋资源| 玖玖免费视频在线观看| 色悠久久综合| 国产主播一区二区三区| 亚洲精品视频免费观看| 一本无码在线观看| 国产精品久久久久鬼色| 国产免费网址| 欧美a级完整在线观看| 91在线精品免费免费播放| 99热这里只有精品在线播放| 国产精品亚洲αv天堂无码| 亚洲最大福利视频网| 国产婬乱a一级毛片多女| 四虎影视库国产精品一区| 亚洲Av综合日韩精品久久久| 久久77777| 国产精品成| 亚洲最大福利网站| 人人爱天天做夜夜爽| a色毛片免费视频| 无码专区在线观看| 99在线观看国产| 国产成人精品日本亚洲77美色| 亚洲乱码在线视频| 国产成人免费高清AⅤ| 国产人成在线视频| 亚洲一级毛片在线观| 在线观看91香蕉国产免费| 国产本道久久一区二区三区| 日韩高清一区 | 在线观看免费国产| 日韩午夜福利在线观看| 国产另类乱子伦精品免费女| 免费视频在线2021入口| 免费在线观看av| 91精品情国产情侣高潮对白蜜| 久久国产高潮流白浆免费观看 | 国产亚洲精| 欧美人与牲动交a欧美精品 | 欧美精品H在线播放| 亚洲无码高清免费视频亚洲| 亚洲中文字幕无码mv| 欧美日韩成人| 香蕉久久国产精品免| 久久男人资源站| 欧美无专区| 国产精品第一区在线观看| 国产办公室秘书无码精品| 91午夜福利在线观看| 久久人午夜亚洲精品无码区| 欧美在线综合视频| 在线国产毛片| 日本高清免费一本在线观看| 亚洲品质国产精品无码| 人妻无码中文字幕第一区| 中文字幕色站| 狠狠五月天中文字幕| 成人免费网站在线观看| 国产手机在线观看| 国产成人无码AV在线播放动漫| 久久国产亚洲偷自| 91毛片网| 国产成在线观看免费视频| 午夜精品国产自在| 国产精品55夜色66夜色| 亚洲日韩在线满18点击进入| 久久国产精品77777| 亚洲日本中文字幕天堂网| 丁香婷婷久久| www.av男人.com| 欧美午夜理伦三级在线观看| 精品国产一区二区三区在线观看| 国产国产人成免费视频77777| 国产福利大秀91| 中文字幕日韩久久综合影院| 久久久久国产精品熟女影院| 99热最新在线| 99久久99这里只有免费的精品|