您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 6_2 C6000软件优化 线性汇编
第6章C6000软件优化第2节线性汇编和汇编优化器写线性汇编代码使用汇编优化器多周期循环的软件流水汇编优化器选项和伪指令本节学习内容主要内容一、写线性汇编代码二、写线性汇编代码举例—点积三、调用汇编优化器四、多周期循环的软件流水五、加权矢量和(WVS)循环展开一、写线性汇编代码1、软件工具流程2、线性汇编文件基本考虑事项线性汇编文件使用“.sa”扩展名仅对指定的代码段进行优化,指定代码段外的代码被拷贝为输出“.asm”文件线性汇编过程可以:传递参数返回结果使用符号变量不考虑流水线问题二、写线性汇编代码举例—点积1、点积线性汇编线性汇编不需要指出和考虑:功能单元寄存器延迟间隙2、确定优化代码段Dotp:.cproczerosumloop:ldh*p_m++,mldh*p_n++,nmpym,n,prodaddprod,sum,sum[count]subcount,1,count[count]bloop.endproc.cproc/.endproc:确定要优化的代码段必须成对使用可作为C调用的函数在汇编代码中使用.proc/.endproc确定要优化的代码段,它们也必须成对使用3、使用符号变量Dotp:.cproc.regp_m,m,p_n,n,prod,sum,countzerosumloop:ldh*p_m++,mldh*p_n++,nmpym,n,prodaddprod,sum,sum[count]subcount,1,count[count]bloop.endproc.reg伪指令:声明符号变量,变量由优化器选择与功能单元一致的寄存器.reg在.(c)proc/.endproc内有效当变量为40/64bit时,变量使用寄存器对格式:如ahi:alo4、参数传递Dotp:.cprocp_m,p_n,count.regp_m,m,p_n,n,prod,sum,countzerosumloop:ldh*p_m++,mldh*p_n++,nmpym,n,prodaddprod,sum,sum[count]subcount,1,count[count]bloop.returnsum.endproc.cproc[variable1[,variable2,]]:给出输入参数.return:给出返回结果.return仅在.cproc/.endproc内有效.proc[register1[,register2,]];给出输入参数.regp_m,mvregister1,p_m;建立输入寄存器:;与变量关系mvsum,register1.endproc[register1[,register2,]];给出返回结果5、保护寄存器Dotp:.cprocp_m,p_n,count.regp_m,m,p_n,n,prod,sum,count.reservea3zerosumloop:ldh*p_m++,mldh*p_n++,nmpym,n,prodaddprod,sum,sum[count]subcount,1,count[count]bloop.returnsum.endproc.reserve指出需要保护的寄存器当.cproc/.endproc内的代码明显使用了要保护的寄存器,优化器也可能使用该寄存器,如:6、流水代码的最小循环次数具有填充和排空5次运算迭代,循环计数设置为3最小循环次数:3循环测试7、计算最小循环次数最小循环次数=循环和排空的周期数这个点积代码最小循环次数=?8、冗余循环非流水代码执行较慢运算迭代次数=最小循环次数流水代码执行较快9、消除冗余循环关闭软件流水(-mu)减小代码尺寸,但也减小吞吐量指出运算迭代次数(.trip)如果.trip≧最小循环次数,仅产生流水循环如果.trip最小循环次数,产生两种循环不产生冗余循环(-ms)如果没给出.trip,仅产生不流水循环如果给出.trip,且.trip≧最小循环次数,仅产生流水循环10、指出运算迭代次数_Dotp:.cprocp_m,p_n,count.regp_m,m,p_n,n,prod,sum,countzerosumloop:.trip40ldh*p_m++,mldh*p_n++,nmpym,n,prodaddprod,sum,sum[count]subcount,1,count[count]bloop.returnsum.endproc指出运算迭代次数11、点积的完整线性汇编Dotp:.cprocp_m,p_n,count.regp_m,m,p_n,n,prod,sum,countzerosumloop:.trip40ldh*p_m++,mldh*p_n++,nmpym,n,prodaddprod,sum,sum[count]subcount,1,count[count]bloop.returnsum.endproc三、调用汇编优化器调用汇编优化器和汇编器仅调用汇编器四、多周期循环的软件流水1、软件流水过程1.用C语言实现算法并验证2.写C6x线性汇编代码3.画相关图4.分配功能单元和寄存器5.建编排表6.将编排表转换为C6x汇编代码第一步:C代码第二步:线性汇编代码第三步:相关图第四步:分配功能单元2周期循环2个周期/每次循环迭代迭代间隔:每次循环迭代占用的周期数多周期循环第五步:建迭代间隔编排表(1)第五步:建迭代间隔编排表(2)第五步:建迭代间隔编排表(3)第五步:建迭代间隔编排表(4)第五步:建迭代间隔编排表(5)第五步:建迭代间隔编排表(6)展开加权矢量和代码展开加权矢量和:2个结果/每3个周期要点:循环展开,充分利用资源.D单元数/每次循环结果/每次循环循环周期312623五、汇编优化器选项和伪指令-on选项-mt选项和.no_mdep伪指令【C程序的restrict关键字】.mdep伪指令.mptr伪指令.trip伪指令【C程序的MUST_ITERATEpragma】-on选项软件流水需要选择-o2或-o3选项-o=-o2-o3优化的工作:文件级优化1.删除未使用的所有函数2.当函数的返回值没有用到时,简化函数返回的形式3.内联小的函数4.重新对函数声明进行排序。这样就使得当优化调用代码时,被调用函数的属性是已知的。5.当所用调用都传递一个相同的参数时,把这个参数直接放到函数体中去,不再通过寄存器/存储器的方式传递这个参数。6.识别文件级变量的特征-o3+-pm:程序级优化如果一个函数中的一个特殊的变量的值总是一样的,编译器会用这个值直接代替该变量,直接进行值传递而不是参数传递。如果一个函数的返回值都没有被用到,编译器就会删除这个函数的返回值。如果一个函数没有被直接或间接地被调用,编译器就会删除这个函数。-mt选项和.no_mdep伪指令因为当你执行读取或存储指令时,汇编优化器并不知道你要访问的对象在哪里,所以汇编优化器就非常保守地认为存储器操作之间有相关性。汇编优化器会确保在下一次从reg1地址中读取数据之前往reg5地址中存储数据的工作已经完成。如果要存的.reg5中的地址不是“reg1”要读取的下一个地址,将导致循环优化效果不好。对于那些“reg5”是指向“reg1”的下一个地址的循环,这些是必要的。对于大部分的循环,并不是这样的,可以告诉汇编优化器更积极地安排存储器操作。可以通过在线性汇编函数中使用“.no_mdep”(无存储器相关性)伪指令或者在编译线性汇编文件的时候用-mt选项实现。.mdep伪指令假如你需要指明2个或更多的存储体的相关性,你可以使用.mdep伪指令。用存储体相关性标号来注释你的代码,并且在线性汇编函数中加上.mdep伪指令。当使用了.no_mdep或-mt后,才需要使用.mdep伪指令。.mdep伪指令表明从LDW指令到STW指令中有存储体相关性。这就意味着STW指令必须在LDW指令后执行。.mdep伪指令不表明在STW指令到LDW指令中存在存储体相关性。要处理后一种情况,还需要一个.mdep伪指令。.mptr伪指令.mptr伪指令给汇编优化器提供了怎样避免存储体(bank)冲突的内容。汇编优化器会重新安排汇编代码中生成的存储体引用,以避免存储器的冲突,这些冲突是由伪指令.mptr指明的。这意味着通过避免存储器的冲突,汇编优化器产生的代码的执行速度会更快,没有因为存储体冲突而出现流水线停顿(stall)的情况。.mptr伪指令C64的L1D的存储体结构:8×32bit流水线停顿同一周期对同一bank的两次读取引起流水线阻塞的情况。LDW.D1*A4++,A5;load1,A4addressisinbank0||LDW.D2*B4++,B5;load2,B4addressisinbank0.mptr伪指令例子:点积.mptr伪指令例子:点积(续).trip伪指令label:.tripminimum_value[,maximumvalue[,factor]]Loop:.trip10告诉汇编优化器循环迭代的次数至少10次。Loop:.trip20,20告诉汇编优化器循环迭代20次。Loop:.trip8,48,8告诉汇编优化器循环迭代的次数是8,16,24,32,40或48次。当你的循环需要中断时,最大值参数和因子(factor)参数都是非常有用的。
本文标题:6_2 C6000软件优化 线性汇编
链接地址:https://www.777doc.com/doc-6325746 .html