GPU运用于HEVC编码的科技文献检索

来源:互联网 发布:idc 手机出货量数据 编辑:程序博客网 时间:2024/04/28 22:32

0 前言

第一次写科技博客,如果有错误欢迎指正。后续会陆续放出,HEVC的学习笔记。。


说明

GPU主要用来进行图形计算,本身结构跟CPU也有很大差别,但是GPU技术发展到现在,其在浮点运算、高度并发、内存数据带宽等方面的能力比CPU更强。如何把以前在CPU上进行的通用密集型计算平滑地转移到GPU上就是GPGPU技术要解决的问题,也就是说可以把通用领域的计算转化为图形计算,然后由GPU协助完成中间计算过程,最后把结果又从GPU传回CPU,因此GPU经常被用作协处理器,当然有价值的转化要充分利用GPU的上述特点。

当前检索到的与GPU加速HEVC相关的学术论文都是基于混合编码框架(CPU+GPU),多数优化基于HEVC官方参考软件HM修改,少部分为x265。CPU主要用来处理编码器中逻辑复杂、计算量较小或数据依赖较重的模块,例如环内滤波、熵编码、模式决定等。而GPU主要用来加速运动估计(ME)模块,并且多采用全搜索或钻石搜索这类逻辑简单计算量大的搜索算法。设计者通过不同的算法减小了空域或时域的数据依赖,这样大大地增加了ME在GPU上的并发。部分文章也实现了对环内滤波模块的GPU加速,经测试在x265上该模块对编码速度影响较小,因此本文中不做细致讨论。检索到的论文中只有一篇采用OpenCL框架,其余全是NVIDIA的CUDA框架,可见CUDA对开发人员来说更加友好。

在这些论文中用作对比的HM编码器模型并不具备工程实践性,计算过于复杂且缺少并行。此外,用来对比的x265的配置和版本号未能详尽说明,硬件性能较低,且编码器配置过于简单(例如不使用码率控制、只含I和P帧、关闭SAO、关闭AMP等),这样可能导致的结果是即使复现了其中的算法,但在实际的业务场景中并不能达到预期效果,因此各篇文章中的优化结果仅供参考。但是,文章中介绍的公共性问题和解决办法、ME编码算法、GPU加速实现方法等值得学习和借鉴,这样可以为后续的GPU开发指明大概方向。

 

文献检索

一个64x64大小的CTU需要遍历425次的ME才能够找到最佳的CU深度和PU划分,该模块成为了限制HEVC实时编码的主要瓶颈,ME并行加速和减少ME迭代次数成为减小该影响的主要手段。因此Wang, et al. [1](2013.09) 提出了使用混合编码框架(CPU+GPU)加速不同块尺寸HEVC-ME搜索,构造了名为two-stage的ME搜索算法。第一阶段(GPU),仅依靠sad值选取三个最佳MV。第二阶段(CPU),将MV的cost也加入最佳MV的选择之中。假设当前CTU尺寸为64x64,那么会被划分为64个8x8的块。这些8x8的块将在32x32的搜索范围内进行全搜索。设定的thread block的规格是16x16 (即256个线程), 每一个线程为一个8x8的块计算出在一个搜索位置上的SAD值,该thread block上的指令需要执行四次可以完成一个8x8的块在1024个位置的搜索。最终选出3个sad值最小的MV再进行分像素搜索,然后将结果送给第二阶段的CPU进行模式决定。其他尺寸的块例如8x16, 16x8、64x64的SAD值可以通过这些8x8的块的值拼接完成,因此减少了ME迭代次数。通过C语言重写的HEVC编码器与HM和x265对比,在CPU Xeon E5-1603 (2.8GHz, 8线程)和GPU NVDIA tESLA C2050(448个CUDA Core)下,速度分别提升953倍和3.4倍(达到28fps),质量分别下降0.92db和0.01db。这篇论文表明CU深度决定和PU划分会大幅限制编码速度,但用GPU加速HEVC ME模块以大幅提速的方法可行。此外,运算量大、逻辑控制简单和数据依赖弱的全搜索ME算法适合在GPU上实现。与[1]稍有不同的是,[3]中的算法实现是用256个CUDA核心并行为一个64x64大小的CTU中的256个4x4的块寻找最佳MV并记录相应SAD值。相比于[1],这种并行实现可以减少任务频繁切换,提高CUDA核心利用率。与[3]中采用的方法相同,论文[10]和[11]中也使用同样的CTU并行加速方法,分别将全搜索换成钻石搜索和加入PU组合快速索引列表。

与[1]不同的是,Radicke, et al. [2](2014.01)提出了一种钻石和全搜索混合的ME算法,在中心搜索区域采用全搜索,向外扩散时采用钻石搜索,这样可以减小ME模块80%的计算量,而视频质量几乎不受影响。在HEVC的运动估计中,编码器会参考空域和时域相关块的MV(称为MVP),以MVP为搜索起点可以减少ME搜索次数,只编码真实MV与MVP的差值可以减少MV编码所需的比特,但如此这般便产生了数据依赖,它会限制不同块之间的并行。于是作者默认采用MVP等于0,这样可以根据GPU中Streaming Multiprocessor (SM)的数量决定同时并行的CTU数量。[2]中使用GPU核心并发处理尽量多的CTU,而非[1]中为一个8x8块搜索更多的位置,这样做可以减少任务频繁切换。与[1]类似的是[2]中也采用CPU+GPU的混合编码框架,GPU只用作加速ME模块。最终该混合框架编码器使HM整体提速57%,质量损失可忽略。

Kim, et al. [5](2014.07)从动态调整ME搜索范围(ASR)方向加速ME。首先使用CPU统计前一帧中MVD(实际最优MV与MVP的差值)为0的比例。如果该比例小于37%,则该帧被称作LMF,否则称作SMF。LMF和SMF的搜索范围分别为8 /11 和8 /12。统计结果显示,如果以MVP作为搜索起点,90%的情况下都能在此范围找到最优MV。与前篇文章中ME实现不同的是,[5]将ME中的整数和分数预测分别放在GPU和CPU中处理。首先使用GPU加速全搜索整数ME,并行地为一个32x32大小的CTU中的每一个8x8的块找到最优整数MV,然后用CPU进行分数ME和率失真计算。整数ME中的残差代价通过SAD(仅将残差的绝对值累加)值表示,而分数ME中的残差代价通过SATD(需要先进行Hardmard变换后再将绝对值累加)表示,此外分搜索之前还需要差分出参考像素,实际的搜索过程却较为简单,因此这种逻辑复杂、运算简单的计算适合在CPU上进行。与未加入搜索范围动态调整的ME相比,ASR算法使该模块提速54%。再使用GPU加速后,ME模块相比于测试模型中的全搜索提速1446倍, 并且质量损失可忽略。论文[9]中也加入了动态搜索范围算法,只是根据参考帧中的对应位置CTU中的搜索范围进行调整。

除了NVDIA的CUDA框架,OpenCL+AMD的组合也可以用来加速ME。Wang, et al. [8](2014.10)基于OpenCL框架在x265的基础上,用GPU加速了ME模块。与[3]中的方法类似,用GPU全搜索的方法为一个64x64 CTU并行处理256个4x4大小的块,通过拼接SAD值为不同尺寸的PU求得最佳整数MV。为了解除MVP对并行编码造成的影响,作者默认使用MVP等于0。最佳MV的选择是根据SAD值还有对应MVD编码比特数(因为MVP等于0,所以MVD等于MV本身)。这个求得的最佳MV被称作AMV,它并不是真正的最佳MV,因为MVP并未参考空域或时域相关MV值。为了减小此处MVD产生的误差,作者使用CPU以AMV为起点,在8x8的范围内结合实际MVP(空域或时域相关块的MV值)重新搜索最佳MV,以此修正该误差。这种利用GPU预估计的算法减少了并行依赖造成的影响,并且保证了视频质量不下降。该论文参考的HEVC编码模型是x265, 可见基于开源编码器x265的GPU并行加速可行。

 

 

 

总结

上述文献检索说明使用CPU+GPU异构框架加速HEVC可行,并且可以基于CUDAOpenCL框架。论文大多采用GPU加速HEVC编码器中的ME模块,且基于HMx265修改。他们为了充分利用GPU的高并行性和高密集计算能力,主要通过解除数据依赖(设置MVP0)、设置逻辑简单的搜索算法(全搜索或钻石搜索)和避免不必要的搜索计算(拼接PU和动态调整搜索范围),最终都使HEVC编码器整体提速50%以上。

如果进行GPU加速HEVC开发,可以参考他们的实现平台和算法。




References

[1] Xiang-wen Wang; Li Song; Min Chen; Jun-jie Yang, "Paralleling variable block size motion estimation of HEVC on multi-core CPU plus GPU platform," in Image Processing (ICIP), 2013 20th IEEE International Conference on , vol., no., pp.1836-1839, 15-18 Sept. 2013

[2] Radicke, S.; Hahn, J.; Grecos, C.; Wang, Q., "A highly-parallel approach on motion estimation for high efficiency video coding (HEVC)," in Consumer Electronics (ICCE), 2014 IEEE International Conference on , vol., no., pp.187-188, 10-13 Jan. 2014

[3] Xiantao Jiang; Tian Song; Shimamoto, T.; Lisheng Wang, "High efficiency video coding (HEVC) motion estimation parallel algorithms on GPU," in Consumer Electronics - Taiwan (ICCE-TW), 2014 IEEE International Conference on , vol., no., pp.115-116, 26-28 May 2014

[4] de Souza, D.F.; Roma, N.; Sousa, L., "Cooperative CPU+GPU deblocking filter parallelization for high performance HEVC video codecs," in Acoustics, Speech and Signal Processing (ICASSP), 2014 IEEE International Conference on , vol., no., pp.4993-4997, 4-9 May 2014

[5] SangMin Kim; Dong-Kyu Lee; Chae-Bong Sohn; Seoung-Jun Oh, "Fast motion estimation for HEVC with adaptive search range decision on CPU and GPU," in Signal and Information Processing (ChinaSIP), 2014 IEEE China Summit & International Conference on , vol., no., pp.349-353, 9-13 July 2014

[7] Tse Kai Heng; Asano, W.; Itoh, T.; Tanizawa, A.; Yamaguchi, J.; Matsuo, T.; Kodama, T., "A highly parallelized H.265/HEVC real-time UHD software encoder," in Image Processing (ICIP), 2014 IEEE International Conference on , vol., no., pp.1213-1217, 27-30 Oct. 2014

[8] Fan Wang; Dajiang Zhou; Goto, S., "OpenCL based high-quality HEVC motion estimation on GPU," in Image Processing (ICIP), 2014 IEEE International Conference on , vol., no., pp.1263-1267, 27-30 Oct. 2014

[9] Juncheng Ma; Falei Luo; Shanshe Wang; Siwei Ma, "Flexible CTU-level parallel motion estimation by CPU and GPU pipeline for HEVC," in Visual Communications and Image Processing Conference, 2014 IEEE , vol., no., pp.282-285, 7-10 Dec. 2014

[10] Radicke, S.; Hahn, J.-U.; Qi Wang; Grecos, C., "Bi-predictive motion estimation for HEVC on a graphics processing unit (GPU)," in Consumer Electronics, IEEE Transactions on, vol.60, no.4, pp.728-736, Nov. 2014

[11] Falei Luo; Siwei Ma; Juncheng Ma; Honggang Qi; Li Su; Wen Gao, "Multiple layer parallel motion estimation on GPU for High Efficiency Video Coding (HEVC)," in Circuits and Systems (ISCAS), 2015 IEEE International Symposium on , vol., no., pp.1122-1125, 24-27 May 2015


0 0
原创粉丝点击