利用高AVC结构设计H.264/AVC解码器的动态补偿模块:H.265解码器
摘要:在本文,我们提出了一个基于分块聚类的方法来减少H.264/AVC解码器里面的动态补偿模块存储器存取的次数。利用将在一个宏区块内可能重用的4×4单元块分组来分享载入的参考数据,而存储器存取的次数能被有效地减少到平均70%。此外,在访问外部SDRAM时采用指令重新排序减少预充电(Precharge)/激活(active)的次数可以达到原来的6 0%。从我们的仿真结果可以看到,处理一个宏区块总的存储器存取的次数低于4 00次。这个方法对动态补偿模块硬件设计的不同面积大小的内部存储器是可调整的。
关键词:分块聚类;动态补偿;H.264/AVC解码器;SDRAM;宏区块;指令重新排序
1 简介
H.264/AVCm比较过去其他的标准,特别支持了亚像素(sub-pixel)帧间预测解码以及变尺寸块(variable block aize)动态补偿来达成更好的编码效率。然而,变尺寸块动态补偿也造成需要使用较高的存储器带宽的问题。举个例子,对一个1920×1080@30fps格式的H.264/AVC比特流解码,动态补偿需要388MBps的存储器带宽来处理所有的4×4单元块。基于我们的仿真结果看来,动态补偿模块在整个H.264/AVC解码过程里占了超过70%的存储器带宽。
多项研究提出减少动态补偿带宽需求的办法。一般来说能够分为两大类:利用减少外部内存访问次数以及利用减少外部内存访问延迟。Tsai et al.提一种重复使用加窗插值(interpolationwindow)方案来分享同一个分区里重叠数据。然而,这个办法当临近的单元块是不同的运动矢量时,不能重复使用参考数据。Zhang et al.根据编码器的“模式抉择”来重复使用参考数据,但是这个重叠的参考数据在P_4×4模式(也就是说四个具有不同运动向量的4×4单元块)是无法被重复使用的。Zhu et al.提出一种针对H.264解码器优化的SDRAM控制器来减少因为预充电/激活所引起的泡沫循环(bubble cycle)。然而如果SDRAM被其他模块分享的话,专用的SDRAM控制器将很难整合到系统内。几种基于快取(cache)的设计也被提出,以减少存储访问延迟,然而这样的设计增加了芯片内存储器的面积。
本文提出了一种基于分块聚类的方法来减少存储器访问次数,也就是说在一个宏区块内,我们以4×4单元块为基本处理单元,并尽可能重复利用所载人的参考数据来减少存储器访问次数,如果选择64字内部存储器,存储访问次数平均可以减少到70%。
此外,我们知道因为访问SDRAM里面同一个块(bank)不同的行(row)一定要做预充电/激活的动作,通过一种指令重新排序的方法来减少SDRAM预充电/激活的频率在本文也被使用到。这个方法降低的比例平均在60%。处理一个宏区块总的存储器存取的次数低于400周期(包括了外部与内部的存储访问)。
2 问题陈述与分析
在H.264/AVC解码器的硬件设计中,动态补偿模块的高存储带宽需求主要来自6-tap亚像素帧间预测解码以及变尺寸块等因素。为了解决变尺寸块因素,一个典型的做法就是基于4×4的处理单元做补偿设计。一般来说,处理一个4×4的单元块需要为了内插而载入9×9像素,这就需要1296次访问来载人参考数据(如9×9×16)。表1总结了对于不同的宏区块分区类型(P)相应的参考数据载入周期(r)。一般来说,相较于4×4分区类型而言,愈大的宏区块分区类型需要较少的参考数据载人周期(就是较小的α)。例如,相较于处理16个4×4单元块的载人周期,处理1个16×16单元块只需其34%。
由于处理4×4宏区块分区类型需要极高的加载周期,如何分享4×4宏区块分区类型间的参考数据是极重要的。表2总结四个分离的4×4单元块在z扫描顺序(Z-scan order)下必要的参考数据大小,其中W_p8和H_p8是根据相应的运动矢量得到的平均宽度和高度。
图1描述一个例子,其中W_p8是10而H_p8是9。注意到由于6-tap插入的原因,实际载人的参考大小将会是15×14。
如表2所列,平均参考大小接近8×8。这说明了重叠的参考数据能被重复使用以减少前述过高的载入因素(也就是说α是减少的)。表3进一步总结了变块尺寸的百分比。P_skip和P_16×16模式占了超过50%。由于16×16宏区块分区类型相较于4×4宏区块分区类型的低数据载入周期,是非常值得去分享所有重叠的参考数据。
3 我们所提出的高效带宽架构
为了支持变尺寸块从4×4到16×16分区类型的数据重复使用,我们提出了一种基于分块聚类的方法对每次数据交易重复使用载人的参考数据,来减少H.264/AVC解码器里面的动态补偿模块存储器存取的次数。此外,使用指令重新排序的方法来降低预充电/激活频率。
3.1 基于分块聚类的方法
图2说明基于分块聚类方法的数据流。为了最大化内部存储器对载人参考数据的重复使用,每笔交易(transaction)的大小都会被z扫描顺序内4×4单元块检查,也就是说在参考数据左上方跟右下方位置会被每个4×4单元块更新以决定所需要交易的大小。一旦需要交易的大小大于内部存储器的大小,目前正被检查的4×4单元块将不能被放入,这就需要另一个交易,比如图2所示第7个4×4单元块跟第12个单元块。
图3描述基于分块聚类方法的流程图。在每个宏区块里,每个4×4单元块的运动矢量以及参考指数信息被用于更新所需要的交易大小(也就是trans_slze)。如果需要更新的交易大小大于内部存储器大小,目前正在被检查过的4×4单元块将不会被参与到这次的交易,而且交易的大小也被决定了。此外,为了保持每笔交易高度的数据重复使用率,一个4×4单元块所能增加的交易大小上限设定成32字(即Const设定为32)。也就是说,更新的交易大小也会被32倍的累加4×4单元块数目所检查。
参考过去的研究,根据在两个物理像素之间亚像素的luma位置,16种luma的分数位置(fraction position)能被区分为4大类用以降低存储访问次数。这个方式也在我们提出的办法里被实现来优化交易大小。表4描述水平运动信息的进程,MVX最终由于P_16×16和P_Skip模式相对低的载入周期(也就是α值较低),一个特制的控制器用于支持16×16宏区块分区类型进程。如果使用64字的内部存储器,一个16×16单元块的重叠数据能够被完全的重复使用(也就是在设计4×4单元块模块中,以28字储存重叠数据,36字用来储存所需用来内差的参考数据)。
3.2 降低预充电/激活频率 为了降低由SDRAM预充电/激活所造成的存储访问延迟,我们应用了一种指令重新排序的方法。一般来说SDMC Iprn能安排SDRAM访问的命令来隐藏预充电/激活这类的命令,例如一个访问不同块中不同的行,然而对同一个块访问不同的行仍旧会造成预充电/激活的开销。在我们的仿真里可以发现,由于两个交易的不连续,例如图2里的交易1跟交易2,大部分预充电/激活命令来自交易的第一个命令。如图4例子所示,由于访问同一个块里不同的行,在两个交易需要预充电/激活的命令。为了减少预充电/激活的问题,我们应用了一种指令重新排序的方法来处理每次交易的第一个命令。
如图5所示,交易2的第一个命令是由前一个命令的块跟行检查(也就是bank_prey和row_prey)。利用前两个命令间选择合适的命令,预充电/激活的频率能被大幅减少(平均大约减少到60%)。
3.3 总体架构展现
动态补偿模块的总体架构展现可见图6。基于分块聚类方法用于决定每个必要的交易大小。在执行指令重新排序的方法后,DMA模块发出访问外部存储器的命令。搬入的参考数据存在内部的存储器而且被内插单元使用。为了达到高吞吐量,内插的单元内部实现了4对6-tap滤波器以及2-tap双线性硬件设计。
图7说明产生内插数据的6-tap内插滤波器设计架构图。在载人所需要的参考数据到寄存器后,6-tap内捕滤波器在每个周期产生输出的数据。内插单元内吞吐的瓶颈由内部存储器的访问次数所决定了。在一个宏区块内部存储器的访问次数最糟的情况是192(也就是16*(9+3))次。
4 仿真结果
这里要说明如何验证先前提到的算法?要评估我们所提出的做法效能好不好需要有一个黄金参考来作比对,我们利用修改H.264/AVC参考软件JM9.2解码器来仿真动态补偿的存储访问特性。我们会修改JM 9.2解码器来配合我们提出的算法,加载上外部内存控制器的c模型,里面主要的功能是比较提出的方法与以4×4单元块为处理单元方法的内存访问次数,并且计算访问外部内存预充电/激活的次数。再利用Visual c++编译c模型产生可执行档,可执行档可以输入测试序列再产生UV格式的结果。6个不同帧大小的测试序列列在表5(其中,量化参数设成28)。
经由设置内部存储器大小到64字,对4×4单元块每一起交易的平均值是10.46,这意味着表1(58%减少的部分)归一化的参考数据载人周期(α)小于42%。此外,利用根据亚像素luma位置优化交易大小,能降低平均频宽到70%。应用了一种指令重新排序的方法,预充电/激活的频率也能被大量减少,其中内存地址映像是依照行,块,列地址来配置(也就是从MSB到LSB)。图8显示对不同内部存储器大小的仿真结果,如果内部存储器使用大于64字就能完全重复使用16×16单元块里面重叠的参考数据。因此,存储访问次数降低的比例就大幅提升了。我们得到当内部存储器大于64字的大小时,预充电,激活平均减低到趋近60%。最终,对每个宏区块包括外部跟内部存储器总的访问周期少于400次。
5 结论
本文提出的基于分块聚类的方法能够设计出高效带宽的动态补偿模块。为了减少访问存储器的延迟,我们应用了一种指令重新排序的方法来大量的减少预充电/激活频率。我们看到对每个宏区块,包括外部跟内部存储器访问总的访问周期少于400次。
