本系列记录使用GPU作为计算设备辅助传统视频压缩(H264/HEVC/VVC等)的相关论文,GPU可能用于视频压缩的某个中间环节也可能用于压缩整流程。

论文:

《Multiple Layer Parallel Motion Estimation on GPU for High Efficiency Video Coding (HEVC)》

原文链接:

Multiple layer parallel motion estimation on GPU for High Efficiency Video Coding (HEVC) | IEEE Conference Publication | IEEE Xplore

速看创新点:

除了CTU的并行策略,本文还提出了PU和MV的并行策略

目录:

摘要

1. 简介

 2. 编码框架

3. 提出的GPU上的ME应用

A. CTU层并行

B. PU层并行

C. MV层并行

 4. 实验结果


摘要

本文提出了用于HEVC的GPU版多层并行运动估计ME框架。框架为分层结构,包含四层:编码树单元CTU,预测单元PU,运动向量MV选择和指令优化。PU层上,各类PU大小的通过SAD(sum of absolute difference)查询表获得。伴随MV选择,使用GPU比较指令避免分支。同时CTU处理和SIMD(单指令,多数据)优化也提升了性能,实验表明提出的框架可以完全利用GPU的优势获得90倍的速度提升相比HM10.0的快速ME模式。

1. 简介

HEVC相比H264在获得更好压缩效果的同时压缩复杂度也增长了,有研究者通过利用SIMD指令集或者低复杂度的率损失函数优化性能,但是效果有限。在编码方面,运动估计ME占据了一半以上的编码时间,一个更高效的减少ME时间的方法是使用GPU。

GPU最初设计用于图形绘制,由于其高度并行化成为了一个计算强大的工具。现在大多数GPU支持一般的计算接口。比如,开发者可以用CUDA编码使用NVIDIA的GPU。同时,开源计算语言OpenCL也可以用于完成一般的计算任务。

由于ME可以并行计算,越来越多的研究者开始使用GPU对其优化,[5]提出了CUDA上的完整ME搜索算法,达到了10倍加速。[7] 对ME进行并行优化,在H264上获得90倍性能提升。[8]提出在GPU上进行HEVC的完整搜索ME和快速模式决策,但是也有很明显的损失。

本文,提出了CPU和GPU联合编码框架。编码时,ME在GPU上进行,并且提出了快速PU生成方法,不同于早前的不同PU大小的渐进式损失合成,快速PU在一个CTU上并行计算所有PU的运动估计。使用该框架,PU的运动估计可以同时进行,因此实现了四层并行运动估计。如图1所示,实验结果表明提出的方法相比HM10.0快速ME模式可以获得90倍的几乎无损压缩。

本文后续安排如下:第二章节提出了ME四层并行框架,第三章节讨论GPU上的ME实现,第四章节是实验结果。

Android GPU内存 压缩_运动估计

 2. 编码框架

本文提出的GPU多层编码框架如图1所示。GPU可以高效处理大量数据,但是缺乏处理多逻辑民工领的能力,比如模式决策。所以GPU仅仅在每个CTU单元内完成了所有可能预测单元的运动估计,同时CPU处理了大量模式决策、变换、量化、熵编码和环路滤波。

本文的框架中,CTUs拆分到组 同时减少同步点, 组的大小根据编码器配置设置,可以从1到帧的宽度。越大的组表明左侧的MVP无法使用 因为邻域的PUs会同时处理,越小的组意味CPU和GPU之间需要更多的交互同步因此拖慢了编码处理过程。经过大量的实验,选定一个合适的组大小。

.GPU上ME的并行化可以分为四层,1)上层以CTU为单位进行并行化。通过禁止左侧CTU的运动向量预测MVP,一行CTU的运动估计可以同时进行。2)另一个重要的层是PUs,通过设置顶层CTU的所有PU的MVP得到,同时使用了一个新的损失合成框架。3)搜索多MVs并行化在GPU运动估计应用中很常见,带来了很好的加速效果。4)底层是SIMD视频指令优化为了进一步加速ME过程。

和CPU进行ME处理过程相似,提出的框架由整数像素的运动估计IME和分数像素的运动估计组成FME。由于每个子像素要用于几十次、成百次的搜索,在所有CTU组进行FME之前需要进行插值。

3. 提出的GPU上的ME应用

Android GPU内存 压缩_运动估计_02

HEVC中的递归四叉树结构和非对称模式拆分AMP如图2所示。HEVC中帧间预测有更多的拆分模式,因此用分层的方式合成小的CU编程并不友好。这种方法也增加了PU之间的依赖性。解决该问题的一个新方法是实现PU层的并行化,通过使用一个index表和一个SAD查询表(如图3),该模式表的每一个元素由四元素组成(L,T,R,B),代表位置和一个确定PU的大小。有了该框架,就可以进行GPU上的高效多层并行运动估计。

A. CTU层并行

核心为CTU组大小的设置:

并行编码框架中,CTU相继的按照组进行处理。GPU方面,一组的CTU可以同时并行处理;CPU方面,一个CTU组的模式决策和编码器的其他步骤需要在所有PU完成ME之后进行。

CTU的数量需要每次处理影响了处理速度和估计准确度。一方面,更多的CTU同时并行处理GPU利用率高,就会有少的平均时延。最快的情况下,一个参考帧中只有一个同步点在ME中,另一方面,每次处理更少的CTU带来了更高的编码效率(注:每次处理越少,可参考的CTU块就更多,视频压缩效果就更好,但是更慢),因为运动向量估计可以带来明显的编码收益,但是这需要前序的CTU运动信息结果。当PU层的并行开启时,相同CTU的邻域PU也可以同时处理,意味着当前CTU无法获得MVP。因此本文提出的算法中,只有邻域CTU的MVP可以使用。为了权衡速度和编码效率,CTU组大小设置为帧的CTU宽度。通过这种方式,上述CTUs中的MVPs在GPU上进行简单的逻辑处理。在后续的全运动估计中,平均两个16x8大小的PU是最好的IMVs(作为一个CTU中所有PU的搜索中心)。因此编码效果损失低于3%

B. PU层并行

HEVC中四叉树编码单元结构使小的PU合成较为困难。因此,本文提出了新的框架通过引入模式index表,如图3所示。PU的大小从4x4~32x32,总共有10中不同的大小和169不同的PUs(假设非对称模式拆分),通过扩展这个表,更多图2可能的PU模式可以同时进行搜索。

如图3所示,模式index表的每一项由4个数字组成。比如,index17模式记录的值为(0,4,1,6),其中1个单位表示宽或者高的4个像素,所以index 17意味着在一个CTU中的位置从(0,16)到(4,24)的PU,该PU的大小为4x18,标记在图3的右侧浅绿色区域。为了减少分支和线程平衡负载,index表的分配遵循如下原则:1)越小的PU分配在越低的位置;2)PU邻域在一起。

Android GPU内存 压缩_gpu_03

PU层的并行化实现通过使用SAD查询表。为了获取用于MV的并行化的每个PU形变,首先每个4x4块D4x4的SAD使用公式1进行计算并存储在8x8的表中,比如图3右侧。之后对从左上角(0,0)的点到当前点(M,N)按照公式2所有的4x4块SAD求和。最后,每个PU在位置(L,T,R,B)形变损失可以通过公式3得到。

Android GPU内存 压缩_gpu_04

C. MV层并行

运动估计时,不同MV的形变可以同时在GPU上计算。但是减少MV的数量是GPU的瓶颈,因为GPU不擅长处理传统ME中需要的分支指令。在提出的方法中,减少MV是通过结合MV损失代价得到的。如图4所示,获取一个PU的不同MV损失,安排更高位置的形变为32bit,下方为MV成分。然后,通过GPU组小操作,越小代价的MV将会通过一系列比较保留。

遵循IME和FME的特征,MV级别的并行处理如下:

1)整数级运动估计IME:每个CTU的IME在CUDA的独立线程块进行。首先,至多64个组构成的线程被分配用于同时计算64个MV的SAD。在每个线程组中,8个线程用于计算一个特定4x4 CU的SAD,所以512个线程同时活动。之后通过对每个表中的值求和获取用于快速代价损失的生成的SAD查询表。之后,由PU的SAD和2次MV差分值MVD作为率损失函数的估计值,对比不同的整数运动向量IMV来选择每个模式的最优IMV

2)分数级运动估计FME:FME在每个CTU进行IME之后进行。该过程中,每个PU的FME独立进行因为不同的PU有不同的最优IMV,同HM中的FME操作,搜索过程由1/2像素的MV矫正和1/4像素的MV矫正组成。每一步搜索25个点,其中有9个在之前的步骤中已经检查过。所以只有剩下的16个点,如图5的左侧的9~24需要在每次矫正步骤中检查。

当一个CTU中的所有PU的FME步骤完成,所有的CTU的最优MV返回到系统内存中用于CPU进行模式决策。

Android GPU内存 压缩_计算机视觉_05

Android GPU内存 压缩_运动估计_06

 4. 实验结果

实验对比程序为HM10.0,CPU为Intel Core i5 760, 4G RAM and GTX 480

实验中,最大的CTU设置为32x32 ,由于GPU限制AMP关闭,从测试序列B到E测试100帧,使用低延时P配置,如表1,编码时间对于所有序列获得了3倍速度提升,当搜索范围SR【-32,32】,获得了32倍的加速,当SR设置为【-8,8】获得了170倍速度提升。

当并行只在CTU曾进行时,可以获得10倍加速。

Android GPU内存 压缩_运动估计_07

Android GPU内存 压缩_视频压缩_08