摘要:结合TI公司C64系列DSP芯片指令并行处理的特点,在自主开发的以TMS320DM642为核心的嵌入式MPEG-4视频监控平台上,通过对编码软件进行C语言级、线性汇编级的优化,实现了高效运行的MPEG-4算法,完成了系统对视频编码的实时性要求。 关键词:TMS320DM642;优化;MPEG-4;线性汇编 0 引言 随着数字信号处理器(DSP)芯片集成度、运算速度、数据吞吐率等性能的不断提高,DSP已被广泛应用于许多实时视频处理和传输领域。本文采用TI公司C64系列的TMS320DM642芯片应用于自主开发的视频监控平台中。该芯片以其高速的处理能力和出色的对外接口能力使其设计出的产品在图像质量、硬件成本、灵活性方面都优于专门的视频编解码芯片。但由于DSP与PC机的指令集和外围存储器、接口等条件不同,在DSP平台上程序的执行效率往往比较低,难以将DSP的性能全部发挥出来。本文的目标在于采用合理的开发和优化流程,提高指令执行的并行度,研究适合在TMS320DM642高效运行的MPEG-4算法,满足系统对视频编码的实时性要求。
1 TMS320DM642芯片的主要性能特点 TMS320DM642是TI公司最新推出的一款针对多媒体处理领域的DSP芯片,芯片内核采用VelociTI先进的超长指令字(VLIW)结构,每个时钟周期最高可提供8条32位指令,具有高度的并行性和快速的运行能力。有500MHz/600MHz/720MHz三种时钟频率,根据图像处理实时性的需求,选用600MHz时钟频率,其最大处理能力可达到4800×106条指令/s。 TMS320DM642芯片在C64系列的基础上增加了很多外围设备和接口,包括三个可配置的视频接口,可以和视频输入、输出或传输流输入无缝连接;64个独立通道的增强EDMA控制器;多通道音频串行端口(McASP);66 MHz 32-bit的PCI接口;10/100Mbps以太网口(EMAC)及通用I/O端口(GPIO)等外围接口。 可见,TMS320DM642是一个强大的多媒体处理器,其丰富的外围接口并且其完全的可编程性是构成多媒体通信的良好平台,完全能够满足视频图像处理的实时性要求。
2 MPEG-4视频编码 本文选用面向多媒体应用的MPEG-4作为视频压缩标准,图1是编码器的结构框图。进行测试的图像是CIF格式(352×288象素)。通过TI公司为DSP开发者提供的集成开发环境CCS(Code Composer Studio) 中的profile clock(剖析时钟)工具测得各个模块所消耗的时间周期比例如表1所示。  图1 MPEG-4视频编码结构图
 表1 各个模块所占时间周期比例
分析显示,运动估计和运动补偿模块及纹理编码模块是MPEG-4实现的最主要瓶颈。所以程序优化工作主要是基于这两个模块进行的。
3 软件优化流程 软件的优化流程一般分为三个阶段:产生C代码、C语言级的优化和汇编级的优化。 3.1 产生C代码 在实际的DSP应用中,许多算法都是非常复杂,直接用汇编代码编写,虽然优化效率很高,可是实现的难度却很大,所以一般都采用先按照需要用C语言实现功能,编译运行,然后利用profile clock工具确定代码中可能存在的低效率段,若不能满足要求,则进行第二阶段。 3.2 C语言级的优化 优化C语言程序是优化流程的第二阶段。要想充分发挥TMS320DM642的运算能力,必须从它的硬件结构出发,最大程度地利用八个功能单元,尽量让程序无冲突地并行执行。通过下述方法改进C程序,可使编译出的代码性能显著提高: (1)软件流水线技术 软件流水用来对一个循环结构的指令进行调度安排,使循环的多次迭代能够并行执行。在编译代码时,选择编译器的-o2或-o3项,编译器将根据程序尽可能地安排软件流水线。在软件流水线的运用上,最典型的方法就是循环展开,即在程序里把小循环的迭代展开,使得可能并行的指令数增加,从而改进软件流水编排,改善代码性能。循环体往往是程序中中耗时最长的,因此优化时将重点放在循环体上。 (2)数据打包处理 C6000访问存储器是很费时的,要提高数据处理率,应使一条存/取指令能访问多个数据。当程序需要对连续的short型数据流操作时,应该转化成对int型数据流的操作,这样一次可以把两个16位的数据读入一个32位的寄存器,然后使用相应的指令对数据进行运算(如_sub2等),以减少对内存的访问,从而大大提高程序的执行效率。 (3)使用内联函数 内联函数Intrinsics是直接与C6000汇编指令映射的在线函数,能提供绝对值运算、饱和加、乘法、移位等运算。通过调用内联函数,可快速优化C代码。 (4)对乘、除法的优化 在DSP里,乘除运算指令的执行时间远远超过逻辑移位指令,尤其是除法指令,因此在实际设计中,尽量用逻辑移位运算来代替乘除操作,加快指令的运行时间。 3.3 汇编级的优化 线性汇编语言是TMS320C6000中独有的一种编程语言,介于高级语言和低级语言之间。在经过C语言级的优化之后,如果还不能满足系统性能上的要求,则可以通过profile clock工具找出效率很低的部分,使用线性汇编语言重新改写,再通过汇编优化器编译。开始书写线性汇编时可完全根据代码的逻辑功能编写,而不需要具体指定使用的寄存器和相应的功能单元,也不必考虑指令的延迟周期,DM642强大的汇编优化器通过对输入的线性汇编代码分配寄存器和循环优化,能够将汇编程序转化为利用流水线方式的高速并行汇编程序。 使用线性汇编对循环体进行优化时首先要确定循环次数,对于循环次数是变量的情况,优化器不能并行优化。其次,要尽可能使用双字或字存取操作。例如运动补偿中调用次数较多的一个小程序段: void transfer_8to16sub_c(int16_t * const dct, uint8_t * const cur,const uint8_t * ref,const uint32_t stride) { uint32_t i, j; for (j = 0; j < 8; j++) { for (i = 0; i < 8; i++) { uint8_t c = cur[j * stride + i]; uint8_t r = ref[j * stride + i]; cur[j * stride + i] = r ; dct[j * 8 + i] = (int16_t) c - (int16_t) r ; } } } 对上述C程序书写线性汇编,部分代码如下: .reg cntr , c_d1:c_d2 , r_d1:r_d2 .reg e_d1:e_d2 , e_d3:e_d4 , f_d1:f_d2 , f_d3:f_d4 .reg ptr_cur , ptr_ref , ptr_dct //寄存器定义,不必考虑实际的寄存器分配 MVK 8 , cntr //确定循环次数 LOOP:LDDW *cur , c_d1:c_d2//一次取8个数据 LDDW *ref , r_d1:r_d2 STDW r_d1:r_d2 , *cur UNPKHU4 c_d1 , e_d1 UNPKLU4 c_d1 , e_d2 UNPKHU4 c_d2 , e_d3 UNPKLU4 c_d2 , e_d4 UNPKHU4 r_d1 , f_d1 UNPKLU4 r_d1 , f_d2 UNPKHU4 r_d2 , f_d3 UNPKLU4 r_d2 , f_d4 SUB2 e_d1 , f_d1 , e_d1 SUB2 e_d2 , f_d2 , e_d2 SUB2 e_d3 , f_d3 , e_d3 SUB2 e_d4 , f_d4 , e_d4 STDW e_d3:e_d4 , *dct++ STDW e_d1:e_d2 , *dct++ ADD cur , stride , cur ADD ref , stride , ref SUB cntr , 1 , cntr [cntr] B LOOP 表2是书写线性汇编前后使用编译选项-o3和没有使用-o3选项的执行周期数比较。编译选项-o3是对文件级别进行最强的优化。
 表2 线性汇编周期数比较表
3.4 优化设计的其它方法 在实际的软件优化设计中,除了上面三个优化步骤能够提高性能以外,还可以利用DSP的特性,采取其他的办法来提高程序的运行性能,使其满足实际的设计要求。 (1)把程序和经常要用的数据放入片内RAM DSP对不同的存储单元的访问速度是有区别的,对片内寄存器的访问速度最快,对片内RAM的访问速度比片外RAM的访问速度快。因此合理地配置和使用存储空间,对系统整体效率影响很大,应该尽可能地把访问比较频繁的常数表和代码段装入片内RAM,如果过大,则把其中一部分装入片外存储器。 (2)通过DMA技术搬移数据 TMS320DM642具有片内二级存储器结构,CPU和一级程序高速缓存及一级数据高速缓存直连,两块Cache分别为16Kb,工作在CPU全速访问状态,二级缓存有256Kb。显然,对于一些大型的图像处理算法而言,其片内RAM的大小是不够的,因此需要对程序进行分析,将每段程序中读写最频繁的数据找出来,在这段程序执行前,通过DMA通道将这些数据从片外数据存储器读入到片内,程序执行时就直接从片内调用相应的数据,该段程序执行完毕后再通过DMA通道将处理后的数据从片内存储器传送到片外,这样可以大大提高程序的运行速度。 (3)Cache的使用 增大Cache,可以明显的提高性能。但是TMS320DM642中程序和数据还有Cache共享片内RAM,因此增大Cache,就减小了实际的片内可用空间,设计中需要注意。 最初的编码软件在EVM板上调试时,处理速率仅为0.8帧/秒。通过以上的优化流程,程序的整体性能得到很大的提高,处理速度为25-30帧/秒,实现了系统对视频编码的实时性要求。
4 优化中的问题 (1)优化结果的验证 优化过的程序往往不知道是否运行正确,一般采用的办法就是通过测试序列来验证。测试序列中每组数据包括输入数据和输出数据,通过对输入数据的运算,把结果与输出数据进行比较,判断程序的正确性。构造测试序列的时候,需要根据算法的特点,注意序列最好有几组,数据最好有一定的长度,这样验证的更准确。 (2)内存泄漏的问题 DSP使用哈佛结构,数据空间和程序空间是分开的,一般数据的操作不会影响到程序。但是程序和数据还有CPU的二级缓存共享片内RAM,所以对该部分的数据进行操作,如果有泄漏的话会改写程序,导致程序跑飞。因此当程序的运行不正常时,很有可能就是内存泄漏造成的。在程序设计中,应尽量不用指针,同时注意进行边界检测。 (3)存储器bank的冲突 由于TMS320DM642使用交叉存储方案,将存储器分成4个或8个bank,每个bank都是单口存储区,因此每个周期对每个bank仅允许一次访问,若对一个bank进行两次访问将导致存储器阻塞,即当存储器读第2个数据时,芯片内所有流水线操作停止一个周期。解决的办法是对代码段进行修改,避免同一个周期内对一个bank进行两次访问,则不会发生流水阻塞。
5 结语 TMS320DM642芯片以其高速并行的处理能力和强大的可编程性正逐步应用于视频点播、多通道数字硬盘录像机、远程监控系统等领域。本文结合MPEG-4编码中应用的实例,具体阐述了TMS320DM642中软件优化的开发方法。并不是所有的程序优化都必须经过软件优化流程的3个阶段,当在某一阶段已获得了期望的性能,就不必进入下一个阶段。
参 考 文 献 [1] TMS320C6000 Assembly Language Tools User’s Guide. Texas Instruments Incorporated, April 2001. [2] TMS320DM642 Video Imaging Fiexed -Point Signal Processor.Texas Instruments Incorporated, May 2003. [3] 李方慧,王飞,何佩琨.TMS320C6000系列DSPs原理与应用(第二版).北京:电子工业出版社,2003. [4] 钟玉琢,王琪,贺玉文.基于对象的多媒体数据压缩编码国际标准-- MPEG-4及其校验模型.北京:科学出版社,2000.
|