葉丹敏
(杭州電子科技大學(xué) 圖形圖像研究所,浙江 杭州 310018)
?
GPU解碼數(shù)據(jù)快速拷貝的應(yīng)用研究
葉丹敏
(杭州電子科技大學(xué) 圖形圖像研究所,浙江 杭州 310018)
針對高清視頻在客戶端解碼播放過程中存在的CPU占用率高、圖像數(shù)據(jù)拷貝速度低等問題,提出了一種基于GPU解碼數(shù)據(jù)快速拷貝方法。研究了DXVA硬解碼方法在視頻解碼運(yùn)算過程中的應(yīng)用,為了消除解碼數(shù)據(jù)在顯存拷貝時產(chǎn)生的CPU占用率高現(xiàn)象,利用顯存特點(diǎn)和SSE4.1多媒體指令新特性,設(shè)計并實(shí)現(xiàn)了視頻幀數(shù)據(jù)快速拷貝方案。實(shí)驗(yàn)結(jié)果表明,該方法能在滿足高清視頻實(shí)時播放的同時有效降低CPU占用率,且該方法具有一定的實(shí)用性。
H.264;USWC;硬解碼;DXVA
隨著網(wǎng)絡(luò)帶寬的提升和存儲設(shè)備的降價,超高清時代(2k甚至4k分辨率)也開始進(jìn)入人們的生活。然而高分辨率視頻在帶來高質(zhì)量感官體驗(yàn)的同時,顯然也會產(chǎn)生數(shù)倍高于之前的數(shù)據(jù)量(如1 080P的屏幕像素約有200萬個,是傳統(tǒng)720P屏幕90萬像素點(diǎn)的2倍;4k的屏幕像素高達(dá)800萬個,是1 080P屏幕的4倍)??梢?,高清會對播放器產(chǎn)生兩方面的壓力:一方面是解碼運(yùn)算對CPU產(chǎn)生較高的占用率;另一方面是高分辨率圖像拷貝所產(chǎn)生的延遲。對于前者,已有多種成熟解決方案,即利用顯卡中大量的流處理器輔助CPU完成解碼運(yùn)算,如NVIDIA的PureVideo、AMD的通用視訊解碼器(UnifiedVideoDecoder,UVD)和微軟的視頻硬件加速(DirectXVideo,Acceleration,DXVA)等[1-2]。對于后者,自1996年Intel推出多媒體擴(kuò)展指令集(MultimediaExtension,MMX)技術(shù)以來,已有人利用MMX技術(shù)優(yōu)化了數(shù)據(jù)處理的過程[3],但由于MMX寄存器的限制,進(jìn)行大量數(shù)據(jù)拷貝時效率較低。后來Intel發(fā)布的單指令多數(shù)據(jù)流(SingleInstructionMultipleData,SIMD)擴(kuò)展流(StreamingSIMDExtension,SSE)技術(shù)恰好能彌補(bǔ)這一點(diǎn),但需要應(yīng)用程序根據(jù)其具體的硬解碼接口進(jìn)行優(yōu)化,目前該方面的研究工作較少。本文針對微軟DXVA硬解碼輸出接口,利用SSE4.1多媒體指令,實(shí)現(xiàn)了從顯存快速拷貝大塊視頻幀技術(shù),從而將CPU從高清解碼中真正解放出來。
H.264視頻解碼流程如圖1所示。由于采用了混合編碼方案,所以解碼時輸入碼流經(jīng)過熵解碼后,需要分別將逆離散余弦變換得到的殘差幀和運(yùn)動補(bǔ)償或幀內(nèi)預(yù)測獲得的預(yù)測幀組合后再進(jìn)行去碼濾波,得到的幀作為重建圖像輸出,同時也作為之后的參考幀被保存到幀緩存內(nèi)。
圖1 H.264解碼原理框圖
H.264解碼[4]的幾個重要步驟及其CPU占用率,如表1所示??梢奦LD、IDCT、MoComp、PostProc這4個步驟占了視頻解碼80%以上的運(yùn)算量。
表1 H.264各個解碼步驟的CPU占用率
微軟的DXVA[5]接口提供了4個等級的硬解碼加速能力,從高到低分別為:DXVA2_ModeVC1_D(DXVA2_ModeVC1_VLD);DXVA2_ModeVC1_C(DXVA2_ModeVC1_IDCT);DXVA2_ModeVC1_B(DXVA2_ModeVC1_MoComp);DXVA2_ModeVC1_A(DXVA2_ModeVC1_PostProc)。
VLD加速等級最高,所以其包含IDCT、MoCoopm和PostProc;IDCT加速次之,包含MoCoopm和PostProc;最后MoComp加速僅包含PostProc。程序會根據(jù)當(dāng)前顯卡的能力,選出一個得分最高的設(shè)置進(jìn)行硬解碼,并可將超過80%的運(yùn)算交由顯卡執(zhí)行。
GPU完成解碼后,原本數(shù)據(jù)量較小的視頻幀被還原成一幅完整的圖片存儲于GPU的顯存中,為確保在倒幀回放時視頻依舊能正常播放必須將圖片立即復(fù)制出來,以常見的25幀/s1 080P視頻為例,拷貝速度起碼達(dá)到200MB·s-1(25×1 920×1 080×4Byte≈ 200MB)。要在短時間內(nèi)完成如此大量的數(shù)據(jù)拷貝對于CPU的壓力較大,若只進(jìn)行解碼操作,開啟GPU加速后,CPU占用率只有6%,如圖2(a)所示;若采用常見的Memcpy方式[6],將發(fā)現(xiàn)即使GPU承擔(dān)了解碼的運(yùn)算量,在播放視頻畫面時,CPU占用率仍會高達(dá)27%,如圖2(b)所示??梢娨霃氐捉夥臗PU,必須對其中涉及的數(shù)據(jù)拷貝做進(jìn)一步優(yōu)化。
圖2 CPU占用率
2.1顯存與內(nèi)存的異同
從硬件上來說,顯存并不是內(nèi)存的一部分,但操作系統(tǒng)通過Memory-mappedI/O的方式將顯存映射到常規(guī)內(nèi)存地址空間,從而使得應(yīng)用程序可像訪問常規(guī)內(nèi)存一樣訪問顯存。這種由顯存映射而來的內(nèi)存被稱為USWCMemory,即無緩沖隨機(jī)聯(lián)合寫操作內(nèi)存(UncacheableSpeculativeWriteCombiningMemory)?!奥?lián)合寫操作”就是將一系列的存取操作合并后一次性執(zhí)行,這使得USWCMemory適合大塊數(shù)據(jù)的連續(xù)讀寫操作。
2.2從顯存快速拷貝數(shù)據(jù)
若使用普通多媒體指令從USWCMemory拷貝數(shù)據(jù),Intel公司早期推出的MMX指令集[7-8],如圖3(a)所示,由于128位XMM寄存器的限制,4個FBS時鐘周期只能拷貝16Byte,效率低下。后來Intel公司又推出了SSE指令集,在兼容MMX指令的同時也可通過SIMD和單時鐘周期下并行處理多個浮點(diǎn)數(shù)據(jù),從而有效地提高了浮點(diǎn)運(yùn)算速度。其中對多媒體指令集架構(gòu)作出重大改進(jìn)的SSE4指令集更是大幅度地提升了讀取數(shù)據(jù)的頻寬[9]。為實(shí)現(xiàn)USWCMemory的快速加載,SSE4.1指令集中引入了StreamLoad操作,如圖3(b)所示,在拷貝這16Byte的同時將64Byte的數(shù)據(jù)存入WriteCombiningBuffers,后續(xù)的讀取不再消耗FSB時鐘,大幅提升了讀取效率。
圖3 采用SSE4.1拷貝USWC內(nèi)存
從USWC中拷貝內(nèi)存有兩種方式:
(1)大段讀取操作。將USWC中的數(shù)據(jù)加載到某段臨時內(nèi)存的一級緩沖內(nèi)(L1Cache),一級緩沖填滿后一次性加載到目的內(nèi)存。這種方式的優(yōu)勢是可利用微軟封裝的_mm_stream_load_si128和_mm_stream_si128函數(shù),代碼實(shí)現(xiàn)較為簡單,但性能上并非最佳;
(2)增量讀取操作。利用SSE4.1中新增的Movntdqa指令,一次性讀取USWC內(nèi)的64Byte到臨時緩沖(BufferLine),再將這64Byte拷貝到8個MMX寄存器[10]中(MMX0~MMX7),再用Movdqa指令以“寫穿”的方式越過CPU緩存直接寫入內(nèi)存。此方法的難點(diǎn)是需要自身控制寄存器,速度卻是最快的。由于MMX寄存器多達(dá)8個,執(zhí)行兩次StreamLoad操作才能將其全部填滿,拷貝匯編代碼如下
__asm movdqa[edi + 112],xmm7
采用SSE4.1進(jìn)行幀USWC數(shù)據(jù)拷貝,其性能與普通Memcpy、SSE2指令和MMX指令相比,有了大幅度提升。如表2所示,對于長寬為1 920×1 080的視頻幀,若采用SSE4.1進(jìn)行拷貝,其性能是SSE2的7倍。
表2 不同匯編指令對USWC的拷貝速度
在VisualStudio2010上用C++進(jìn)行開發(fā),選用微軟提供的DXVA硬解碼輸出接口,在DXVAAPI的基礎(chǔ)上做了進(jìn)一步封裝,針對該硬解碼接口結(jié)合SSE4.1多媒體指令實(shí)現(xiàn)了數(shù)據(jù)拷貝的優(yōu)化。計算機(jī)硬件采用Intel(R)Core(TM) 2,CPU3.00GHz,內(nèi)存4.00GB,NVIDIAGeForce9800GT顯卡。以30幀/s的1 080P視頻為例,實(shí)驗(yàn)結(jié)果如圖4所示。其中,若只進(jìn)行解碼操作,如圖4(a)所示,開啟CPU加速,CPU占用率高達(dá)50%;如圖4(b)所示,開啟GPU加速,CPU占用率只有15%;針對采用硬解碼方式后進(jìn)行數(shù)據(jù)拷貝、視頻播放操作;如圖4(c)和圖4(e)所示,采用普通的memcpy指令的數(shù)據(jù)拷貝方式,CPU占用率達(dá)約39%;如圖4(d)和圖4(f)所示,采用SSE4.1指令的數(shù)據(jù)拷貝方式,CPU占用率約10%。
圖4 高清視頻解碼數(shù)據(jù)拷貝測試
通過實(shí)驗(yàn)可知,利用硬解碼技術(shù)有效地輔助了CPU完成解碼運(yùn)算,降低了解碼運(yùn)算過程中CPU的占有率,同時針對微軟DXVA標(biāo)準(zhǔn)接口,采用SSE4.1多媒體指令實(shí)現(xiàn)數(shù)據(jù)快速拷貝,使得CPU占用率約減少1/2,同時也保證了高清視頻播放的流暢度。因此,本文提出的GPU解碼數(shù)據(jù)快速拷貝方法能有效解決高分辨率視頻帶來的大數(shù)據(jù)量問題。
相較于傳統(tǒng)的視頻幀數(shù)據(jù)解碼拷貝處理技術(shù),本文提出的方法較好地結(jié)合了DXVA硬解碼技術(shù)和最新的SSE4.1指令集技術(shù),具有一定的顯卡兼容性,設(shè)計實(shí)現(xiàn)了從顯存快速拷貝視頻幀數(shù)據(jù)的方法。實(shí)驗(yàn)表明,該方法在實(shí)時播放高清視頻時有效地降低了CPU占用率,達(dá)到了將CPU從視頻解碼中徹底解放的目的。在接下來的工作中,還需研究ARM架構(gòu)下的高清視頻解碼數(shù)據(jù)拷貝技術(shù)方案,優(yōu)化該平臺下客戶端播放時存在的壓力問題。
[1]NakayamaK.Onepassvideoprocessingandcompositionforhigh-definitionvideo:U.S.Patent8570441[P].2013-10-29.
[2]LuoHQ,WangXX,WangDG.VideomonitoringsystembasedonDXVA[C].Hangzhou: 2012InternationalConferenceonWaveletActiveMediaTechnologyandInformationProcessing(ICWAMTIP), 2012.
[3]魏芳,李學(xué)明.基于MMX技術(shù)的H.264解碼器優(yōu)化[J].計算機(jī)工程與設(shè)計,2004, 25(12):2218-2221.
[4]ChenYK,LiEQ,ZhouX,etal.ImplementationofH.264encoderanddecoderonpersonalcomputers[J].JournalofVisualCommunicationandImageRepresentation,2006,17(2):509-532.
[5]蘇俊峰,朱秀昌.基于DXVA的多路H.264高清視頻解碼器的實(shí)現(xiàn)[J].電視技術(shù),2011, 35(18):30-33,69.
[6]YingH,ZhuH,WangD,etal.Anovelschemetogenerateoptimalmemcpyassemblycode[C].Guangzhou:2013InternationalConferenceonInformationScienceandTechnology(ICIST), 2013.
[7]朱金秀,辛宇,曹寧.基于MMX技術(shù)的H.264編碼器的研究與實(shí)現(xiàn)[J].計算機(jī)工程與設(shè)計,2006, 27(19):3706-3708.
[8]姚志恒,李博揚(yáng),田棟,等.MMX技術(shù)在視頻編碼中的應(yīng)用[J].計算機(jī)與網(wǎng)絡(luò),2001,27(24):28-31.
[9]范亞瓊.基于SSE4指令集的H.264編碼標(biāo)準(zhǔn)的運(yùn)動估計優(yōu)化[D].武漢:武漢理工大學(xué),2010.
[10]JeongH,KimS,LeeW,etal.PerformanceofSSEandAVXinstructionsets[J].EprintArxiv, 2012,20(6):168-175.
Application of Fast Copying Data Decoded By GPU
YEDanmin
(InstituteofGraphicsandImage,HangzhouDianziUniversity,Hangzhou310018,China)
HDvideodecodingandplayingontheclientplayersuffershighCPUoccupancyandlowimagedatacopyspeed.ThispaperproposesanapproachthatcancopydatarapidlydecodedbyGPU.TheDXVAhardwaredecodingmethodintheapplicationofvideodecodingarithmeticprocessisstudied.InordertoeliminatethehighCPUusageresultfromthememorycopying,GPUmemory’sspecialtyandnewfeaturesofSSE4.1multimediainstructionareusedtodesignandimplementaschemeofvideoframedatacopyquickly.TheexperimentshowsthemethodcaneffectivelyreduceCPUoccupancywhilemeetingtherequirementsofreal-timeHDvideoplaying.
H.264;USWC;hardwaredecoding;DXVA
2015- 12- 20
葉丹敏(1991-),女,碩士研究生。研究方向:圖形圖像。
10.16180/j.cnki.issn1007-7820.2016.09.036
TN919.8;TP391.41
A
1007-7820(2016)09-132-04