stu r5, a0,2 !! C[n] 的存储
stu r7, a2,2 !! C[n+1]的存储
agn0 M_Aloop !!循环次数减1
改动后的一次循环仍然耗费3个时钟周期,但是循环次数减少了一半,IPC=2,效率提高了100%。ZSP500最高IPC=4,优化后的程序执行效果仍然不是很理想。为此继续进行优化,采用软流水的方法对汇编程序继续优化,软流水就是从一个循环计算环出发,构成多重并行执行的迭代运算,也就是在1次主迭代运算完成前,启动一次新的循环迭代运算。程序如下:
mov %loop0 ,(N/2)-2
ldqu r0, a1, 4 !!循环外预取数,对数据进行
双字操作
mul2 r4, r0, r0
mul2 r6, r2,r2
ldqu r0, a1, 4
M_Aloop:
周期1:
stu r5, a0,2 !! C[n] 的存储 (1次迭代的完成)
stu r7, a2,2 !! C[n+1]的存储(1次迭代的完成)
mul2 r4, r0, r0 !! C[n] 的计算 (2次迭代的开始)
周期2:
mul2 r6, r2,r2 !! C[n+1]的计算(2次迭代的开始)
ldqu r0, a1, 4 !!第二次循环的预取数
agn0 M_Aloop !!循环次数减1
采用软流水优化后的程序,循环次数为原始的一半,同时单循环耗费时钟周期为2,IPC=3。循环采用优化方法后,结果如表1循环优化效果所示,整体优化效果显著。
表1 循环优化效果
|
指标
优化方法 |
单循环指令数 |
循环次数 |
单循环耗费时钟数 |
IPC(每时钟周期执行指令数) |
与源汇编程序比较效率提高百分比 |
|
|
源汇编程序 |
4 |
N |
3 |
1.33 |
0% | |
|
预取数、循环展开优化 |
6 |
N/2 |
3 |
2 |
100% | |
|
软流水优化 |
6 |
N/2 |
2 |
3 |
200% | |
3.2.3控制跳转指令优化方法
ZSP500中有各种控制寄存器,控制寄存器的改变,会导致流水线的等待或空转,所以控制寄存器的设置要避免存在于被频繁调用的程序块中,要尽量在程序的开端设置好,在程序的结束清除人为的设置,防止人为设置对别的程序影响[7]。

图3 bz bnz指令预测方向图
跳转指令会导致流水线的中断等待状态,ZSP核不知要到哪个分支取指令,为此ZSP500中的跳转指令设置了跳转预测功能[3],如bz lable指令有向前预取指令的功能,如果lable标签存于bz 指令下方,则程序将预取以lable标签开始的汇编指令,如果lable标签存于bz指令上方,则程序预取紧跟bz指令的汇编指令,而bnz指令则向后预取指令,具体如图3 bz bnz指令预测方向图所示[8],其他如bge、ble、br等指令预测方向皆不相同,满足编写程序的需要。有此预测功能,编写汇编程序时就要将发生几率最大的程序块放在跳转指令预测方向,减少由于跳转预测错误而引起流水线被冲,重新取指而带来的ZSP核的等待。
3.2.4特殊硬件资源和指令资源的利用
ZSP500可以通过控制寄存器的设置开启四个数据缓冲区,此四个数据缓冲区采用比特反转寻址,并且当指向缓冲区底部时,会自动回转到缓冲区顶部,这种性能在应用ZSP500进行FFT算法实现时可以达到很好的效果。在软件设计上很难达到的速度优化效果,应用硬件特殊的物理器件功能,就变得十分容易实现了。同时ZSP500还提供特殊的汇编指令资源,如复合指令cmaci、cmuli,功能指令max、min等,其中max可以实现取两个数据的较大者,min指令可以实现取两个数据的较小者,特殊指令的应用,可以避免跳转指令、比较指令的使用,减少跳转指令预测错误造成的时钟浪费[8]。
如: if (var2 < -32) var2 = -32 ;
else if(var2>32) var2 = 32 ;
对应的汇编指令:
mov r0, -32
mov r1, 32 !!r2 = var2
max r2, r0 !!取比-32大的数
min r2, r1 !!取比32小的数
以上汇编程序没有跳转指令的应用。
以上详细分析了各种汇编优化策略,在具体的项目工程中要充分的应用以达到优化效果的最大化,程序各种优化方法的使用要结合硬件资源,在硬件资源足够的情况下合理的使用。以一段完整的程序优化为例:
C代码如下:
if(var1 = var2) //利用跳转预测的方法优化
{for (i = 0,n=0;n < 80; n=i+2,i++)
c[i] = a[n]*a[n] + a[n+1]*a[n+1]; //利用软流水的方法优化
if (var2 < -32) var2= -32 ; //利用ZSP500提供的特殊指令优化
else if (var2>32) var2 = 32 ;
c[41] = var2;}
else{for(i = 0;i < 41 ;i++) c[i] = 0;} //利用循环优化
综合利用以上提供的优化策略和代码,整体进行汇编语言的编写和调整,程序执行的效率可由ZSP IDE中的统计工具ZSIM SRTATISTICS统计得出,由图4可以看出C源程序采用三级自动优化后耗费时钟206 clock,效率1.40 IPC,每时钟周期执行两条指令居多59.22%,由图5可得采用手工汇编并优化后整体耗费时钟48 clock,效率2.85 IPC,单时钟执行三条指令居多达79.17%,大大提高了程序的执行效率,优化后整体没有流水线保护、停顿状态(0 group cycle = 0),优化后程序执行速度提高了3倍。

图4 C源程序进行自动三级优化效率统计

图5 手工汇编并优化执行效率统计
本文基于ZSP500的硬件资源和硬件特性,介绍了软件方面的各种优化方法,这些方法以硬件资源为基础,以测试结果为参照,不断地修改,为大规模复杂运算的实现提供了时间保障,满足了实时性要求,各种DSP尽管结构和指令集不同,但是优化策略完全可以相互借鉴,因此本文方法对其他DSP程序的优化,具有参考作用。硬件的发展是飞速的,基于硬件的软件优化方法要根据硬件特性的提升不断改进,这样才能充分利用硬件资源。
速度的提升有时是以代码长度的增加获得的,代码长度的增加会给本已稀少的硬件存储单元带来巨大的压力,因此代码空间优化也是DSP优化的重要内容,有时不得以要牺牲速度来减轻空间优化的压力,在速度和空间上达到最优是DSP优化的最终方向。
参考文献
[1]ZSP Technology Overview, September 2005
[2]USERS’ GUIDE ZSP Software Development Kit SDK Release 5.2 September 2005
[3]ZSP 500 Digital Signal Processor Core, technical manual, September 2003
[4]ZSP 500 DSP Architecture, 2003
[5]ZSP 500 C Programming, April 2004
[6]ZSP 500 C Optimization , April 2004
[7]ZSP 500 Assembler Programming, October 2004
[8]ZSP 500 Code Optimization Techniques, October 2004