DSP的匯編程序優(yōu)化
xr4=[j4+:1];;
xeomp(r4,r2);;
if xah;do,xr4=0;;
ifnxah;do,xr4=xr2;;
[j5+=1]=xr4;;
內循環(huán)結束*/
_Pieture_Segment_Inner_Loop_End:
if nlele,jump_Picture_Segment Inner Loop(p);;
外循環(huán)結束*/
_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)
/*循環(huán)擴展部分*/
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)所示,下一循環(huán)的取數(shù)和與閾值比較語句同上一循環(huán)中的指令達到了并行。分別運行實例1與實例3并計算其每個像素所花費的時間,可知實例1中平均每個像素花費7.12個時鐘周期,而實例3中平均每個像素花費5.12個時鐘周期,比優(yōu)化前少用了差不多2個時鐘周期。
(2)提前取數(shù)達到并行
在循環(huán)外提前取數(shù),徹底打破循環(huán)中各指令間時間的先后順序,增強其獨立性并最終達到并行的目的,這也是一種常用的方法。實例4利用此種方法,在實例3的基礎上對實例1的代碼段做了進一步的優(yōu)化與精簡。
如實例4中所示,(1)在循環(huán)外提前進行了取數(shù),并在(2)達到了并行,(3)、(4)對由于提前取數(shù)造成的指針移位和額外的賦值進行了修正。但是,在使用此方法進行精簡優(yōu)化時要特別注意循環(huán)結束后對指針的修正。經計算。實例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:
評論