HEVC/H.265的DCT变换和反变换的SIMD优化方法与流程

文档序号:11601926阅读:1167来源:国知局
HEVC/H.265的DCT变换和反变换的SIMD优化方法与流程
本发明涉及视频编码技术领域,具体地,涉及一种HEVC/H.265视频编码标准的DCT变换和反变换的SIMD加速优化方法(基于Tilera平台),利用Tilera的SIMD指令集实现HEVC的DCT变换和反变换模块,提高运行速度。

背景技术:
随着视频内容的增长和视频产品的迅速发展,视频内容产业链面临更大的压力,目前AVC(AdvancedVideoCoding)视频压缩技术已经不能满足视频传输的要求,更高效的视频压缩技术应运而生。不仅如此,未来视频市场趋于更高水平的要求已经超出了目前AVC编码能力的范围,比如3DTV和4KTV。对于4KTV,即使使用目前H.264方式编码,也需要24-32M码率,AVC已经成为4KTV业务发展的瓶颈。在此背景下,高效视频编码(HighEfficiencyVideoCoding,HEVC)这种新的视频编码标准应运而生。HEVC的发展最早追溯到2004年,经过近十年的发展,HEVC于2012年2月形成完整的委员会标准草案,并于2013年1月正式成为国际标准。HEVC的目标是编码效率比AVC提高50%,复杂度比AVC复杂2到10倍。HEVC未来的业务主要面向高清、超高清、3DTV,数据量比以往视频大得多,另外HEVC要求大大提高视频压缩比,而高压缩算法是以增加算法复杂度为代价的,考虑到这两个方面的因素,HEVC编码器对系统的计算性能提出了更高的要求。为降低HEVC编码复杂度,通常有算法优化、指令集优化、并行优化等方法,其中指令集优化是利用计算平台的指令集实现计算模块,SIMD(singleinstructionmultipledata)单指令多数据技术能在一个指令周期内并行处理多个数据的计算,相比于常规的实现方案能大大减少指令周期,提高运行速度,同时能保证计算结果准确无误。在视频编码中,SIMD技术广泛应用于密集数据计算,如亚像素插值、SAD、DCT/IDCT、计算残差等模块。在Tilera平台上实现HEVC编码器,我们移植了HEVC参考代码HM的DCT/IDCT实现方法,HEVC的DCT模块相比于H.264复杂度大大提升。H.264的变换系数为1和2,H.264的变换只需要简单的移位和加法计算。HEVC支持4x4至32x32的变换块,此外HEVC的DCT系数数值更大、更复杂,这意味着HEVC的DCT变化需要执行多次乘法,而且中间变量的数值更大,需要更大的位宽。在执行竖直方向的DCT变换时,中间变量的值超出了16bit的存储范围,为17-19bit,如果用32bit保存中间变量,则数据处理的并行水平大打折扣。在Intel和Arm上已有的一些HEVC的DCT和IDCT的SIMD实现方法,竖直方向的DCT变换的速度要低于水平方向的DCT变换。

技术实现要素:
针对现有技术中的缺陷,本发明的目的是提供一种HEVC/H.265的DCT变换和反变换的SIMD优化方法,所述方法针对Tilera平台上常规的C语言实现的HEVC的DCT和IDCT模块计算复杂度高、编码速度慢的问题,利用Tilera的SIMD指令集实现HEVC的DCT变换和反变换模块,提高运行速度。为实现以上目的,本发明提供一种HEVC/H.265的DCT变换和反变换的SIMD优化方法,包括如下步骤:第一步,将一维DCT输入数据从内存装载进寄存器,视为矢量数据;第二步,对矢量数据重新排列组合,执行蝶形运算,对输入数据逐级加减,计算出中间变量矢量;第三步,如果该一维DCT变换是水平方向变换,直接跳到第五步;第四步,对中间变量进行右移舍入运算,以限制其位宽;第五步,将中间变量矢量和对应的系数矢量进行点乘运算;第六步,将点乘运算的结果进行重新排列组合,执行右移舍入,输出结果保存至目标内存。优选地,所述第二步中,对输入数据的并行加减,完成蝶形运算,进行逐级多次的并行加减法,计算出用于点乘计算的中间变量矢量。优选地,所述第四步中,一维DCT变换对中间变量进行舍入预处理,为了保持并行性,达到较好的加速效果,对于竖直方向的一维DCT变换,将中间变量右移舍入使其位宽在16bit内;具体的右移计算如式(1):y=(x+(1<<(MIVO-1)))>>MIVO(1)其中:x为需要进行右移舍入的数据,MIVO为中间变量最大阶数,y是执行完右移舍入后的结果;同时,输入变量shift值也要根据MIVO做相应的调整,使其能抵消中间变量的右移舍入,shift值是DCT输出时需要将数据右移舍入的位数。优选地,所述第五步中,采用一条点乘计算指令代替多次的乘法和加法运算,有效加速中间变量和相应系数的乘积求和过程。进一步的,对于计算四个中间变量和相应系数的点乘,直接采用一条指令执行四元矢量点乘便可以完成;对于四个以上中间变量和相应系数的点乘,通过多次的四元矢量点乘完成;对于计算两个中间变量和相应系数的点乘,采用并行的乘法和加法指令完成。优选地,所述第六步中,采用并行的加法和右移运算以及数据重组,并行完成对点乘计算结果进行右移舍入操作;右移舍入计算如式(2):y=(x+offset)>>shiftoffset=(1<<(shift-1))error=2shift-1式中:x是需要执行右移舍入的数据,y是执行完右移舍入的结果;offset是用于四舍五入的补偿值,由右移位数shift推导而来,shift值由DCT变换块的大小N(4,8,16,32)和数据位宽B(8bit,10bit)推导而来,水平方向(horizontal)的shift值和N,B有关,而竖直方向(vertical)的shift值和N有关,根据shift值的不同可以用来判断一维DCT变换的方向:水平还是竖直;error是执行右移舍入操作产生的最大误差。与现有技术相比,本发明具有如下的有益效果:本发明提供的方法利用Tilera平台的指令集对Tilera的DCT和IDCT模块进行SIMD优化,实现在微弱的性能损失情况下有效加速Tilera平台上HEVC的DCT和IDCT模块。经验证,相比于普通的C代码实现方法,在使用该发明后,Tilera平台上HEVC的DCT和IDCT模块能平均减少40%-70%的指令周期数,而BD-PSNR(相同质量下的PSNR)仅有不到0.003的损失。附图说明通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:图1为本发明一较优实施例的一维DCT变换流程图;图2为本发明一较优实施例的一维IDCT变换流程图;图3为本发明一较优实施例的蝶形运算计算中间变量示意图;图4为本发明一较优实施例对中间变量进行预处理的流程图;图5为本发明一较优实施例蝶形运算中执行矢量点乘运算示意图,其中:(a)为四元素矢量点乘运算示意图,(b)为二元素矢量点乘运算示意图;图6为本发明一较优实施例对蝶形运算结果执行后续舍入操作示意图;图7为本发明一较优实施例一维IDCT中对数据进行转置变换操作的示意图。具体实施方式下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进。这些都属于本发明的保护范围。如图1、2所示,本实施例提供一种HEVC/H.265的DCT变换和反变换的SIMD优化方法(基于Tilera平台),具体实施步骤如下:步骤(1)、将一维DCT输入数据从内存装载进寄存器,视为矢量数据;具体的:从输入数据所在的内存块中批量读取数据,将相邻的多个低位宽输入数据装载进64bit寄存器,装载成一个数据矢量。步骤(2)、对矢量数据重新排列组合,执行蝶形运算,对输入数据逐级加减,计算出中间变量矢量,如图3所示;具体的:HEVC的DCT变换系数有很强的奇偶对称性,利用这种对称性,先对数据进行逐级的加法和减法,然后将其和相应的系数做乘积,这样能有效减少乘法运算,这就是蝶形运算的原理。从内存装载进寄存器的数据矢量不能直接进行加减,矢量数据需要进行一定的重新排列组合,使其符合需要的运算规则,然后执行后续的计算流程。在Tilera平台上有相应的指令,支持两个64bit数据的中任意byte的排列组合。在后续的步骤中,数据需要不断地进行排列组合,以满足相应的运算规则。随后利用并行加减指令,完成矢量的加减法,这样一次指令能同时完成多个数据的加法和减法,减少指令周期,实现加速。随着DCT变换块的增大,中间变量的计算级数也会增大,在逐级计算中间变量的过程中需要对计算结果进行重新排列和组合,使其满足后续运算规则。步骤(3)、如果该一维DCT变换时水平方向变换,直接跳到步骤(5),如图4所示;具体的:水平方向和竖直方向一维DCT变换的输入变量shift是不同的,通过判断输入变量shift值的大小可以判断其是水平方向还是竖直方向的一维DCT变换。步骤(4)、对中间变量进行右移舍入运算,限制其位宽,如图4所示;具体的:二维的DCT变换由两个方向的一维DCT变换组成:水平方向DCT变换和竖直方向的DCT变换。HEVC中,先执行水平方向的一维DCT变换,其输入数据为像素值的残差,为9bit位宽的有符号数。在蝶形运算逐级计算中间变量的过程中,能保证中间变量位宽在16bit内。但是在执行竖直方向一维DCT变换时,其输入是水平方向DCT变换的输出,位宽为16bit,这样其蝶形运算的中间变量不能用16bit位宽保存,否则出现严重的溢出错误。如果用32位保存,则并行性下降,不能起到很好的加速效果。为了解决这一问题,对中间变量进行右移舍入,舍弃低位bit,使其能用16bit位宽保存,通过一定的舎位误差代价换取并行性。具体的右移计算如式(1):y=(x+(1<<(MIVO-1)))>>MIVO(1)其中:x为需要进行右移舍入的数据,MIVO为中间变量最大阶数,y是执行完右移舍入后的结果。此外输入变量shift值也要根据MIVO做相应的调整,使其能抵消中间变量的右移舍入。步骤(5)、将中间变量矢量和对应的系数矢量进行点乘运算,如图5中(a)和(b)所示;具体的:Tilera平台提供矢量点乘运算指令,一条指令能执行多个数据的点乘求和运算,起到很好的加速效果。对于计算四个中间变量和相应系数的点乘,直接采用一条指令执行四元矢量点乘便可以完成;对于四个以上中间变量和相应系数的点乘,可以通过多次的四元矢量点乘完成;对于计算两个中间变量和相应系数的点乘,Tilera没有直接的指令,本发明采用并行的乘法和加法指令完成。中间变量的点乘计算是DCT变换的核心计算部分,乘法复杂度高,执行点乘计算之前的操作都是为了准备数据,适应点乘指令的计算规则。步骤(6)、将点乘运算的结果进行重新排列组合,执行右移舍入,输出结果保存至目标内存,如图6所示;具体的:基于HEVC的规定,一维DCT变换的输出位宽为16bit,执行完点乘计算的结果为32bit,需要执行舍入运算,保存为16bit;HEVC的舍入计算如式(2):y=(x+offset)>>shiftoffset=(1<<(shift-1))error=2shift-1式中:x是需要执行右移舍入的数据,y是执行完右移舍入的结果;offset是用于四舍五入的补偿值,由右移位数shift推导而来,shift值由DCT变换块的大小N(4,8,16,32)和数据位宽B(8bit,10bit)推导而来,水平方向(horizontal)的shift值和N,B有关,而竖直方向(vertical)的shift值和N有关,根据shift值的不同可以用来判断一维DCT变换的方向:水平还是竖直;error是执行右移舍入操作产生的最大误差。将步骤(5)得到的点乘结果保存为32bit数据,一个64bit寄存器保存两个点乘结果,对点乘结果先并行加上偏移值offset,然后并行右移shift,便得到16bit的输出结果。对输出结果进行重新排列和组合,最后保存至输出内存空间,完成输出。上述为一维DCT变换的详细步骤,一维IDCT是一维DCT的反向运算,其具体流程与DCT变换类似,区别在于对输入数据需要进行转置,具体如图7所示。一维DCT中用于一次点乘计算的数据在内存分布上是连续的,因此可以直接装载进寄存器用于计算;而一维IDCT中用于一次点乘计算的输入数据在内存分布上不连续,装载进寄存器后不能直接用于计算;本发明将装载进寄存器的内存分布相邻的矢量数据逐级两两交织,最终达到转置的效果,即四个四元矢量的第n(1,2,3,4)个元素,组成第n个新的四元矢量,通过转置后的数据矢量就能直接用于后续计算。本发明在Tilera平台上能够有效加速HEVC/H.265视频编码器的DCT变换反变换模块,获得较好的加速优化效果,降低HEVC编码复杂度。以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变形或修改,这并不影响本发明的实质内容。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1