线性汇编优化代码.ppt
《线性汇编优化代码.ppt》由会员分享,可在线阅读,更多相关《线性汇编优化代码.ppt(84页珍藏版)》请在三一办公上搜索。
1、第5章 线性汇编优化代码,5.1 汇编优化器选项与伪指令,5.2 编写并行代码,5.3 软件流水,5.4 多周期循环的模迭代,5.5 循环传递路径,5.6 循环中的IF-Then-Else语句,5.7 循环展开,5.8 生命太长问题,5.9 消除冗余取数,5.10 存储体,5.11 软件流水外循环,5.12 同内循环一起条件执行外循环,5.13 通用目标文件格式(COFF),5.1 汇编优化器选项与伪指令,(1)-on选项(2)-mt选项和no_mdep伪指令(3).mdep伪指令(4).mptr伪指令(5).trip伪指令,5.2 编写并行代码,5.2.1 点积的C代码a)定点点积的C代码i
2、nt dotp(short a,short b)int sum,i;sum=0;for(i=0;i100;i+)sum+=ai*bi;return(sum);,5.2.1 点积的C代码,b)浮点点积的C代码float dotp(float a,float b)int i;float sum;sum=0;for(i=0;i100;i+)sum+=ai*bi;return(sum);,5.2.2 C代码转换为线性汇编,【例5.4】定点点积的C代码内循环的线性汇编指令。LDH.D1*A4+,A2;从存储器加载aiLDH.D1*A3+,A5;从存储器加载bi MPY.M1 A2,A5,A6;ai*bi
3、ADD.L1 A6,A7,A7;sum+=(ai*bi)SUB.S1 A1,1,A1;递减循环计数器A1 B.S2 LOOP;跳转到循环,5.2.2 C代码转换为线性汇编,【例5.5】浮点点积的C代码内循环的线性汇编指令LDW.D1*A4+,A2;从存储器加载ai LDW.D2*A3+,A5;从存储器加载bi MPYSP.M1 A2,A5,A6;ai*biADDSP.L1 A6,A7,A7;sum+=(ai*bi)SUB.S1 A1,1,A1;递减循环计数器A1 B.S2 LOOP;跳转到循环,5.2.3 画相关性图,1.定点点积图5-1为例5.4中定点点积汇编指令的相关性图以及相应的寄存器分
4、配。,5.2.3 画相关性图,2.浮点点积图5-2给出了例5.5浮点点积的相关图以及相应的寄存器分配框图。,5.2.4 非并行汇编代码与并行汇编代码,1.定点点积【例5.6】定点点积的非并行汇编代码。MVK.S1 100,A1;建立循环计数器ZERO.L1 A7;累加器清零LOOP:LDH.D1*A4+,A2;从存储器加载aiLDH.D1*A3+,A5;从存储器加载biNOP 4;为LDH延迟一个时隙MPY.M1 A2,A5,A6;ai*biNOP;为MPY延迟一个时隙ADD.L1 A6,A7,A7;sum+=(ai*bi)SUB.S1 A1,1,A1;循环计数器递减A1 B.S2 LOOP;
5、跳转到LOOP处NOP 5;为LOOP延迟时隙;此处发生跳转,5.2.4 非并行汇编代码与并行汇编代码,用同一个功能单元分配两个LDH指令,这样会降低循环的性能,因此,重新安排功能单元以使代码并行执行,其相关性图如图5-3所示,并行汇编代码见例5.7。,5.2.4 非并行汇编代码与并行汇编代码,【例5.7】定点点积的并行汇编代码。MVK.S1 100,A1;建立循环计数器|ZERO.L1 A7;累加器清零LOOP:LDH.D1*A4+,A2;从存储器加载ai|LDH.D2*B4+,B2;从存储器加载biSUB.S1 A1,1,A1;循环计数器递减A1 B.S2 LOOP;跳转到loopNOP
6、2;为LDH延迟时隙MPY.M1X A2,B2,A6;ai*biNOP;为MPY延迟时隙ADD.L1 A6,A7,A7;sum+=(ai*bi);此处发生跳转e,5.2.4 非并行汇编代码与并行汇编代码,【例5.8】浮点点积的非并行汇编代码MVK.S1 100,A1;建立循环计数器ZERO.L1 A7;累加器清零LOOP:LDW.D1*A4+,A2;从存储器加载aiLDW.D1*A3+,A5;从存储器加载biNOP 4;为LDW延迟时隙MPYSP.M1 A2,A5,A6;ai*biNOP 3;为MPYSP延迟时隙ADDSP.L1 A6,A7,A7;sum+=(ai*bi)NOP 3;为ADDS
7、P延迟时隙SUB.S1 A1,1,A1;循环计数器递减A1 B.S2 LOOP;跳转到loopNOP 5;为跳转延迟时隙;此处发生跳转,5.2.4 非并行汇编代码与并行汇编代码,分配两个LDW指令用了同一个功能单元,从而降低了循环的性能,因此,重新安排功能单元以使代码并行执行,其相关性图如图5-4所示,并行汇编代码如例5.9。,5.2.4 非并行汇编代码与并行汇编代码,【例5.9】浮点点积的并行汇编代码MVK.S1 100,A1;建立循环计数器|ZERO.L1 A7;累加器清零LOOP:LDW.D1*A4+,A2;从存储体中加载ai|LDW.D2*B4+,B2;从存储体中加载bi SUB.S1
8、 A1,1,A1;循环计数器递减NOP 2;LDW 延迟时隙A1 B.S2 LOOP;跳转到loopMPYSP.M1X A2,B2,A6;ai*biNOP 3;MPYSP延迟时隙ADDSP.L1 A6,A7,A7;sum+=(ai*bi);此处发生跳转,5.2.4 非并行汇编代码与并行汇编代码,2.性能比较表5-1为定点点积/浮点点积的非并行与并行汇编代码的性能比较。,5.2.5 适用字访问短型数据与使用双字访问,1.点积C代码的循环展开2.C代码转换为线性汇编3.画相关性图4.线性汇编资源分配5.最后的汇编代码,5.3 软件流水,5.3.1 模迭代间隔编排表1.定点实例2.浮点实例3.确定最
9、小迭代间隔4.建立一个完全流水的编排表5.用多个周期指令交错累加,5.3.2 使用汇编优化器产生优化循环,【例5.20】完整的定点点积的线性汇编代码。.global _dotp_dotp:.cproc a,b.reg sum,sum0,sum1,cntr.reg ai_i1,bi_i1,pi,pi1MVK 50,cntr;cntr=100/2ZERO sum0;相乘的结果 result=0ZERO sum1;相乘的结果 result=0LOOP:.trip 50LDW*a+,ai_i1;从存储体加载 ai 计算最后的结果.return sum.endproc,5.3.2 使用汇编优化器产生优化
10、循环,【例5.21】完整的浮点点积的线性汇编代码.global _dotp_dotp:.cproc a,b.reg sum,sum0,sum1,a,b.reg ai1:ai,bi1:bi,pi,pi1MVK 50,cntr;cntr=100/2ZERO sum0;相乘的结果result=0ZERO sum1;相乘的结果result=0LOOP:.trip 50LDDW*a+,ai1:ai;从存储体加载ai 计算最后的结果.return sum.endproc,5.3.2 最后的汇编,1.定点的例子2.浮点的例子3.消除额外指令(1)定点点积的例子(2)浮点点积的例子4.循环灌入(1)定点点积的
11、例子(2)浮点点积的例子5.移除多余的SUB指令6.性能比较,5.4 多周期循环的模迭代,5.4.1 转换C代码为线性汇编【例5.30】加权矢量和内核循环的线性汇编代码。LDH*aptr+,ai;aiLDH*bptr+,bi;biMPY m,ai,pi;m*aiSHR pi,15,pi_scaled;(m*ai)15ADD pi_scaled,bi,ci;ci=(m*ai)15+biSTH ci,*cptr+;存储 cicntrSUB cntr,1,cntr;循环计数器递减cntrB LOOP;跳转到 loop,5.4.2 确定最小迭代间隔,1.展开的加权矢量和的C代码2.转换展开的内核循环为
12、线性汇编3.确定新的最小迭代间隔,5.4.3 画相关性图,图5-11把相关性图均匀分成了两个部分,最小迭代间隔为2。,5.4.4 线性汇编资源分配,【例5.33】带资源分配的加权矢量和的线性汇编程序。LDW.D2*A4+,A2;ai 跳转至 loop,5.4.5 模迭代间隔编排,1.资源冲突2.生命太长3.解决生命生命太长的问题4.安排剩余指令,5.4.6 使用汇编优化器出来加权矢量和,例5.34为加权矢量和的线性汇编,该代码作为汇编优化器的输入,由汇编优化器产生软件流水循环。【例5.34】加权矢量和的线性汇编。,5.4.7 最后汇编,该代码包括如下优化:,由于第次迭代的STHci+1与第+1
13、次迭代的STHci并行执行,为防止STHci+执行次,而STHci执行次,对循环限定执行49次,但在循环退出后安排ADD ci+1和STHci+指令;用于ADD指令的mask由MVK和MVKH指令设置;数组C的奇元素指针也在前面填充部分设置。【例5.35】加权矢量和汇编代码。,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*ypt
14、r+,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+1cntrSUB cntr,1,cntr;循环计数器递减cntrB LOOP;跳转至loop,5.5.2 画相关性图,图5-15是IIR滤波器的相关性图,从存yi+1到取yi之间形成了一个循环传递路径,由于存取指令使用相同的存储器流水线。,5.5.3 确定最小迭代间隔,1.画新的相关性图图5-16中所示是一个循环传递路径为4(2+1+1)的新的相关性图,因为MPY p2指令能够直接从寄存器中读取yi+
15、1,因此循环传递路径可以减少6个周期,,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+1cntrSUB cntr,1,cntr;循环计数器递减cn
16、trB LOOP;跳转至loop,5.5.4 线性汇编资源分配,【例5.39】带分配资源的IIR内核循环线性汇编。LDH.D1*A4+,A2;xi+1MPY.M1 A6,A2,A5;c1*xiLDH.D1*A4,A3;xi+1MPY.M1X B6,A3,A7;c2*xi+1ADD.L1 A5,A7,A9;c1*xi+c2*xi+1MPY.M2X A8,B2,B3;c3*yiADD.L2X B3,A9,B5;c1*xi+c2*xi+1+c3*yiSHR.S2 B5,15,B2;yi+1STH.D2 B2,*B4+;存储 yi+1A1 SUB.L1 A1,1,A1;循环计数器递减A1 B.S1 L
17、OOP;跳转至loop,5.5.5 线模迭代间隔安排,表5-14是IIR滤波器的模迭代间隔表,表中SHR指令及时在周期10结束,以便下次迭代的MPY p2在周期11读取其结果。,5.5.6 使用汇编优化器处理IIR滤波器,【例5.40】IIR滤波器的线性汇编。.global _iir_iir:.cproc x,y,c1,c2,c3.reg xi,xi1,yi1.reg p0,p1,p2,s0,s1,cntrMVK 100,cntr;cntr=100LDH.D2*y+,yi1;yi+1LOOP:.trip 100LDH.D1*x+,xi;xiMPY.M1 c1,xi,p0;c1*xiLDH.D1
18、*x,xi1;xi+1MPY.M1X c2,xi1,p1;c2*xi+1ADD.L1 p0,p1,s0;c1*xi+c2*xi+1MPY.M2X c3,yi1,p2;c3*yiADD.L2X s0,p2,s1;c1*xi+c2*xi+1+c3*yiSHR.S2 s1,15,yi1;yi+1STH.D2 yi1,*y+;存储 yi+1cntr SUB.L1 cntr,1,cntr;循环计数器递减cntr B.S1 LOOP;跳转至 loop.endproc,5.5.7 最后汇编,例5.41是IIR滤波器的最后汇编代码,代码中,循环外有一个取y0指令,除此之外没有取y数组指令,执行该代码需要408
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 汇编 优化 代码
链接地址:https://www.31ppt.com/p-5373759.html