基于ZSP500的高效程序优化设计(1)(2)
2015-03-05 01:09
导读:图2程序优化流程图3.2 高效汇编程序的编写与优化 将优化后的C语言程序,在ZSP IDE环境下测试C语言的执行效率,具体根据程序执行所耗费的总时钟数(cy

图2程序优化流程图3.2 高效汇编程序的编写与优化 将优化后的C语言程序,在ZSP IDE环境下测试C语言的执行效率,具体根据程序执行所耗费的总时钟数(cycle),耗费的总cycle数目中1 group cycles,2 group cycles,3group cycles1,4 group cycles的各自数目,以上四种情况分别表示每个cycle执行的汇编语句(IPC),若4 group cycle的数目最多,则指令充分应用了提供的硬件资源,程序的执行效率较高[2]。编写出高效率的汇编程序,整体上可以从以下几点考虑: (1)最大限度的保持长时流水线充满,尽量避免在连续的大计算量程序中使用判断语句,或改变控制寄存器的汇编语句,这样会导致预取指令中途被冲,无指令执行的状态(IPC=0)。 (2)避免频繁的ZSP核与外界存储子系统进行信息的交互,对同一物理地址的内存存储和读取要间隔合适的时间,防止出现STALL现象[3]。同时数据的存储和读取最好应用字装载或双字装载指令,既可以避免频繁与存储系统的交互,又可以提前取出需要的数据,减少运算等待时间。 (3)明确各种指令使用的硬件资源,特别是有的指令可以使用多种硬件资源,而有的指令只能使用特有的硬件资源,明确各个时钟周期是否有相应的硬件资源可用,否则会出现资源冲突,引起时钟等待。 (4)主调程序和被调程序的空间安排要尽量安排较近,防止远跳带来的时钟损耗,若是频繁调用最好能够将子程序直接嵌入。3.2.1 一般手工汇编方法 利用ZSP开发环境的自动优化功能,编写线性汇编指令,线性汇编指令的编写,要考虑数据运算的相关性,这样自动优化的效果才能达到最高。手动优化要根据指令分组原则[3]和ZSP500的硬件资源和硬件资源的使用优先级,明确各个时钟周期指令的硬件资源需求,编写和调整汇编指令的顺序,达到同一时钟周期汇编指令执行的最大化和硬件资源利用率的最大化。硬件资源使用顺序为[3]: 1 ALU0 2 ALU1 3 ALU0和ALU1 4 MAU 以下为一个指令示例,例如: 周期1: add.e r0, r2 (使用ALU0和ALU1) shra r3, 1(使用MAU) 周期2: addr7, r15(使用ALU0) 由于周期1的第一条指令同时使用了两个ALU,导致第二条指令必须使用MAU,这样就浪费了MAU的处理能力。通过调整,以上指令可以调整为: add r7, r15 (使用ALU0) add.e r0, r2 (使用MAU) shra r3, 1(使用ALU1) 这样三条指令在同一个周期中完成,并且符合指令的分组原则,速度提高100%,同时寄存器之间不存在数据的相关性,不仅节省了程序执行的时间,而且运算单元满负载。3.2.2循环优化方法 对于运算量占用极大的循环程序,循环嵌套的展开,循环的展开,软件流水线的应用可以大大提高汇编语句执行的效率,循环次数的统计要应用硬件资源,避免出现判断语句存在于循环体,循环代码的优化是汇编代码优化的重点[3][8]。以一段C代码的优化过程为例:原始C代码如下: for(n=0,i=0;n