




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
线性汇编优化代码演示文稿当前第1页\共有83页\编于星期二\13点线性汇编优化代码ppt课件当前第2页\共有83页\编于星期二\13点5.7循环展开5.8生命太长问题5.9消除冗余取数5.10存储体5.11软件流水外循环5.12同内循环一起条件执行外循环5.13通用目标文件格式(COFF)当前第3页\共有83页\编于星期二\13点5.1汇编优化器选项与伪指令(1)-on选项(2)
-mt选项和no_mdep伪指令(3)
.mdep伪指令(4)
.mptr伪指令(5)
.trip伪指令当前第4页\共有83页\编于星期二\13点5.2编写并行代码5.2.1点积的C代码a)定点点积的C代码intdotp(shorta[],shortb[]){ intsum,i; sum=0; for(i=0;i<100;i++) sum+=a[i]*b[i]; return(sum);}当前第5页\共有83页\编于星期二\13点5.2.1点积的C代码b)浮点点积的C代码floatdotp(floata[],floatb[]){ inti; floatsum; sum=0; for(i=0;i<100;i++) sum+=a[i]*b[i]; return(sum);}当前第6页\共有83页\编于星期二\13点5.2.2C代码转换为线性汇编【例5.4】定点点积的C代码内循环的线性汇编指令。LDH .D1*A4++,A2 ;从存储器加载aiLDH .D1*A3++,A5 ;从存储器加载biMPY.M1A2,A5,A6 ;ai*biADD .L1A6,A7,A7 ;sum+=(ai*bi)SUB .S1A1,1,A1 ;递减循环计数器[A1] B.S2LOOP ;跳转到循环当前第7页\共有83页\编于星期二\13点5.2.2C代码转换为线性汇编【例5.5】浮点点积的C代码内循环的线性汇编指令LDW .D1 *A4++,A2 ;从存储器加载aiLDW .D2 *A3++,A5 ;从存储器加载biMPYSP† .M1 A2,A5,A6 ;ai*biADDSP† .L1 A6,A7,A7 ;sum+=(ai*bi)SUB .S1 A1,1,A1 ;递减循环计数器[A1] B .S2 LOOP ;跳转到循环当前第8页\共有83页\编于星期二\13点5.2.3画相关性图1.定点点积图5-1为例5.4中定点点积汇编指令的相关性图以及相应的寄存器分配。当前第9页\共有83页\编于星期二\13点5.2.3画相关性图2.浮点点积图5-2给出了例5.5浮点点积的相关图以及相应的寄存器分配框图。当前第10页\共有83页\编于星期二\13点5.2.4非并行汇编代码与并行汇编代码1.定点点积【例5.6】定点点积的非并行汇编代码。MVK .S1100,A1 ;建立循环计数器ZERO .L1A7 ;累加器清零LOOP:LDH .D1*A4++,A2 ;从存储器加载aiLDH .D1*A3++,A5 ;从存储器加载biNOP 4 ;为LDH延迟一个时隙MPY .M1A2,A5,A6 ;ai*biNOP ;为MPY延迟一个时隙ADD .L1A6,A7,A7 ;sum+=(ai*bi)SUB .S1A1,1,A1 ;循环计数器递减[A1]B .S2LOOP ;跳转到LOOP处NOP 5 ;为LOOP延迟时隙;此处发生跳转当前第11页\共有83页\编于星期二\13点5.2.4非并行汇编代码与并行汇编代码用同一个功能单元分配两个LDH指令,这样会降低循环的性能,因此,重新安排功能单元以使代码并行执行,其相关性图如图5-3所示,并行汇编代码见例5.7。当前第12页\共有83页\编于星期二\13点5.2.4非并行汇编代码与并行汇编代码【例5.7】定点点积的并行汇编代码。MVK .S1100,A1 ;建立循环计数器||ZERO .L1A7 ;累加器清零LOOP:LDH .D1*A4++,A2 ;从存储器加载ai||LDH .D2*B4++,B2 ;从存储器加载biSUB .S1A1,1,A1 ;循环计数器递减[A1]B .S2LOOP ;跳转到loopNOP 2 ;为LDH延迟时隙MPY .M1XA2,B2,A6 ;ai*biNOP ;为MPY延迟时隙ADD .L1A6,A7,A7 ;sum+=(ai*bi);此处发生跳转e当前第13页\共有83页\编于星期二\13点5.2.4非并行汇编代码与并行汇编代码【例5.8】浮点点积的非并行汇编代码MVK .S1100,A1 ;建立循环计数器ZERO .L1A7 ;累加器清零LOOP:LDW .D1*A4++,A2 ;从存储器加载aiLDW .D1*A3++,A5 ;从存储器加载biNOP 4 ;为LDW延迟时隙MPYSP .M1A2,A5,A6 ;ai*biNOP 3 ;为MPYSP延迟时隙ADDSP .L1A6,A7,A7 ;sum+=(ai*bi)NOP 3 ;为ADDSP延迟时隙SUB .S1A1,1,A1 ;循环计数器递减[A1]B .S2LOOP ;跳转到loopNOP 5 ;为跳转延迟时隙 ;此处发生跳转当前第14页\共有83页\编于星期二\13点5.2.4非并行汇编代码与并行汇编代码分配两个LDW指令用了同一个功能单元,从而降低了循环的性能,因此,重新安排功能单元以使代码并行执行,其相关性图如图5-4所示,并行汇编代码如例5.9。当前第15页\共有83页\编于星期二\13点5.2.4非并行汇编代码与并行汇编代码【例5.9】浮点点积的并行汇编代码 MVK .S1100, A1 ;建立循环计数器|| ZERO .L1 A7 ;累加器清零 LOOP: LDW .D1 *A4++,A2 ;从存储体中加载ai|| LDW .D2 *B4++,B2 ;从存储体中加载bi SUB .S1 A1,1,A1 ;循环计数器递减 NOP 2 ;LDW延迟时隙 [A1]B .S2 LOOP ;跳转到loop MPYSP .M1X A2,B2,A6 ;ai*bi NOP 3 ;MPYSP延迟时隙 ADDSP .L1 A6,A7,A7 ;sum+=(ai*bi) ;此处发生跳转当前第16页\共有83页\编于星期二\13点5.2.4非并行汇编代码与并行汇编代码2.性能比较表5-1为定点点积/浮点点积的非并行与并行汇编代码的性能比较。代码实例100次循环周期数例5.62+100*161602例5.71+100*8801代码实例100次循环周期数例5.82+100*212102例5.91+100*101001当前第17页\共有83页\编于星期二\13点5.2.5适用字访问短型数据与使用双字访问1.点积C代码的循环展开2.C代码转换为线性汇编3.画相关性图4.线性汇编资源分配5.最后的汇编代码当前第18页\共有83页\编于星期二\13点5.3软件流水5.3.1模迭代间隔编排表1.定点实例2.浮点实例3.确定最小迭代间隔4.建立一个完全流水的编排表5.用多个周期指令交错累加当前第19页\共有83页\编于星期二\13点5.3.2使用汇编优化器产生优化循环【例5.20】完整的定点点积的线性汇编代码。.global_dotp_dotp:.cproca,b .reg sum,sum0,sum1,cntr .reg ai_i1,bi_i1,pi,pi1 MVK 50,cntr ;cntr=100/2 ZERO sum0 ;相乘的结果
result=0 ZERO sum1 ;相乘的结果
result=0LOOP:.trip50 LDW *a++,ai_i1 ;从存储体加载
ai&ai+1 LDW *b++,bi_i1 ;从存储体加载
bi&bi+1 MPY ai_i1,bi_i1,pi ;ai*bi MPYH ai_i1,bi_i1,pi1 ;ai+1*bi+1 ADD pi,sum0,sum0 ;sum0+=(ai*bi) ADD pi1,sum1,sum1 ;sum1+=(ai+1*bi+1)[cntr]SUB cntr,1,cntr ;循环计数器递减[cntr]B LOOP ;跳转到loop ADD sum0,sum1,sum ;计算最后的结果 .return sum .endproc当前第20页\共有83页\编于星期二\13点5.3.2使用汇编优化器产生优化循环【例5.21】完整的浮点点积的线性汇编代码
.global_dotp_dotp:.cproc a,b .reg sum,sum0,sum1,a,b .reg ai1:ai,bi1:bi,pi,pi1 MVK 50,cntr ;cntr=100/2 ZERO sum0 ;相乘的结果result=0 ZERO sum1 ;相乘的结果result=0 LOOP: .trip50 LDDW *a++,ai1:ai ;从存储体加载ai&ai+1 LDDW *b++,bi1:bi ;从存储体加载bi&bi+1 MPYSP ai,bi,pi ;ai*bi MPYSP ai1,bi1,pi1 ;ai+1*bi+1 ADDSP pi,sum0,sum0 ;sum0+=(ai*bi) ADDSP pi1,sum1,sum1 ;sum1+=(ai+1*bi+1)[cntr]SUB cntr,1,cntr ;循环计数器递减[cntr]B LOOP ;跳转到loop ADDSP sum,sum1,sum0 ;计算最后的结果 .returnsum .endproc当前第21页\共有83页\编于星期二\13点5.3.2最后的汇编1.定点的例子2.浮点的例子3.消除额外指令(1)定点点积的例子(2)浮点点积的例子4.循环灌入(1)定点点积的例子(2)浮点点积的例子5.移除多余的SUB指令6.性能比较当前第22页\共有83页\编于星期二\13点5.4多周期循环的模迭代5.4.1转换C代码为线性汇编【例5.30】加权矢量和内核循环的线性汇编代码。 LDH *aptr++,ai ;ai LDH *bptr++,bi ;bi MPY m,ai,pi ;m*ai SHR pi,15,pi_scaled ;(m*ai)>>15 ADD pi_scaled,bi,ci ;ci=(m*ai)>>15+bi STH ci,*cptr++ ;存储
ci[cntr] SUB cntr,1,cntr ;循环计数器递减[cntr] B LOOP ;跳转到
loop当前第23页\共有83页\编于星期二\13点5.4.2确定最小迭代间隔1.展开的加权矢量和的C代码2.转换展开的内核循环为线性汇编3.确定新的最小迭代间隔当前第24页\共有83页\编于星期二\13点5.4.3画相关性图图5-11把相关性图均匀分成了两个部分,最小迭代间隔为2。当前第25页\共有83页\编于星期二\13点5.4.4线性汇编资源分配【例5.33】带资源分配的加权矢量和的线性汇编程序。LDW .D2*A4++,A2 ;ai&ai+1LDW .D1*B4++,B2 ;bi&bi+1MPY .M1A2,B6,A5 ;pi=m*aiMPYHL .M2A2,B6,B5 ;pi+1=m*ai+1SHR .S1A5,15,A7 ;pi_scaled=(m*ai)>>15SHR .S2B5,15,B7 ;pi+1_scaled=(m*ai+1)>>15AND .L2XB2,B10,B8 ;biSHR .S2B2,16,B1 ;bi+1ADD .L1XA7,B8,A9 ;ci=(m*ai)>>15+biADD .L2B7,B1,B9 ;ci+1=(m*ai+1)>>15+bi+1STH .D1A9,*A6++[2] ;存储
ciSTH .D2B9,*B0++[2] ;存储
ci+1[A1] SUB .L1A1,1,A1 ;循环计数器递减[A1] B .S1LOOP ;跳转至
loop当前第26页\共有83页\编于星期二\13点5.4.5模迭代间隔编排1.资源冲突2.生命太长3.解决生命生命太长的问题4.安排剩余指令当前第27页\共有83页\编于星期二\13点5.4.6使用汇编优化器出来加权矢量和例5.34为加权矢量和的线性汇编,该代码作为汇编优化器的输入,由汇编优化器产生软件流水循环。【例5.34】加权矢量和的线性汇编。当前第28页\共有83页\编于星期二\13点5.4.7最后汇编该代码包括如下优化:由于第n次迭代的STH
ci+1与第n+1次迭代的STH
ci并行执行,为防止STH
ci+1执行50次,而STH
ci执行51次,对循环限定执行49次,但在循环退出后安排ADDci+1和STH
ci+1指令;用于ADD指令的mask由MVK和MVKH指令设置;数组C的奇元素指针也在前面填充部分设置。【例5.35】加权矢量和汇编代码。当前第29页\共有83页\编于星期二\13点5.5循环传递路径5.5.1将C代码的内核循环转换为线性汇编【例5.37】IIR内核循环的线性汇编。LDH *xptr++,xi ;xi+1MPY c1,xi,p0 ;c1*xiLDH *xptr,xi+1 ;xi+1MPY c2,xi+1,p1 ;c2*xi+1ADD p0,p1,s0 ;c1*xi+c2*xi+1LDH *yptr++,yi ;yiMPY c3,yi,p2 ;c3*yiADD s0,p2,s1 ;c1*xi+c2*xi+1+c3*yiSHR s1,15,yi+1 ;yi+1STH yi+1,*yptr ;存储
yi+1[cntr]SUB cntr,1,cntr ;循环计数器递减[cntr]B LOOP ;跳转至loop当前第30页\共有83页\编于星期二\13点5.5.2画相关性图图5-15是IIR滤波器的相关性图,从存yi+1到取yi之间形成了一个循环传递路径,由于存取指令使用相同的存储器流水线。当前第31页\共有83页\编于星期二\13点5.5.3确定最小迭代间隔1.画新的相关性图图5-16中所示是一个循环传递路径为4(2+1+1)的新的相关性图,因为MPYp2指令能够直接从寄存器中读取yi+1,因此循环传递路径可以减少6个周期,当前第32页\共有83页\编于星期二\13点5.5.3确定最小迭代间隔2.新的TMS320C6x指令(内核循环)【例5.38】循环传递路径较小的IIR内核循环的线性汇编。LDH *xptr++,xi ;xi+1MPY c1,xi,p0 ;c1*xiLDH *xptr,xi+1 ;xi+1MPY c2,xi+1,p1 ;c2*xi+1ADD p0,p1,s0 ;c1*xi+c2*xi+1MPY c3,y,p2 ;c3*yiADD s0,p2,s1 ;c1*xi+c2*xi+1+c3*yiSHR s1,15,y ;yi+1STH y,*yptr++ ;存储
yi+1[cntr]SUB cntr,1,cntr ;循环计数器递减[cntr]B LOOP ;跳转至loop当前第33页\共有83页\编于星期二\13点5.5.4线性汇编资源分配【例5.39】带分配资源的IIR内核循环线性汇编。LDH .D1*A4++,A2 ;xi+1MPY .M1A6,A2,A5 ;c1*xiLDH .D1*A4,A3 ;xi+1MPY .M1XB6,A3,A7 ;c2*xi+1ADD .L1A5,A7,A9 ;c1*xi+c2*xi+1MPY .M2XA8,B2,B3 ;c3*yiADD .L2XB3,A9,B5 ;c1*xi+c2*xi+1+c3*yiSHR .S2B5,15,B2 ;yi+1STH .D2B2,*B4++ ;存储
yi+1[A1]SUB .L1A1,1,A1 ;循环计数器递减[A1]B .S1LOOP ;跳转至loop当前第34页\共有83页\编于星期二\13点5.5.5线模迭代间隔安排表5-14是IIR滤波器的模迭代间隔表,表中SHR指令及时在周期10结束,以便下次迭代的MPYp2在周期11读取其结果。当前第35页\共有83页\编于星期二\13点5.5.6使用汇编优化器处理IIR滤波器【例5.40】IIR滤波器的线性汇编。.global_iir_iir:.cprocx,y,c1,c2,c3.regxi,xi1,yi1.regp0,p1,p2,s0,s1,cntrMVK 100,cntr ;cntr=100LDH .D2*y++,yi1 ;yi+1LOOP: .trip100LDH .D1*x++,xi ;xiMPY .M1c1,xi,p0 ;c1*xiLDH .D1*x,xi1 ;xi+1MPY .M1Xc2,xi1,p1 ;c2*xi+1ADD .L1p0,p1,s0 ;c1*xi+c2*xi+1MPY .M2Xc3,yi1,p2 ;c3*yiADD .L2Xs0,p2,s1 ;c1*xi+c2*xi+1+c3*yiSHR .S2s1,15,yi1 ;yi+1STH .D2yi1,*y++ ;存储
yi+1[cntr]SUB .L1cntr,1,cntr ;循环计数器递减[cntr]B .S1LOOP ;跳转至
loop.endproc当前第36页\共有83页\编于星期二\13点5.5.7最后汇编例5.41是IIR滤波器的最后汇编代码,代码中,循环外有一个取y[0]指令,除此之外没有取y数组指令,执行该代码需要408个周期((4×100)+8)。【例5.41】IIR滤波器的汇编代码。当前第37页\共有83页\编于星期二\13点5.6循环中的IF-Then-Else语句5.6.1IF-Then-Else的C代码【例5.42】IF-Then-Else的C代码。intif_then(shorta[],intcodeword,intmask,shorttheta){ inti,sum,cond; sum=0; for(i=0;i<32;i++) { cond=codeword&mask; if(theta==!(!(cond))) sum+=a[i]; else sum–=a[i]; mask=mask<<1; } return(sum);}当前第38页\共有83页\编于星期二\13点5.6.2转换C代码为线性汇编【例5.43】IF-Then-Else内核循环的线性汇编。 AND codeword,mask,cond;cond=codeword&mask[cond] MVK 1,cond ;!(!(cond)) CMPEQ theta,cond,if ;(theta==!(!(cond))) LDH *aptr++,ai ;a[i][if] ADD sum,ai,sum ;sum+=a[i][!if] SUB sum,ai,sum ;sum–=a[i] SHL mask,1,mask ;mask=mask<<1;[cntr] ADD –1,cntr,cntr ;计数器递减[cntr] B LOOP ;循环当前第39页\共有83页\编于星期二\13点5.6.3画相关性图图5-17是If-Then-ElseC代码的相关性图。当前第40页\共有83页\编于星期二\13点5.6.4确定最小迭代间隔从表5-15中可以看出,没有一个资源是使用超过两次的,因此,最小迭代间隔仍然为2。单元指令合计/单元单元指令合计/单元.M10.M20.S1SHL&B2.S2MVK1.D1LDH1.L2CMPEQ1.D2ADD&SUB2.L2或.S2AND1.L1,.S1,或.D1.L2,.S2或.D2ADD1非.M单元合计5非.M单元合计4当前第41页\共有83页\编于星期二\13点5.6.5线性汇编资源分配【例5.44】If-Then-Else代码的线性汇编。
.global_if_then _if_then:.cproca,cword,mask,theta .regcond,if,ai,sum,cntr MVK 32,cntr ;cntr=32 ZERO sum ;sum=0LOOP: .trip32 AND .S2Xcword,mask,cond ;cond=codeword&mask[cond] MVK .S21,cond ;!(!(cond)) CMPEQ .L2theta,cond,if ;(theta==!(!(cond))) LDH .D1*a++,ai ;a[i][if] ADD .L1sum,ai,sum ;sum+=a[i][!if] SUB .D1sum,ai,sum ;sum–=a[i] SHL .S1mask,1,mask ;mask=mask<<1;[cntr] ADD .L2–1,cntr,cntr ;计数器递减[cntr] B .S1LOOP ;循环 .returnsum .endproc当前第42页\共有83页\编于星期二\13点5.6.6最后汇编例5.45是软件流水后的最后汇编代码,该循环代码的性能为70个周期。【例5.45】If-Then-Else汇编代码。当前第43页\共有83页\编于星期二\13点5.6.7性能比较【例5.46】
循环次数大于3的If-Then-Else汇编代码。当前第44页\共有83页\编于星期二\13点5.7循环展开5.7.1展开IF-Then-Else的C代码【例5.47】if-Then-Else的C代码。当前第45页\共有83页\编于星期二\13点5.7.2C代码转换会线性汇编【例5.48】循环展开的If-Then-Else内核线性汇编。 AND codeword,maski,condi ;condi=codeword&maski[condi] MVK 1,condi ;!(!(condi)) CMPEQ theta,condi,ifi ;(theta==!(!(condi))) LDH *aptr++,ai ;a[i][ifi] ADD sumi,ai,sumi ;sum+=a[i][!ifi] SUB sumi,ai,sumi ;sum–=a[i] SHL maski,1,maski+1 ;maski+1=maski<<1; AND codeword,maski+1,condi+1 ;condi+1=codeword&maski+1[condi+1] MVK 1,condi+1 ;!(!(condi+1)) CMPEQ theta,condi+1,ifi+1 ;(theta==!(!(condi+1))) LDH *aptr++,ai+1 ;a[i+!][ifi+1] ADD sumi+1,ai+1,sumi+1 ;sum+=a[i+1][!ifi+1] SUB sumi+1,ai+1,sumi+1 ;sum–=a[i+1] SHL maski+1,1,maski ;maski=maski+1<<1;[cntr] ADD –1,cntr,cntr ;计数器递减[cntr] B LOOP ;循环当前第46页\共有83页\编于星期二\13点5.7.3画相关性图可以画出循环展开后的If-Then-Else代码的相关性图如图5-18所示,A侧有9条指令,B侧有7条指令。当前第47页\共有83页\编于星期二\13点5.7.4确定最小迭代间隔从表5-16中看出,没有一个资源使用超过两次,所以最小迭代间隔仍然为3。单元指令合计/单元单元指令合计/单元.M10.M20.S1MVK&2SHLs3.S2MVKandB2.D12LDHs2.L2CMPEQ1.L1ADD&SUB1.L2或.S2AND1.L1或.S11.L2,.S2或.D2SUBand2ADDs3.L1,S1或.D12非.M单元合计9非.M单元合计7当前第48页\共有83页\编于星期二\13点5.7.5线性汇编资源安排划分好相关性图并确定最小迭代间隔为3以后,便可对指令安排功能单元和寄存器,但安排中必须确保没有资源使用多于3次。例5.49所示为带功能单元和寄存器的线性汇编代码。【例5.49】完全循环展开的If-Then-Else的线性汇编。当前第49页\共有83页\编于星期二\13点5.7.6最后汇编例5.50给出了软件流水的最后汇编代码,该循环的执行周期数为53。【例5.50】展开的If-Then-Else汇编代码。当前第50页\共有83页\编于星期二\13点5.8生命太长问题5.8.1具有生命太长问题的C代码例5.51所示是具有生命太长问题的C代码,该代码不能靠重新安排父指令解决生命太长问题,尽管从C代码中不能明显地看出来。【例5.51】具有生命太长问题的C代码。当前第51页\共有83页\编于星期二\13点5.8.2C代码转换为线性汇编【例5.52】生命太长内核循环的线性汇编。LDH *aptr++,ai ;从存储体加载aiLDH *bptr++,bi ;从存储体加载biMPY ai,c,a0 ;a0=ai*cSHR a0,15,a1 ;a1=a0>>15MPY a1,d,a2 ;a2=a1*dADD a2,a0,a3 ;a3=a2+a0ADD sum0,a3,sum0 ;sum0+=a3MPY bi,c,b0 ;b0=bi*cSHR b0,15,b1 ;b1=b0>>15MPY b1,e,b2 ;b2=b1*eADD b2,b0,b3 ;b3=b2+b0ADD sum1,b3,sum1 ;sum1+=b3[cntr]SUB cntr,1,cntr ;循环计数器递减[cntr]B LOOP ;跳转到loop当前第52页\共有83页\编于星期二\13点5.8.3画相关性图图5-19所示为生命太长代码相关性图,该算法包含3个各自独立的图,其中两个独立图中有分开的联合路径,从a0到a3与从b0到b3。当前第53页\共有83页\编于星期二\13点5.8.4确定最小迭代间隔根据图5-19的相关性图和线性汇编指令可得出生命太长代码的资源表如表5-17所示。单元指令合计/单元单元指令合计/单元.M1MPY2.M2MPY2.S1B&SHR2.S2SHR1.D1LDHs1.D2LDH1.L1,S1或.D12ADDs2.L2,.S2或.D22ADDsandSUB3非.M单元合计5非.M单元合计5当前第54页\共有83页\编于星期二\13点5.8.4确定最小迭代间隔图5-20是加MV指令的新相关图,该图左边的叉路由MV指令分成两段。当前第55页\共有83页\编于星期二\13点5.8.5线性汇编资源安排例5.53是根据相关图得出的安排功能单元的线性汇编,此处使用了两个2x和一个1x通路,c、d、和e可以载入循环外的另一端寄存器中。【例5.53】生命太长代码的线性汇编。当前第56页\共有83页\编于星期二\13点5.8.6带MV指令的最后汇编例5.54是带有MV指令的生命太长代码的最后汇编代码,执行该代码需要212个周期(200*100+11+1)。【例5.54】带有MV指令的生命太长代码的最后汇编代码。当前第57页\共有83页\编于星期二\13点5.9消除冗余取数5.9.1转换C代码为线性汇编【例5.57】FIR滤波器内核循环的线性汇编。LDH .D2*x_1++[2],x1 ;x1=x[j+i+1]LDH .D1*h++[2],h0 ;h0=h[i]MPY .M1x0,h0,p00 ;x0*h0MPY .M1Xx1,h0,p10 ;x1*h0ADD .L1p00,sum0,sum0 ;sum0+=x0*h0ADD .L2Xp10,sum1,sum1 ;sum1+=x1*h0LDH .D1*x++[2],x0 ;x0=x[j+i+2]LDH .D2*h_1++[2],h1 ;h1=h[i+1]MPY .M2x1,h1,p01 ;x1*h1MPY .M2Xx0,h1,p11 ;x0*h1ADD .L1Xp01,sum0,sum0 ;sum0+=x1*h1ADD .L2p11,sum1,sum1 ;sum1+=x0*h1[ctr] SUB .S2ctr,1,ctr ;循环计数器递减[ctr] B .S2LOOP ;跳转至loop当前第58页\共有83页\编于星期二\13点5.9.2画相关性图图5-21是消除冗余取后的FIR滤波器的相关性图。当前第59页\共有83页\编于星期二\13点5.9.3确定最小迭代间隔表5-18是FIR滤波器代码的资源表,可以确定最小迭代间隔为2,这意味着每个周期可执行两个乘累加操作。单元指令合计/单元单元指令合计/单元.M12MPY2.M22MPY2.S1B&SHR0.S2B1.D12LDH2.D22LDHs2.L1,S1或.D12ADDs2.L2,.S2或.D22ADDsandSUB3非.M单元合计4非.M单元合计61x路径22x路径2当前第60页\共有83页\编于星期二\13点5.9.4线性汇编资源分配【例5.58】
例
FIR滤波器的线性汇编。当前第61页\共有83页\编于星期二\13点5.9.5最后汇编该嵌套循环执行的总周期数为2350,此处每个外循环都有15个周期的开销:9个周期执行内环填充;6个周期执行到外环的跳转。【例5.59】例消除冗余取指令的最终FIR滤波器汇编代码。当前第62页\共有83页\编于星期二\13点5.10存储体5.10.1FIR滤波器的内核循环【例5.60】FIR滤波器最后汇编代码的内核循环。LOOP: ADD .L2XA8,B9,B9 ;sum1+=x1*h0|| ADD .L1A7,A9,A9 ;sum0+=x0*h0|| MPY .M2B1,B0,B7 ;*x1*h1|| MPY .M1XB1,A1,A8 ;*x1*h0||[B2]B .S2LOOP ;**跳转至内循环|| LDH .D1*A5++[2],A1 ;****h0=h[i]|| LDH .D2*B5++[2],B1 ;****x1=x[j+i+1] ADD .L1XB7,A9,A9 ;sum0+=x1*h1|| ADD .L2B8,B9,B9 ;sum1+=x0*h1|| MPY .M2XA0,B0,B8 ;*x0*h1|| MPY .M1A0,A1,A7 ;**x0*h0||[B2]SUB .S2B2,1,B2 ;***内循环计数器递减|| LDH .D2*B4++[2],B0 ;****h1=h[i+1]|| LDH .D1*A4++[2],A0 ;****x0=x[j+i+2]当前第63页\共有83页\编于星期二\13点5.10.1FIR滤波器的内核循环画出数组的奇偶元素的读取安排在同一循环周期内的FIR滤波器相关图,如图5-24所示。当前第64页\共有83页\编于星期二\13点5.10.2展开的FIR滤波器的C代码例5.61是展开内核循环后的FIR滤波器C代码,该方法增加了安排指令的灵活性,而在不考虑数组存储形式和存储器block的情况下,写出不产生存储体冲突的FIR滤波器代码。【例5.61】展开内核循环后的FIR滤波器C代码。当前第65页\共有83页\编于星期二\13点5.10.3将C代码转换为线性汇编例5.62为循环展开的FIR滤波器C代码内核循环的线性汇编。【例5.62】展开的FIR滤波器内核循环线性汇编。当前第66页\共有83页\编于星期二\13点5.10.4画相关性图图5-25是不存在存储器冲突的FIR滤波器的相关性图。当前第67页\共有83页\编于星期二\13点5.10.5含有.mptr命令的展开后FIR线性汇编例5.63给出了具有.mptr伪指令的展开FIR滤波器内核循环的线性汇编,.mptr伪指令允许汇编优化器根据特定指针寄存器和存储器访问信息,确定两个存储器操作是否存在bank冲突。【例5.63】展开的FIR滤波器线性汇编。当前第68页\共有83页\编于星期二\13点5.10.6线性汇编资源分配随着一个循环内的指令数的增加,对该循环内的每个数值安排特定的寄存器越来越困难,由于TMS320C6000仅有32个寄存器,如果一个循环内有33条指令,且每一条指令都有一个数值,则这些数值不能单独占用一个寄存器,而是由该循环中不在相同周期存活的数值分享寄存器,手工安排寄存器虽然不复杂,但是可能会很慢。当前第69页\共有83页\编于星期二\13点5.10.7确定最小迭代间隔如表5-19所示为FIR滤波器代码资源,没有存储器冲突的FIR滤波器的最小迭代间隔应该是4,这意味着每周期完成2个乘累加。单元指令合计/单元单元指令合计/单元.M14MPY4.M24MPY2.S10.S2B1.D14LDHs4.D24LDHs2.L1,S1或.D14ADDs4.L2,.S2或.D24ADDsandSUB3非.M单元合计8非.M单元合计101x路径42x路径4当前第70页\共有83页\编于星期二\13点5.10.8最后汇编例5.64是消除冗余取和无存储器冲突的FIR滤波器的最后汇编代码,该代码的执行周期数为2402(50(8*4+10+6)+2),其外环开销为16个周期。【例5.64】消除冗余取和无存储器冲突的FIR滤波器汇编代码。当前第71页\共有83页\编于星期二\13点5.11软件流水外循环5.11.1展开FIR滤波器的C代码【例5.65】循环展开后的FIR滤波器C代码。当前第72页\共有83页\编于星期二\13点5.11.2最后汇编例5.66是软件流水外环的FIR滤波器的最后汇编代码。在内循环后的每条指令注释中使用了e、p或o标记,分别表示指令是排空、填充和外环指令。【例5.66】消除冗余取、无存储器冲突和软件流水外环的FIR滤波器汇编代码。当前第73页\共有83页\编于星期二\13点5.12同内循环一起条件执行外循环5.12.1展开FIR滤波器的C代码【例5.67】展开后的FIR滤波器C代码。当前第74页\共有83页\编于星期二\13点5.12.2将内核循环的C代码转换为线性汇编【例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 木质素燃料颗粒机行业跨境出海战略研究报告
- 直播电商数据分析报表行业跨境出海战略研究报告
- 网络魔术道具租赁业务企业制定与实施新质生产力战略研究报告
- 煤炭焦化节能改造企业制定与实施新质生产力战略研究报告
- 生物质气化技术设备行业跨境出海战略研究报告
- 废气臭氧催化氧化装置企业制定与实施新质生产力战略研究报告
- 虚拟现实低碳体验企业制定与实施新质生产力战略研究报告
- 在线教育平台新教师支持计划
- 小学一年级下学期英语口语训练计划
- 国学社团成员培训计划
- 情绪管理完整
- 2022年海南省高考物理真题试卷含答案与解析
- 意识障碍诊疗规范2023版
- 仪表检修规程
- 《市场营销学》吴建安
- 机动车辆保险理赔行业标准化单证(2013年参考版)
- 煤矿电气设备防爆检查细则
- 国家电网有限公司十八项电网重大反事故措施
- 耕整地机械使用与维护-深松机的使用与维护
- GB/T 18882.1-2023离子型稀土矿混合稀土氧化物化学分析方法第1部分:十五个稀土元素氧化物配分量的测定
- 中国联通光传送网 WDM OTN 安全白皮书
评论
0/150
提交评论