本系列记录使用GPU作为计算设备辅助传统视频压缩(H.264/HEVC/VVC等)的相关论文,GPU可能用于视频压缩的某个中间环节也可能用于压缩整流程。
论文:
《Flexible CTU-level parallel motion estimation by CPU and GPU pipeline for HEVC》
原文链接:
速看创新点:
文章统计HEVC各环节耗时,其中运动估计占67%耗时,因此使用GPU辅助运动估计,具体为GPU上进行运动估计得到运动向量MV和绝对差异和SAD,其他由CPU完成。
目录:
摘要
高效视频编码编码器HEVC中,运动估计ME占用了超过50%编码时间。为了减少HEVC中ME模块的复杂度,本文提出灵活编码单元CTU级别的并行ME方法,通过结合CPU和GPU。首先,提出了一个GPU上高度可扩展的CTU级别的并行运动搜索框架,并行的CTU组可以设为任意大小去适应可变的序列分辨率和硬件配置;之后,运动搜素区间可以基于运动密度自适应的适应。因此,在低速运动场景可以避免GPU浪费,同时还能保持在高速运动场景的性能。实验结果表明提出的方法相比CPU在HM10.0上减少了73%时间。
1. 简介
HEVC标准相比H.264获得了更高的压缩效果,不过,由于ME中有更多可选编码块大小编码器复杂度要高的多。特别的,ME模块相比HEVC编码多了50%的编码时间。如图1所示。
ME是一个编码器端的块匹配算法BMA,块匹配算法是寻找参考帧中最匹配的预测块。一般来说,有两类搜索算法可以获取这样的预测块。第一类是完全运动搜索:通过搜索搜索窗的所有点,简单但是更耗时;第二类是快速运动搜索:通过若干迭代搜索若干点,所以比第一种要快,大多数软件编码器也使用的是第二种。但是,对于硬件平台和混合计算(CPU+GPU计算),第一种方法更合适因为更有规律。
近年来,由于GPU处理能力的快速发展,使用GPU辅助CPU处理成为了很强的趋势。幸运的是,NVIDIA发布了GPU优化的程序叫做"统一计算设备架构"CUDA进行大量的并行处理。因此,ME在CPU+GPU平台的并行处理是可以研究的。[5] 提出了H.264/AVC+GPU中块级别的并行框架用于ME可变块大小,相比CPU架构速度提升了12倍。[6]ME加速方法基于GPU的diamond搜索自适应,计算时间也显著降低。
本文提出了一个CPU+GPU的CTU级别的并行ME算法用于HEVC。处理框架中,CTU中的可变块大小预测单元PU处理仅用一个CUDA线程块(如图2),由GPU系统进行调度,所以同时处理CTU数量可以配置成任意大小。然后,每次进行自适应的运动搜索当开始GPU计算时,根据前面编码块的运动强度。该策略可以进一步减少慢速运动场景的ME复杂度。最后,运动向量MVs和对应的损失SAD(绝对差异和)由GPU返回,并由CPU来辅助计算。
本文剩余结构如下:章节2描述HEVC中的ME,章节3描述CPU+GPU的ME并行方法细节,实验结果和分析在章节4。
2. HEVC中的运动估计概览
HEVC编码器中,帧间编码单元CU可以拆分为多个帧间PU,如图3所示,每个PU都有自己的参考帧和对应的运动向量MVs。每个PU的运动参数可以通过空间邻域或者时序邻域PU的"SKIP"或者"MERGE"模式继承,或者通过计算参考帧的运动估计(其他帧间模式)。然后,通过最小率失真RD代价函数选择最终CU的编码模式。RD损失函数公式如下:
其中SSD指的是原始块和预测块的均方差之和。R指的是用于编码预测残差和运动参数的比特数,lamda是朗格朗日乘子决定比特率和失真率的权重。
为了找到特定帧间模式的最优参数,首先运动向量预测器MVP从一组MV候选中得到,然后对于排除"SKIP"和“MERGE”的帧间模式 进行运动搜索算法。HM编码器中,在开始MVP时进行整数级帧间准确性搜索,基于SAD准则(公式2)选择一个最优位置。然后在第二步时,进行分数级的矫正来生成最终的1/4级别的准确MV,这里基于绝对变换差分和SATD准则(3)。
上面两个公式的lamda分别是SAD和SATD的拉格朗日乘子,Rpred是MV的近似比特率。
3. 提出的并行运动估计框架
一般来说,GPU上的ME并行处理是通过MV和PU大小 进行ME计算,并将其分给每个流处理单元中,同时CPU处理其他的编码任务。因此,这个CPU和GPU流程框架可以减少ME编码时间。但是,并行依赖于硬件配置,如硬件核数和内存,早前的ME并行方法无法方便的增加或减少目标硬件上并行数据的大小,这是因为数据结构固定。此外,由于固定搜索方式,对于慢速场景这些方法会有额外的GPU搜索时间。本文的设计是将这些问题通过设置可变大小的并行CTU组解决(后面的CTU窗)和自适应的搜索范围。
A. 可变并行CTU窗
我们的方法使用CUDA编码架构实现,如图2所示,线程在一个block中分配,block在grid中分配。在一个block中的所有线程共享同样的“共享内存”,无论一个grid中有多少block,他们都自动由GPU系统调度。基于这个特性,我们在一个block应用一个CTU的ME,所以CTU窗口可以分配为任意大小通过一个grid中的block数量对应,如图4:
当CTU窗口的长度确定后,序列中的每一帧作为CTU窗口流程编码,如图5所示,其中N是CTU窗口的数量。开始 ,原始帧从CPU传给GPU,然后第一个CTU窗口并行ME处理就开始了,然后CPU和GPU同步 用于CTU第i窗中的所有PUs的MV和SAD 的信息。之后,CPU执行模式选择和其他编码任务,同时GPU开始处理第i+1窗。最后,当最后一个CTU窗CPU处理完成,完整的重建图传输给GPU用于插值和保存为新的参考帧。
B. MVP和运动搜索
在GPU侧进行运动搜索以前,使用公式4和5,从4个16x16的PU单元得到MVP
其中,ColMV指的是参考CTU中的4个16x16 PU的平均MV。CurDPoc/ColDPoc是当前/同位图和参考图片序列计数POC差异。此外,如果同位图不存在,上面的CTU来替代。
对于整数级别的MV搜索,可变块大小SAD生成和比较开始于4x4块并扩展到更多的大小[5]。之后,在最优整数MV位置附近进行分数级的MV矫正。
C. 自适应运动搜索范围
GPU采用的完整搜索框架和3个目标优化搜索范围(整数级单元)分别是:8,16,32。搜索范围更小,并行ME拥有更低的复杂度,但是预测性能也越差。对于慢速运动区域比如背景部分,小的搜搜范围足够。
基于时序相关性和同位块用来判断下一个CTU合适的搜索范围。CTU窗中的每个CTU都会遍历到,对于确定CTU,定义MVC为PU包含luma像素位置的MV相对于左上角同位CTU的luma,进行如下判断:
- 对当前CTU窗口默认分配搜索范围8
- 同位CTU的拆分深度大于0时 |MVC|大于16,然后对当前CTU窗分配搜索范围16
- 如果 |MVC|大于32,对当前CTU窗口分配搜索范围32并且退出遍历。
D. GPU计算信息用于模式决策
由GPU返回的可变块大小的MV和SAD信息不仅可以提供ME的运动参数,还可以对帧间编码单元CU辅助快速模式决策。如下是原始的HM中的模式决策的修改
- 使用early skip检测MERGE/SKIP和PART_2Nx2N模式
- 定义sad2Nx2N作为2Nx2N PU单元的SAD , sad2Nx2N/sadNx2N 分别作为当前CU的两个2Nx2N/Nx2N PU的SAD和,如果sad2NxN > t0*sad2Nx2N 或者sad2NxN> t1*sadNx2N,那么选择skip PART_2NxN模式;类似的做法选择PART_Nx2N模式。阈值t0和t1依据经验选择
- 对于INTRA_2Nx2N模式,首先计算从原始粗模式决策RMD和最可能模式MPM中选择的最优SATD帧内模式计算得到的SAD,称为sad Intra_2Nx2N模式,阈值t2按照经验选为0.5
- 对当前CU基于率失真代价函数选择最优模式。
4. 实验
实验对比程序为HM10.0,CPU为 AMD Phenom (tm) II X4 830 CPU Processor @ 2.80 GHz plus GPU为 NVIDIA GeForce GTX 560 Ti GPU. CUDA驱动版本为5.5 and the CUDA capability版本是 2.1.
表一可以看出本文提出的方法节省了差不多大约70%时间,差不多2.1%性能损失。