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