软件流水线技术是一种循环内的指令,能在一个周期内使用不同功能单元并行处理多个迭代的技术,能更为有效地使用资源,尤其对于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表明结束,其参数表示循环结束的第几个功能段内的第几个周期。

而SPMASK和SPMASKR用来区分是SPLOOP内的存储还是普通memory内的指令。
软件流水线技术的限制:同一周期不能使用相同的功能单元;同一个周期不能同时写入一个目标寄存器;在一个执行程序包内,每个数据通路两个功能单元可以访问另一个寄存器堆的相同的操作数。当从另外一侧读取一个刚刚更新的寄存器时,会有一个周期的延迟,即交叉通道的延迟。
4 汇编语言在程序中的应用
在实际应用程序开发过程中,程序通常采用混合编程的方法实现。主函数采用C程序编写,而对于那些耗时较多的运算密集的模块采用汇编编写。
这样做的目的比较简单,因为这样在主程序中初始化一些初值,既简单又准确,且汇编程序能提升运算效率。这样既能保证程序的结构化和可读性,又能保证应用的实时性。
实验中主要以浮点复数点乘程序为例,介绍汇编语言对源代码的优化步骤。
首先将C源代码循环展开翻译成汇编代码,为了使运算效率最高,应使用相同运算周期内运算量最高的汇编指令。
确定最小迭代间隔规划使用功能单元,使循环的多次迭代能够并行执行;为了使程序流水执行,应首先确定最小功能段间隔。
一个循环的最小功能段间隔是这个循环相邻两次功能段开始之间必须等待的最小周期数。循环中的相邻功能段数据相关性和循环核中使用最多的功能单元是最小功能段间隔。
例如,如果在循环核中有3条相邻指令都使用.D1单元,则最小功能段间隔至少是3,因为使用同一功能单元的3条指令不能并行执行,这时需要的最小功能段为3。
规划使用寄存器。在已知最小功能段间隔以后,可根据程序的数据依赖关系为功能单元分配寄存器,必须保证每个周期内没有寄存器并行使用。
编写汇编程序如下:


程序中使用LDDW、CMPYSP等指令完成数据读写和乘法运算等,保证程序运算时间最短。程序中使用最多的单元为D1和D2,每个单元被使用了3次,所以程序的最小功能段为3,循环长度共有15个,被分为5个功能段,在每个周期内保证了没有相同的功能单元被使用。运行同时最多使用了A、B两侧共6个功能单元,保证了运算效率。使用更多的寄存器可以使数据的前后关联更小。
使用本程序运行平台为TMS320C6678,复数8 192点乘其运行周期为33 947,与使用编译器优化的点乘程序的运行周期42 055相比,大约提升了20%。
结语
本文提到的软件利用汇编优化代码技术,在实际的系统应用中获得了满意的代码效率,为复杂算法运算的执行提供了有效的时间保障。
在程序中采用的汇编语言和软件流水技术,在实时条件下能够应用于更为复杂和有效的算法,尤其是在编译器对于某些程序优化不明显的情况下,为提升代码效率提供了一些解决思路。tms320c6678
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-32692-2.html
再加上制度的不完善