DSP的汇编程序优化方法及实例分析
e,jump_Picture_Segment Inner Loop(p);; 外循环结束*/ _Picture_segment_Outter_Loop_End: if nleoe,jump_Pieture_Segment_Outter_Loop(p);; 实例3: lcO=xr0;; xrl=lshifi r0 by一1;;_ _Picture_Segment_Outter_Loop: lcl=xrl;; _Picture_Segment_Inner_Loop: xr3=[j4+=l];; xeomp(r3,r2);xr4=[j4+=1];;(1) ifxalt;do,xr3=0;; if nxalt;do,xr3=xr2;; [j5+=l]=xr3;xcomp(r4,r2);;(2) /*循环扩展部分*/ if xalt;do,xr4:0;; ifnxah;do,xr4=xr2;; [j5+=1]=xr4;; _Picture_Segment_Inner_Loop_End: if nlele,jump_Pieture_Segmem Inner Loop(p);; _Picture segment_Outter_Loop_End: if nleoe,jump_Picture_Segment_Outter_Loop(p);; 如实例3中的(1)、(2)所示,下一循环的取数和与阈值比较语句同上一循环中的指令达到了并行。分别运行实例1与实例3并计算其每个像素所花费的时间,可知实例1中平均每个像素花费7.12个时钟周期,而实例3中平均每个像素花费5.12个时钟周期,比优化前少用了差不多2个时钟周期。 (2)提前取数达到并行 在循环外提前取数,彻底打破循环中各指令间时间的先后顺序,增强其独立性并最终达到并行的目的,这也是一种常用的方法。实例4利用此种方法,在实例3的基础上对实例1的代码段做了进一步的优化与精简。 如实例4中所示,(1)在循环外提前进行了取数,并在(2)达到了并行,(3)、(4)对由于提前取数造成的指针移位和额外的赋值进行了修正。但是,在使用此方法进行精简优化时要特别注意循环结束后对指针的修正。经计算。实例4平均每个像素所花费的时间为4.18个指令周期。 实例4: lcO=xrO:: xrl=lshifi rO by-1;; _Picture_Segment_Outter_Loop: lcl=xrl:: xr3=[j4=1];; (1) _Picture_Segment_Inner_Loop: if xah;do,xr3=0;; ifnxalt;do,xr3=xr2;; [j5+=1]=xr3;xcomp(r4,r2);; /*循环扩展部分*/ if xah;do,xr4=0;xr3=[j4+=1];;(2) if nxah;do.xr4=xr2;; [j5+=1]=xr4;; _Picture_Segment_Inner_Loop_End: if nlelejump_Pieture_Segment_Inner_Loop(p);; j4=j4一l;; (3) xr3=0;; (4) _Pictnre_Segment_Outter_Loop_End: if nleoe,jump_Pieture_Segment_0utter_Loop(p);; (3)改换语句达到并行 有时,不同的语句利用不同的硬件资源可以得到相同的结果。换一条语句执行.改变原语句所用硬件资源。往往也能够增加程序的并行程度。例如DSP中往往提供独立的加法、乘法运算单元,同样一条赋值语句可以用加0或者乘l代替,这样就可以将原来不能并行的从内存中取数语句和对寄存器赋值语句(这两条语句都要到总线资源)并行起来。这在许多参考资料中都可以见到。在此不再列举具体实例。 (4)增加取数个数达到并行 某些DSP还支持联合取数的功能,其寄存器可能是32位.但是却支持64位数据的存取,即一条语句可完成二组数据的存取。而对这两组数据的处理却是相互独立、可以并行的,利用这一功能来达到优化,也不失为一种好方法。 2.2 利用软件流水 流水技术是提高DSP程序执行效率的另一种主要手段。它可以使若干条指令的不同执行阶段并行处理。有时由于相邻的几个指令行有可能使用相同的资源,其间又可能有相关性,从而使DSP在执行时自动插人延迟,使DSP的运行速度比预期的慢:有时又可能由于指令本身的原因造成延时(例如跳转指令),使得DSP的效率降低。由于流水技术本身的复杂性以及DSP硬件结构的多样性,这里不再讨论造成这种延迟的种种原因(事实上各个DSIC的使用手册中均有详细的说明),只是想告诉读者其实有时候只需要移动几条指令的位置就可以达到优化的目的。在这里仍继续采用实例1的代码段作为例子(TI公司C6000系列电路的编程更适合此例,只是其汇编指令太复杂)。 如实例5(1)所示,它将例3中并行的语句重新分开,变为二条语句执行。计算其效率可以发现平均每个像素仍然花费5.12个指令周期,与将其并行的效率相同。这是因为取数与比较这二条指令共用了同一寄存器资源xr3,造成这二条语句间插入一个指令周期的延迟,而把语句插入到这两条指令之间,恰恰利用了这一延迟,达到了优化的效果。 实例5: lc0=xr0;; xrl=lshift r0 by一1;; _Picture_Segment_Outter_Imp: lcl=xrl:: _Picture__Segment_lnnell_Loop: xr3=[j4+=l];; xr4=[j4+=1];; (1) xcomp(r3,r2);; if xalt; d0,xr3=0;; if nxalt;d0,xr3=xr2;; [j5+=1]=xr3;xcomp(r4,r2);; if xalt; d0,xr4=0;; if nxalt;d0,xr4:xr2;; [j5+=1]=xr4;; _Picture_Segment_Innerl_Loop_End: if nlcle,jump_Picture_Segment_Inner_Loop(p);; _Picture_Segme
xcomp(r3,r2);xr4=[j4+=1];;
- 基于FPGA的DSP设计方法(08-26)
- 专家指导:Linux操作系统密码恢复方法(05-16)
- 基于多核DSP Bootload代码加载方法研究(01-16)
- 基于DSP 的大容量无线传输技术中高性能的启动方法(03-16)
- 多核调试新方法探讨(10-22)
- 有备无患Linux操作系统备份方法介绍(06-06)