APP下载

TMS320C66x汇编语言的DSP代码优化技术

2015-09-12张晓东孔祥辉张雨轮

单片机与嵌入式系统应用 2015年9期
关键词:编译器流水线寄存器

张晓东,孔祥辉,张雨轮

(西安电子工程研究所,西安710100)

张晓东、孔祥辉(工程师)、张雨轮(助理工程师),主要研究方向为SAR 雷达系统设计与信号处理。

引 言

DSP(数字信号处理器)通常作为实时信号处理的核心器件,被广泛应用于工业控制、通信、航空航天、武器精确制导等领域中。在以DSP 为核心的系统设计过程中,软件开发的地位显得尤为重要。虽然器件水平的不断提高、DSP主频和运算核的增加,使DSP的运算能力大为提升,但是随着系统集成度和实时性的不断提高,为了提高运算速度和执行效率,在进行软件开发时经常需要用到C 语言和汇编语言的混合编程。

如何使C语言和汇编语言有效地结合在一起,使程序清晰易懂,同时提升运算效率是本文着重讨论的问题。TI公司的TMS320C66x 系列是高性能的数字信号处理器,本文以CCS5.0编程环境为例,讲述了编译器的实时运行环境下的汇编编程规则、使用流水线技术对程序的改善,以及在编程中需要注意的问题。

1 TMS320C66xDSP简介

TMS320C66x高性能DSP 采用VLIW 结构,具有2路数据通道,每个通道包含4个可以并行运行的处理单元(.L、.S、.M 和.D),每个通道有32个32位通用寄存器,每个周期最多可以运行8个32位的指令,数据的加载位宽为每个周期32位或者64位。

其L1/L2 存 储 包 括 直 接 映 射 的32KB 的L1P 指 令RAM、32KB的2 路L1D 数 据RAM、512 KB 可 配 置 的L2RAM;最高运行频率为1.25 GHz,每核最高有40GMAC/s定点和20 GFLOP/s运算能力,8 核共享4 MB片上存储,包含丰富的外围接口,如DDR3 控制器、PCIe控制器和SRIO 接口等。

TMS320C66xDSP核心框图如图1所示。

2 编译器的实时运行环境

在编译器的实时运行环境下,编写汇编代码时要遵守的规则主要有:寄存器使用规则和参数传递规则。

TMS320C66x两组通用寄存器,每组分别有32 个32位寄存器,分为两组,分别是A0~A31和B0~B31。编译器对特定寄存器的使用及如何保护作了规定。占用两个寄存器的数据(长整型、双精度浮点数)放在相邻的两个寄存器中,且第一个必须是奇数,例如A1:A0,前面存放高位,后面存放低位,成对使用。

图1 TMS320C66xDSP核心框图

TMS320C66x编译器对汇编函数调用有严格的规定,如果在调用中不遵守这些规定,就会破坏实时运行环境,导致程序错误。主程序把函数调用需要传递的参数放在寄存器或者堆栈里。参数的前10 个依次放在A4、B4、A6、B6、A8、B8、A10、B10、A12和B12里、如果参数是长整型或者浮点型,就占用一个寄存器对,如A5:A4、B5:B4等,依此类推。

剩下的参数放在堆栈里,堆栈指针指向下一个空地址,第11 个参数就是SP+offset,依此类推。参数放在堆栈里需要考虑存储边界,一个参数如未声明类型且长度不超过一个整型,按整型存放,未声明的浮点数按双精度浮点数存放。返回值如果是整型,单精度浮点数或者指针,放在A4中,如果是长整型或者双精度浮点数则放在A5:A4 中。

3 软件流水线技术的应用

TMS320C66x系列DSP 的高速度、高效率是靠并行处理来实现的,而软件流水线技术(software pipeline)则是实现并行处理的关键。DSP只有在流水线充分发挥作用的情况下,才可能达到最高的执行效率。软件流水线包含取指、译码和执行3个阶段,每个阶段又分为不同的相位。软件流水线技术处于不同相位可以并行执行,即取指、译码和执行可以并行运行,甚至相同阶段不同相位也可以并行运行。

软件流水线技术是一种循环内的指令,能在一个周期内使用不同功能单元并行处理多个迭代的技术,能更为有效地使用资源,尤其对于VLIW的具有多功能单元的架构,通过减少循环中因为数据相关导致的依赖和功能单元使用冲突挖掘一次循环中指令的并行性,一般都是针对最内层循环进行的优化。

软件流水线技术可以概括为:从一个循环出发,将一个循环分成可以并行执行的迭代单元,也就是说在一次循环运算结束前,启动多次后续的循环运算。软件流水阶段分为进入循环核前的prolog、循环核loop kernel、循环核结束后的epilog三个过程。流水线技术示意图如图2所示。

软件流水线编程时,主要使用以下寄存器:

①Loop Buffer是一个能存储若干条SPLOOP指令的片内存储空间,最多达14个执行包。

② LBC 执 行 SPLOOP、SPLOOPD、SPLOOPW 时清零,每个运行周期后+1,当运行到功能段(Stage)边缘时,重置为零,此寄存器用户不可见。

③ILC 为用于循环计数的专用寄存器,SPLOOP 和SPLOOPD使用向下计数器,每运行一次循环递减,使用ILC需要4个周期的延迟。

RILC循环嵌套时用于重置ILC。

软件流水线编程时,主要使用以下指令:

①SPLOOP一般用于告知循环最小运行次数,但不知循环体是否超过4个周期的起始,因为ILC加载和使用需要4个周期的间隔;SPLOOPD 知道循环最小运行次数,以及循环体超过4个周期的起始;SPLOOPW 不知道循环次数的任何信息,表明buffer的起始;SPLOOP的参数表示最小的功能段指令周期数。

②SPKERNEL 和SPKERNELR 表 明 结 束,其 参 数表示循环结束的第几个功能段内的第几个周期。

图2 流水线技术示意图

而SPMASK 和SPMASKR 用 来 区 分 是SPLOOP 内的存储还是普通memory内的指令。

软件流水线技术的限制:同一周期不能使用相同的功能单元;同一个周期不能同时写入一个目标寄存器;在一个执行程序包内,每个数据通路两个功能单元可以访问另一个寄存器堆的相同的操作数。当从另外一侧读取一个刚刚更新的寄存器时,会有一个周期的延迟,即交叉通道的延迟。

4 汇编语言在程序中的应用

在实际应用程序开发过程中,程序通常采用混合编程的方法实现。主函数采用C 程序编写,而对于那些耗时较多的运算密集的模块采用汇编编写。

这样做的目的比较简单,因为这样在主程序中初始化一些初值,既简单又准确,且汇编程序能提升运算效率。这样既能保证程序的结构化和可读性,又能保证应用的实时性。

实验中主要以浮点复数点乘程序为例,介绍汇编语言对源代码的优化步骤。

首先将C 源代码循环展开翻译成汇编代码,为了使运算效率最高,应使用相同运算周期内运算量最高的汇编指令。

确定最小迭代间隔规划使用功能单元,使循环的多次迭代能够并行执行;为了使程序流水执行,应首先确定最小功能段间隔。

一个循环的最小功能段间隔是这个循环相邻两次功能段开始之间必须等待的最小周期数。循环中的相邻功能段数据相关性和循环核中使用最多的功能单元是最小功能段间隔。

例如,如果在循环核中有3 条相邻指令都使用.D1 单元,则最小功能段间隔至少是3,因为使用同一功能单元的3条指令不能并行执行,这时需要的最小功能段为3。

规划使用寄存器。在已知最小功能段间隔以后,可根据程序的数据依赖关系为功能单元分配寄存器,必须保证每个周期内没有寄存器并行使用。编写汇编程序如下:

SPLOOPD3

LDDW.D1*A4++,A7:A6

LDDW.D2*+B4[1],B13:B12

LDDW.D2*B4++[2],A13:A12 LDDW.D1*A4++,B7:B6

NOP4

CMPYSP.M1 A7:A6,A13:A12,A11:A10:A9:A8 CMPYSP.M2 B7:B6,B13:B12,B11:B10:B9:B8

NOP3 FADDSP.L1A9,A11,A19 FADDSP.L2B9,B11,B19 FADDSP.L1A8,A10,A17 FADDSP.L2B8,B10,B17 NOP ADD.S1A5,A19,A16 ADD.S2B5,B19,B16 SPKERNEL4,0 STDW.D1A17:A16,*A18++[2]STDW.D2B17:B16,*B18++[2]

程序中使用LDDW、CMPYSP等指令完成数据读写和乘法运算等,保证程序运算时间最短。程序中使用最多的单元为D1和D2,每个单元被使用了3次,所以程序的最小功能段为3,循环长度共有15个,被分为5个功能段,在每个周期内保证了没有相同的功能单元被使用。运行同时最多使用了A、B两侧共6个功能单元,保证了运算效率。使用更多的寄存器可以使数据的前后关联更小。

使用本程序运行平台为TMS320C6678,复数8 192点乘其运行周期为33 947,与使用编译器优化的点乘程序的运行周期42 055相比,大约提升了20%。

结 语

本文提到的软件利用汇编优化代码技术,在实际的系统应用中获得了满意的代码效率,为大规模复杂算法运算的执行提供了有效的时间保障。

在程序中采用的汇编语言和软件流水技术,在实时条件下能够应用于更为复杂和有效的算法,尤其是在编译器对于某些程序优化不明显的情况下,为提升代码效率提供了一些解决思路。

[1]TI.TMS320C66x DSPCPU and Instruction SetReferenceGuide,2010.

[2]TI.TMS320C6000Optimizing Compiler User's Guide,2014.

[3]TI.TMS320C66xDSP CorePac User's Guide,2011.

[4]任丽香,马淑芬,李方慧.TMS320C6000 系列DSP的原理与应用[M].北京:电子工业出版社,2000.

猜你喜欢

编译器流水线寄存器
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
流水线
基于相异编译器的安全计算机平台交叉编译环境设计
Microchip为MPLAB XC系列专业版编译器推出低成本可续订包月许可证
报废汽车拆解半自动流水线研究
流水线生产杀死艺术
通用NC代码编译器的设计与实现
SIMATIC IPC3000 SMART在汽车流水线领域的应用
高速数模转换器AD9779/AD9788的应用