APP下载

TMS320C64x系列 DSP的软件优化技术

2014-09-18徐书文

电视技术 2014年13期
关键词:编译器流水代码

葛 珊,徐书文

(中国电子科技集团公司第三研究所,北京 100015)

数字信号处理器(DSP)的应用起始于20世纪80年代,主要应用于无线通信、一维信号处理(FFT运算)、二维信号处理(图像处理)等数据运算量大的系统设备中。主频从10 MHz发展到目前1 GHz以上,片内RAM容量从几百字节,发展到上百兆字节,外设功能也从简单的数据读取扩展到控制、通信于一体的数字信号处理器。C6000系列产品是TI公司继C5000系列产品之后推出的速度更高、功能更强大的产品。基于其特殊的硬件、软件结构,已被广泛应用于雷达信号处理、图像处理、工业控制、航空航天等领域。

TMS320C64x系列DSP芯片是TI公司C6000系列产品中的一种,该系列芯片为定点DSP芯片,主频为600 MHz~1 GHz,但其外设工作频率最高为133 MHz,通过研究发现,必须在外设数据采集及软件编程设计方面进行优化设计,才能大幅度提高算法的运算速度,发挥芯片主频提高的真正潜能。该芯片具有很高的操作灵活性和速度,同时如何充分利用它的硬件结构及资源,发挥它的高速处理能力,是软件设计人员首要考虑的问题。软件优化技术对实现系统的开发具有重要意义[1-4]。

1 优化设计

1.1 开发系统配置

CCS 2.0(C6000)是TI推出的专门开发C6000系列DSP的集成开发环境。CCS集成了工程管理工具、代码编辑器、代码产生工具、代码调试工具等。编译器的设置,是软件优化的先决条件,在程序代码编译前,需要在工程文件的Build Options控制编译器选项中选择-o2/-o3选项,这样可以使编译器最大限度地进行分析和优化。

1.2 C代码的优化方法

为了使C代码获得最好的性能,编写时应遵循下述规则:

1)对于定点乘法输入应尽可能使用short型数据,该数据类型可以有效利用C64x的16位乘法器;

2)对循环计数器使用int或unsigned int类型,避免不必要的符号扩展指令;

3)使用restrict关键字限定一个指针、引用或数组;

4)使用内联函数可以快速优化C代码,其使用方法与调用函数一样。

1.3 线性汇编代码优化方法

编写高效的汇编代码应遵循下述规则:

1)使用并行的汇编代码,充分利用某些指令的延时间隙,执行代码;

2)使用打包数据处理,充分利用C64x宽的存储空间通路,用字或者双字的读取和存储操作数来进行字或者半字数据访问;

3)合并多操作为单个操作指令,C64x提供了许多能将一些一般操作结合在一起的指令,这些指令能减少代码中的指令数,减少代码长度,利于简化编程。

1.4 交叉汇编代码使用

由于C语言灵活性强、便于阅读,在编写程序代码时,可以用C语言编写代码的主体框架,将代码中耗时最长的部分抽取出来,用并行汇编代码编写,这样可以大幅提高代码的执行速度。

1.5 软件流水方法

软件流水就是编排循环指令,使循环的多次迭代能够并行执行。软件流水应从4个方面进行考虑,分别是循环次数、冗余循环、循环展开和推测执行。

1)循环计数

最有效的软件流水的循环是按递减计数形式对循环进行计数。可以选择编译器的-o2或-o3选项优化循环。

2)消除冗余循环

冗余循环的存在使代码尺寸增加,也对代码性能有影响。因此,运用编译器的-mh或-mhn选项可以减少冗余循环,提高编译器完成优化的能力。

3)循环展开

当单次迭代操作没有充分利用C64x结构的所有资源时,可使用循环展开提高性能。有3种循环展开的方法:(1)编译器自动执行循环展开;(2)在程序中使用UNROLL伪指令建议编译器做循环展开;(3)用户自己在代码中展开。

4)推测执行

运用编译器的-mh选项有助于编译器消除软件流水的填充和排空,间接地减轻寄存器压力,可以获得更简洁的代码和更佳的性能。

2 优化设计中注意的问题及解决方法

2.1 软件流水限制条件

在以下3种情况中,不能进行软件流水:

1)如果一个寄存器值存在的时间过长,这个代码不能进行软件流水;

2)如果循环体内有复杂的条件代码,对于C64x超过6个条件寄存器时,这个循环不可以进行软流水;

3)一个有条件增大的循环控制变量的循环不能进行软件流水。

2.2 避免交叉通路阻塞

避免交叉通路阻塞的方法有2种:

1)通过安排指令,当操作数被更新至少一个周期以后再进行交叉通路操作数读取操作,交叉通路阻塞可以避免;

2)适当的编排,C64x能够在每个时钟周期、每个数据交叉通路进行一次源操作数读取操作,可以避免交叉通路阻塞。

3 仿真验证

以计算两个16×16像素图像的灰度绝对差为例,分析程序优化前后的运算耗时情况。两个16×16像素图像的灰度绝对差公式为

式中:R(u,v),S(u,v)分别表示16×16像素的图像矩阵,每个像素为8 bit数据。优化前,每次加载一个8 bit数据处理,测试代码运行时间后,发现速度提高不明显,因此,需要对代码进行改进。选用3种不同的打包数据处理方式对代码进行优化:

1)方法1,用1条16 bit数据加载指令(LDHU,2LDB)实现一次加载2个8 bit(字)数据处理。

2)方法2,用1条32 bit数据加载指令(LDW,LDNW)实现一次加载4个8 bit(双字)数据处理,并且运用一组DOTPU4,SUBABS4指令进行运算。

3)方法3,用1条64 bit数据加载指令(LDDW,LDNDW)实现一次加载8个8 bit(4个字)数据处理,并且运用两组并行的DOTPU4,SUBABS4指令进行运算,同时使用并行的汇编代码,充分利用某些指令的延时间隙,执行代码。

优化前后运算时间对比见表1。

表1 代码优化前后比较

从表1中可以看到,软件优化设计主要是通过利用数据并行加载、寄存器流水并行处理、减少循环次数的方法,可以大大减少运算时间,提高运行速度。

4 结论

在TMS320C64x系列DSP芯片应用中,大部分每秒百万次指令运算发生在紧凑的循环中,所以对于C64x代码产生工具来说,在重要的循环中充分利用片内的硬件资源,在软件流水中,利用VelociTI结构的多样资源,可以大大提高代码的效率。因此,本文介绍的基于C64x系列DSP的软件优化方法,为高速实时系统设计提供了一种很好的解决方法。

:

[1]Texas Instruments Incorporated.TMS320C6000优化编译器用户手册[M].田黎育,译.北京:清华大学出版社,2005.

[2]Texas Instruments Incorporated.TMS320C6000程序员手册[M].朱梦宇,译.北京:清华大学出版社,2005.

[3]Texas Instruments Incorporated.TMS320C6000汇编语言工具用户手册[M].何佩琨,译.北京:清华大学出版社,2005.

[3]覃团发,泰德兴,刘远毅,等.基于TMS320C6416的宽带语音G.722.2声码器的实时实现[J].电声技术,2006,30(1):48-51

猜你喜欢

编译器流水代码
流水
基于相异编译器的安全计算机平台交叉编译环境设计
创世代码
创世代码
创世代码
创世代码
流水有心
Microchip为MPLAB XC系列专业版编译器推出低成本可续订包月许可证
前身寄予流水,几世修到莲花?
通用NC代码编译器的设计与实现