hevc CTB并行
H265/HEVC中采用了波前并行处理(WPP)算法来进行CTB级的并行,对于CABAC熵编码,当entropy_coding_sync_enabled_flag为1时,CABAC上下文模型会在每一行的结尾处进行更新,这使得熵编码和熵解码的CTB级并行成为可能,当进行波前并行处理时,多行CTB被分别送到不同的运算单元中进行处理,但是由于相邻CTB之间的依赖性,这些运算单元不能同时开始运行,除了解码第一行CTB的线程外,每一个线程都要比上一个线程落后两个CTB进行解码,这也就意味着所有的运算单元不可能同时结束,这会造成并行效率的降低,尤其时当运算单元数较多的时候更为明显。
尽管在线程数量较多的时候,CTB级别的并行的效率有所降低,但是CTB级并行处理相对于其它并行方式还是有很多的优点,首先CTB级并行有较好的扩展性,随着图像分辨率的增加,CTB级并行的线程数也可以很方便的增加,其次,相对于其它层级的并行方式,CTB级并行的线程数也可以更好的实现负载均衡,由于分配给各个运算单元的数据信息量是较少的,因此各运算单元的运算时间不会有太大的差异,因此很容易实现负载均衡。
然而CTB级的并行也存在一些缺点,首先是熵解码的上下文模型更新的问题,在进行熵解码之前,CTB单元是无法区分的,因此必须先进行熵解码,再进行之后的图像处理,但是CABAC熵解码的概率模型需要参考从上一个更新点以后所有的码流信息,而我们无法保证在每一行CTB的开头都有一个更新点,这样波前并行处理算法就无法在CABAC熵解码部分实现,我们只能分别进行熵解码和并行处理,根据CABAC上下文模型的更新位置,我们可以确定CTB级并行的起始位置。如果CABAC上下文模型在Slice开头处更新,那么我们就可以将该Slice送入并行过程,该Slice的不同CTB行被交给不同的运算单元,利用波前并行处理算法进行解码,直到该Slice的解码结束。
其次是CTB级并行无法保证输出码率的稳定性,根据波前并行处理算法,在并行处理开始时,满足依赖关系可以进行解码的CTB数目是较少的,码率较低。随着解码的进行,越来越多的运算单元启动,码率开始增大,直到达到最大值,在解码 达到尾声时,解码运算单元又会逐个终止,这样码率优惠逐渐减小到0,这样以来,CTB级并行处理就无法达到恒定的码率,而且还会造成并行效率的下降。
针对上述问题,人们提出了一种叫做重叠波前并行的方法,来减少并行过程中由于线程增加和减少所带来的并行效率下降。在最初的波前并行算法当中,如果一个运算单元处理完一行CTB之后,在当前图像中在整幅图像解码完成之前,该运算单元会一直处于等待状态,之后,对于下一幅图像,波前并行算法会重新开始,而在重叠波前并行算法中,在图像的运动矢量足够小的情况下,一个运算单元处理完一行CTB之后,如果当前图像中没有剩余的CTB行可以交给它进行处理,该运算单元可以直接开始对下一幅图像的处理而不用等待整幅图像解码的完成。
共有6个运算单元来对当前图像进行波前处理,当线程T4完成对分配给它的CTB行的解码后,会发现当前图像中已经没有满足条件的提前运动矢量要足够小,对于前一幅图像,前4行CTB时解码完成了的,因此它们可以作为后幅图像的参考,后幅图像的最大运动矢量不能超出这4行CTB的范围,否则可能会导致后幅图像解码时缺少参考信息。重叠波前并行处理不能完全使得并行解码时的线程数恒定,但是它可以较为有效的解决由于线程数增加和减少所带来的并行效果下降的问题。
T5 | |||||||
T6 | |||||||
T2 | |||||||
从数据结构上来看,CTB级并行和Tile级的并行可以是同时实现的,可以将一幅图像划分为4个Tile,每个Tile交给一组运算单元来处理,而每组运算单元按照CTB级并行的方式可以并行处理3行CTB,这在理论上来说是比单纯进行CTB级并行或者Tile级并行效率更高。但是同时实现将会造成线程数大幅增加,复杂度和码率都会急剧上升。过多的运算单元之间进行通信将会占用较多的资源,而且,就每个运算单元来看,其所分到的数据信息量将会很少,负载均衡难以实现,利用率降低,因此H265/HEVC中没有提出CTB级和Tile级同时并行的方案。
总结
以上是生活随笔为你收集整理的hevc CTB并行的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 机器人仿真控制(以ABB为例)
- 下一篇: 蓝桥杯C/C++程序设计 往届真题汇总(