叶丹敏
(杭州电子科技大学 图形图像研究所,浙江 杭州 310018)
GPU解码数据快速拷贝的应用研究
叶丹敏
(杭州电子科技大学 图形图像研究所,浙江 杭州 310018)
针对高清视频在客户端解码播放过程中存在的CPU占用率高、图像数据拷贝速度低等问题,提出了一种基于GPU解码数据快速拷贝方法。研究了DXVA硬解码方法在视频解码运算过程中的应用,为了消除解码数据在显存拷贝时产生的CPU占用率高现象,利用显存特点和SSE4.1多媒体指令新特性,设计并实现了视频帧数据快速拷贝方案。实验结果表明,该方法能在满足高清视频实时播放的同时有效降低CPU占用率,且该方法具有一定的实用性。
H.264;USWC;硬解码;DXVA
随着网络带宽的提升和存储设备的降价,超高清时代(2k甚至4k分辨率)也开始进入人们的生活。然而高分辨率视频在带来高质量感官体验的同时,显然也会产生数倍高于之前的数据量(如1 080P的屏幕像素约有200万个,是传统720P屏幕90万像素点的2倍;4k的屏幕像素高达800万个,是1 080P屏幕的4倍)。可见,高清会对播放器产生两方面的压力:一方面是解码运算对CPU产生较高的占用率;另一方面是高分辨率图像拷贝所产生的延迟。对于前者,已有多种成熟解决方案,即利用显卡中大量的流处理器辅助CPU完成解码运算,如NVIDIA的PureVideo、AMD的通用视讯解码器(UnifiedVideoDecoder,UVD)和微软的视频硬件加速(DirectXVideo,Acceleration,DXVA)等[1-2]。对于后者,自1996年Intel推出多媒体扩展指令集(MultimediaExtension,MMX)技术以来,已有人利用MMX技术优化了数据处理的过程[3],但由于MMX寄存器的限制,进行大量数据拷贝时效率较低。后来Intel发布的单指令多数据流(SingleInstructionMultipleData,SIMD)扩展流(StreamingSIMDExtension,SSE)技术恰好能弥补这一点,但需要应用程序根据其具体的硬解码接口进行优化,目前该方面的研究工作较少。本文针对微软DXVA硬解码输出接口,利用SSE4.1多媒体指令,实现了从显存快速拷贝大块视频帧技术,从而将CPU从高清解码中真正解放出来。
H.264视频解码流程如图1所示。由于采用了混合编码方案,所以解码时输入码流经过熵解码后,需要分别将逆离散余弦变换得到的残差帧和运动补偿或帧内预测获得的预测帧组合后再进行去码滤波,得到的帧作为重建图像输出,同时也作为之后的参考帧被保存到帧缓存内。
图1 H.264解码原理框图
H.264解码[4]的几个重要步骤及其CPU占用率,如表1所示。可见VLD、IDCT、MoComp、PostProc这4个步骤占了视频解码80%以上的运算量。
表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。程序会根据当前显卡的能力,选出一个得分最高的设置进行硬解码,并可将超过80%的运算交由显卡执行。
GPU完成解码后,原本数据量较小的视频帧被还原成一幅完整的图片存储于GPU的显存中,为确保在倒帧回放时视频依旧能正常播放必须将图片立即复制出来,以常见的25帧/s1 080P视频为例,拷贝速度起码达到200MB·s-1(25×1 920×1 080×4Byte≈ 200MB)。要在短时间内完成如此大量的数据拷贝对于CPU的压力较大,若只进行解码操作,开启GPU加速后,CPU占用率只有6%,如图2(a)所示;若采用常见的Memcpy方式[6],将发现即使GPU承担了解码的运算量,在播放视频画面时,CPU占用率仍会高达27%,如图2(b)所示。可见要想彻底解放CPU,必须对其中涉及的数据拷贝做进一步优化。
图2 CPU占用率
2.1显存与内存的异同
从硬件上来说,显存并不是内存的一部分,但操作系统通过Memory-mappedI/O的方式将显存映射到常规内存地址空间,从而使得应用程序可像访问常规内存一样访问显存。这种由显存映射而来的内存被称为USWCMemory,即无缓冲随机联合写操作内存(UncacheableSpeculativeWriteCombiningMemory)。“联合写操作”就是将一系列的存取操作合并后一次性执行,这使得USWCMemory适合大块数据的连续读写操作。
2.2从显存快速拷贝数据
若使用普通多媒体指令从USWCMemory拷贝数据,Intel公司早期推出的MMX指令集[7-8],如图3(a)所示,由于128位XMM寄存器的限制,4个FBS时钟周期只能拷贝16Byte,效率低下。后来Intel公司又推出了SSE指令集,在兼容MMX指令的同时也可通过SIMD和单时钟周期下并行处理多个浮点数据,从而有效地提高了浮点运算速度。其中对多媒体指令集架构作出重大改进的SSE4指令集更是大幅度地提升了读取数据的频宽[9]。为实现USWCMemory的快速加载,SSE4.1指令集中引入了StreamLoad操作,如图3(b)所示,在拷贝这16Byte的同时将64Byte的数据存入WriteCombiningBuffers,后续的读取不再消耗FSB时钟,大幅提升了读取效率。
图3 采用SSE4.1拷贝USWC内存
从USWC中拷贝内存有两种方式:
(1)大段读取操作。将USWC中的数据加载到某段临时内存的一级缓冲内(L1Cache),一级缓冲填满后一次性加载到目的内存。这种方式的优势是可利用微软封装的_mm_stream_load_si128和_mm_stream_si128函数,代码实现较为简单,但性能上并非最佳;
(2)增量读取操作。利用SSE4.1中新增的Movntdqa指令,一次性读取USWC内的64Byte到临时缓冲(BufferLine),再将这64Byte拷贝到8个MMX寄存器[10]中(MMX0~MMX7),再用Movdqa指令以“写穿”的方式越过CPU缓存直接写入内存。此方法的难点是需要自身控制寄存器,速度却是最快的。由于MMX寄存器多达8个,执行两次StreamLoad操作才能将其全部填满,拷贝汇编代码如下
__asm movdqa[edi + 112],xmm7
采用SSE4.1进行帧USWC数据拷贝,其性能与普通Memcpy、SSE2指令和MMX指令相比,有了大幅度提升。如表2所示,对于长宽为1 920×1 080的视频帧,若采用SSE4.1进行拷贝,其性能是SSE2的7倍。
表2 不同汇编指令对USWC的拷贝速度
在VisualStudio2010上用C++进行开发,选用微软提供的DXVA硬解码输出接口,在DXVAAPI的基础上做了进一步封装,针对该硬解码接口结合SSE4.1多媒体指令实现了数据拷贝的优化。计算机硬件采用Intel(R)Core(TM) 2,CPU3.00GHz,内存4.00GB,NVIDIAGeForce9800GT显卡。以30帧/s的1 080P视频为例,实验结果如图4所示。其中,若只进行解码操作,如图4(a)所示,开启CPU加速,CPU占用率高达50%;如图4(b)所示,开启GPU加速,CPU占用率只有15%;针对采用硬解码方式后进行数据拷贝、视频播放操作;如图4(c)和图4(e)所示,采用普通的memcpy指令的数据拷贝方式,CPU占用率达约39%;如图4(d)和图4(f)所示,采用SSE4.1指令的数据拷贝方式,CPU占用率约10%。
图4 高清视频解码数据拷贝测试
通过实验可知,利用硬解码技术有效地辅助了CPU完成解码运算,降低了解码运算过程中CPU的占有率,同时针对微软DXVA标准接口,采用SSE4.1多媒体指令实现数据快速拷贝,使得CPU占用率约减少1/2,同时也保证了高清视频播放的流畅度。因此,本文提出的GPU解码数据快速拷贝方法能有效解决高分辨率视频带来的大数据量问题。
相较于传统的视频帧数据解码拷贝处理技术,本文提出的方法较好地结合了DXVA硬解码技术和最新的SSE4.1指令集技术,具有一定的显卡兼容性,设计实现了从显存快速拷贝视频帧数据的方法。实验表明,该方法在实时播放高清视频时有效地降低了CPU占用率,达到了将CPU从视频解码中彻底解放的目的。在接下来的工作中,还需研究ARM架构下的高清视频解码数据拷贝技术方案,优化该平台下客户端播放时存在的压力问题。
[1]NakayamaK.Onepassvideoprocessingandcompositionforhigh-definitionvideo:U.S.Patent8570441[P].2013-10-29.
[2]LuoHQ,WangXX,WangDG.VideomonitoringsystembasedonDXVA[C].Hangzhou: 2012InternationalConferenceonWaveletActiveMediaTechnologyandInformationProcessing(ICWAMTIP), 2012.
[3]魏芳,李学明.基于MMX技术的H.264解码器优化[J].计算机工程与设计,2004, 25(12):2218-2221.
[4]ChenYK,LiEQ,ZhouX,etal.ImplementationofH.264encoderanddecoderonpersonalcomputers[J].JournalofVisualCommunicationandImageRepresentation,2006,17(2):509-532.
[5]苏俊峰,朱秀昌.基于DXVA的多路H.264高清视频解码器的实现[J].电视技术,2011, 35(18):30-33,69.
[6]YingH,ZhuH,WangD,etal.Anovelschemetogenerateoptimalmemcpyassemblycode[C].Guangzhou:2013InternationalConferenceonInformationScienceandTechnology(ICIST), 2013.
[7]朱金秀,辛宇,曹宁.基于MMX技术的H.264编码器的研究与实现[J].计算机工程与设计,2006, 27(19):3706-3708.
[8]姚志恒,李博扬,田栋,等.MMX技术在视频编码中的应用[J].计算机与网络,2001,27(24):28-31.
[9]范亚琼.基于SSE4指令集的H.264编码标准的运动估计优化[D].武汉:武汉理工大学,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