基于C6000 DSP的H.264算法的SIMD优化

2012-06-29 01:37黄海云
电视技术 2012年2期
关键词:语句指令滤波

廖 诤,黄海云,贾 杨

(国家知识产权局专利局 专利审查协作北京中心,北京 100190)

在C6000系列DSP芯片中实现H.264算法进行视频压缩编码,已广泛应用于多媒体、数字电视、图像处理、视频监控、可视电话、视频桌面系统等视频信号处理领域,应用单指令多数据流(Single Instruction Multiple Data,SIMD)技术对H.264算法进行代码级优化,可在无PSNR(峰值信噪比)损失的情况下,有效提高程序运行速度,满足视频领域对实时信号处理的要求。

1 优化方法概述

DSP端代码的优化主要分为三个层次:项目级优化、算法级优化和代码级优化[1]。代码级优化的优点是,加入优化函数模块前后,程序运行结果不变,没有PSNR(峰值信噪比)损失,且程序运行速度得到提高。

在进行代码优化的过程中,主要采用了SIMD技术。类似于Intel公司的MMX/SSE/SSE2指令集所采用的奔腾单指令多数据(Single Instruction Multiple Data,SIMD)技术,C6000 DSP中也提供了自己的单指令多数据流(SIMD)指令集,虽然没有MMX指令集中的指令及寄存器资源丰富,但其仍可以通过对成组数据并行操作最大限度地提高运行速度。

进行代码级优化的目标主要是程序中耗时比较大和调用比较频繁的运算模块。对代码进行分析及查阅文献的结果显示,DCT、IDCT、量化、SAD、去方块滤波、运动估计(1/2,1/4像素插值)和运动补偿运算量占程序总运算量的比重很大[2-7],因此这部分函数是程序优化的重点。下面分别对这几个函数模块的优化方法及优化结果进行介绍。

2 主要优化模块

2.1 DCT函数的优化

对函数add4x4_idct,主要利用C64X提供的带饱和的打包指令_spacku4进行算法改进。对函数dct4x4dc,优化时打开函数中循环,并采用SIMD技术,一次对2个16 bit数据进行操作。

2.2 量化、反量化函数的优化

对待优化函数quant_4x4进行分析,看出量化系数的范围在16 bit之内,没有必要采用int型的量化系数矩阵,因此将量化系数矩阵的数据格式改为short型。由于函数中存在判断语句,考虑通过将判断条件作为标志量flag,使其参加运算,而不进行条件判断,但经过实验证明,该方法并没有提高程序的运行速度。又考虑到判断语句和运算同时存在于循环中,优化编译器无法对循环中的运算进行流水,影响了运算整体的运行速度,因此,将循环中的判断语句与运算分别放入两个不同的循环中进行,这样编译器会对含有运算的循环进行优化,从而提高程序速度。

对函数dequant_4x4,优化时首先分析待优化函数的数据范围,将反量化矩阵的数据类型由(int)型改为(short)型,同时在两个16 bit数据相乘时,根据其数据范围判断其乘积不会超过16 bit[8],因此进行了直接截取,采用SIMD技术,一次对2个16 bit数据进行操作的方法,减少循环次数。

2.3 去方块滤波函数的优化

对deblock_v_luma_c函数,优化时考虑到函数中存在较多的判断语句,比较耗时,因此主要采用了将函数中判断语句简化为标志量的方法进行优化。在采用简化函数中判断语句的方法进行优化前,曾考虑采用SIMD方法进行优化,但存在2个比较主要的问题:一是DSP中SIMD指令相对MMX指令要少,很多相应操作没有找到合适的SIMD指令;二是在进行horizon方向的滤波时,如果要进行SIMD的优化,首先要对输入数据做比较复杂的打包处理,影响优化效果。由于上述2个原因,对去方块滤波函数没有采用SIMD方法进行优化。

对deblock_h_luma_c,deblock_v_luma_intra_c及deblock_h_luma_intra_c函数,优化时均采用了与函数deblock_v_luma_c类似的优化方法。

2.4 插值函数的优化

对mc_hh函数,优化函数主要通过调用x264_tapfilter1_opt4in1函数,代替了原函数中调用的x264_tapfilter1及 x264_mc_clip1。x264_tapfilter1_opt4in1函数根据数据结构的特点进行了编排,由于x264_tapfilter1实际为6抽头滤波器,因此在x264_tapfilter1_opt4in1函数中6次调用_mem4函数,每次取出X方向上连续的4个unsigned char数据,采用SIMD的内联函数指令,这样进行一次6抽头的滤波操作,可同时完成对4组数据的6抽头滤波,其数据处理的结构如图1所示。

在x264_tapfilter1_opt4in1函数中,还根据数据的范围将 unsigned char通过_mpyu4(src[j],0x01010101)指令进行无符号的扩展,成为16 bit数据,以进行进一步计算;通过_spacku4指令进行数据钳位操作[9]。

对函数mc_hv,优化函数主要通过调用x264_tapfilter_opt4in1函数,代替了原函数中调用的x264_tapfilter及x264_mc_clip1。x264_tapfilter_opt4in1函数根据数据结构的特点进行了编排,由于x264_tapfilter实际为6抽头滤波器,因此在x264_tapfilter_opt4in1函数中6次调用_mem4函数,每次取出X方向上连续的4个unsigned char数据,采用SIMD的内联函数指令,这样进行一次6抽头的滤波操作,可同时完成对4组数据的6抽头滤波,其数据处理的结构如图2所示。

对于函数mc_hc,优化时首先分析待优化函数的处理过程,如图3所示,在一次计算中首先对X方向6行像素点分别进行6抽头滤波,然后对滤波结果tap[0]~tap[5]进行6抽头垂直滤波,故对6×6的像素点进行处理,可产生一个*out结果数据。在下一次的垂直滤波中,仅需再进行一次水平6抽头滤波,就可与已经计算出的tap[1]~tap[5]进行垂直滤波,产生新的结果数据*(out+i_dst_stride)。

前面已经在对函数mc_hh的优化中,完成了一次进行4组6抽头水平滤波的优化,在对函数mc_hv的优化中,完成了一次进行4组6抽头垂直滤波的优化,因此mc_hc的优化过程如图4所示。

优化后函数每次对9×9个数据进行处理,先调用x264_tapfilter1_opt4in1函数对水平方向上的9个数据[3],进行水平方向的6抽头滤波,产生了4个tap数据,然后利用部分tap数据的重复性,进行了4次垂直方向的6抽头滤波,每次滤波产生4个结果数据,因此一次处理可产生16个unsigned char结果数据。

然而,由于在未优化函数中,水平滤波时的结果没有进行求均值(右移)操作,而将中间结果数据保存为int型,然后在对int型数据进行垂直滤波后才统一进行了求均值(〉〉10)的操作,最后将垂直滤波后的结果保留为(unsigned char)型。但依照上面所述的优化过程,在进行水平滤波时,就已经进行了平均,保存的中间结果即为(unsigned char)型,垂直滤波也是对(unsigned char)型进行的,因此优化后的结果与未优化函数产生的结果有一定的差距,但该差距是有计算精度带来的,并不是错误。

为满足与原版本程序结果一致性的需求,还对原函数采用其它方法进行了优化,但仅利用了水平滤波结果tap的重复性,因此优化效果不太理想。

2.5 运动补偿函数的优化

对于函数mc_luma,分析待优化函数,由于其存在条件判断分支,但其中一个分支的运算比较复杂,一个仅是简单的数据copy,并不适合采用类似去方块中采用的标志位方法,去掉条件判断,因此仅对第一个分支中的pixel_avg函数采用SIMD方法进行了优化,优化后该函数一次可对4个像素点进行平均。

对于函数get_ref,优化时采用了与函数mc_luma类似的优化方法。

2.6 模块优化结果汇总

模块优化结果汇总在表1中。

表1 运动补偿函数的优化结果

3 优化结果总结及前景展望

综上所述,在对DCT、IDCT进行优化的过程中主要采用了SIMD技术;在对量化、反量化进行优化的过程中,主要将量化及反量化系数矩阵的数据类型由int型改为了short型,并将判断语句与计算语句分别进行循环;在对去方块滤波函数进行优化的过程中,主要通过将标志位加入运算式的方法,去除了循环中的判断语句;在对插值函数进行优化的过程中,主要利用了数据结构的重复性,并采用了SIMD技术;在对运动补偿函数进行优化的过程中,也主要采用了SIMD技术。

将上述优化后的函数模块替换原函数,其运行结果不变,运行时间如表2所示。

表2 加入优化函数模块前后单帧运行时间统计表

在今后的工作中还可对采用SIMD技术进行代码级优化进行进一步研究,对图像压缩编码程序中效率较低或之前优化效果不理想的模块进行进一步优化。同时,也可将该方法应用于除H.264算法以外的DSP程序中,提高嵌入式系统的运行效率,满足用户日益增长的对信号进行实时处理的需求。

[1]张旭东,魏振宇,史鹍.H.264编解码器在C6416 DSP上的实现与优化[J].电子产品世界,2005(5):71-74.

[2]安向阳,沈庭芝.基于DSP TMS320DM642的H.264视频编码的实现和优化[J].微计算机信息,2005(20):128-130.

[3]林冰,冯艳,李学明.基于Trimedia DSP的H.264解码算法优化[J].计算机工程与应用,2005,41(31):41-45.

[4]陈维安,李典,余松煜,等.H.264软件解码器的优化[J].数据采集与处理,2005,20(4):493-498.

[5]朱冬冬,丁嵘,尹亚光,等.H.264软件解码器的优化[J].电视技术,2003,27(12):4-6.

[6]朱林,冯燕.基于单指令多数据技术的H.264编码优化[J].计算机应用,2005,25(12):2798-2799.

[7]鹿宝生,陈启美.H.264高性能视频编码器的DSP实现[J].计算机应用,2005,25(12):2824-2827.

[8]张琦,万枫丹,段柯,等.基于MMX/SSE/SSE2的H.264解码器关键算法优化[J].信息与电子工程,2006,4(1):14-17.

[9]陈梅芳.基于TMS320DM642的H.264解码器优化[J].现代电子技术,2006,29(3):112-115.

猜你喜欢
语句指令滤波
重点:语句衔接
ARINC661显控指令快速验证方法
杀毒软件中指令虚拟机的脆弱性分析
RTS平滑滤波在事后姿态确定中的应用
基于线性正则变换的 LMS 自适应滤波
中断与跳转操作对指令串的影响
一种基于滑窗的余度指令判别算法
如何搞定语句衔接题
基于随机加权估计的Sage自适应滤波及其在导航中的应用
基于Sage—Husa滤波的GNSS/INS组合导航自适应滤波