资源预览内容
第1页 / 共84页
第2页 / 共84页
第3页 / 共84页
第4页 / 共84页
第5页 / 共84页
第6页 / 共84页
第7页 / 共84页
第8页 / 共84页
第9页 / 共84页
第10页 / 共84页
亲,该文档总共84页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
CCS软件优化赵翠芳主要内容n优化方法n软件流水n多周期循环流水线设计n理解软件优化结果的反馈信息优化方法优化和优化过程概述(复习)利用代码生成工具对C代码进行优化(复习)汇编代码的优化概述n程序优化:对软件代码进行处理以获得以下两个主要目标:更快的运行时间更大的代码大小Note:一般在更快的执行速度和更小的代码大小之间需要进行一个折中(trade off)概述n1个时钟周期内让尽可能多的功能单元在执行指令。趋近8*主频(MHz) MIPSn前提:满足各种资源限制(resource bound)n途径:(1)资源合理分配、充分使用(2)算法映射结构 DSP适合对大量数据做相同的运算概述n为实现高效代码,编程者必须熟练掌握以下几个方面的知识: 处理器结构 编程语言:C、汇编、线性汇编 代码生成工具:编译器、汇编器、连接器代码优化的三个层次n1、C语言级的优化n2、线性汇编优化n3、手工汇编优化C语言级的优化编译器选项nC优化编译器使用ANSI C代码语言,可达到手工汇编代码效率的80%。如选择-o2,-o3等n整个优化过程包括不同阶段、不同层次的优化。n必须掌握每个阶段、层次的优化知识。C语言级优化 C语言程序优化n通过下述方法改进C语言程序,可以提供编译出代码的性能:1、使用intrinsics内联函数替代复杂的C语言程序。2、对短字长的数据使用宽长度的存储器访问数据打包处理(Packed Data Processing)3、改进C语言循环程序,使之更有利于用软件流水技术优化。线性汇编语言简介线性汇编语句的基本结构线性汇编中的伪指令线性汇编资源安排C代码转换为线性汇编线性汇编语句的基本结构n基本格式与汇编语言相同,必须是ASCII码文件,扩展名必须是”.sa”,用作汇编优化器的输入文件nLabel: | register mnemonic unit specifier operand list ;commend线性汇编中的伪指令1、调用一个函数.call ret_reg=func_name(arg1,arg2)(仅在过程procedure)内有效2、定义一个可被汇编优化器优化,而且可被C/C+当做函数调用的线性汇编代码段的伪指令。 label .cproc vari1,vari2, 起始 .endproc 结束3、定义一个可被汇编优化器优化的线性汇编代码段的伪指令。 label .proc vari1,vari2, 起始 .endproc 结束线性汇编中的伪指令4、表明存储器地址相关与不相关的伪指令 .mdepsymbol1,symbol2 1,2相关 .no_mdep 其后定义的函数段内存储器地址不相关5、定义变量,或者说描述存入寄存器的数值变量的伪指令:.reg variable1,variable2, 6、过程的返回值 .return argument7、指出循环迭代次数的伪指令 label .trip minimum value线性汇编资源安排读取指令(LDH)必须使用.D单元乘法指令(MPY)必须使用.M单元加法指令(ADD)必须使用.L单元减法指令(SUB)必须使用.S单元跳转指令(B)必须使用.S单元线性汇编线性汇编文件使用“.sa”扩展名线性汇编过程可以:q传递参数q返回结果q使用符号变量q不考虑流水线问题写线性汇编代码举例点积写线性汇编代码举例FIR滤波器简写为C代码转换为线性汇编nshort DP(short *m, short *n, short count)n n short i ;n short product ;n short sum = 0 ;n for(i=0;i 1 ;n for(i=0;icount;i+)n n pro_l = _mpy( data_ai, data_xi) ;n pro_h = _mpyh( data_ai, data_xi) ;n sum_l += pro_l ; n sum_h += pro_h ;n n sum = sum_l + sum_h ;n return( sum) ;n n .def _DPn _DP .cproc cptr0,cptr1,vptrn .reg addr_a,addr_xn .reg product0,product1,sum0,sum1n .reg m,nn MV cptr0,addr_an MV cptr1,addr_xn ZERO sum0n ZERO sum1n SHR vptr,1,vptr n loop: n LDW *addr_a+,mn LDW *addr_x+,nn MPY m,n,product0n MPYH m,n,product1n ADD sum0,product0,sum0n ADD sum1,product1,sum1n SUB vptr,1,vptrn vptr B loopn ADD sum0,sum1,sum0n .return sum0n .endproc 保护寄存器DotpDotp:.:.cproccprocp_m,p_n,countp_m,p_n,count.regregp_m,m,p_n,n,p_m,m,p_n,n,prod,sum,countprod,sum,count.reservea3.reservea3zerosumzerosumloop:loop:ldhldh*p_m+,m*p_m+,mldhldh*p_n+,n*p_n+,nmpympym,n,prodm,n,prodaddprod,sum,sumaddprod,sum,sumcountsubcount,1,countcountsubcount,1,countcountbloopcountbloop.returnsum.returnsum. .endprocendproc .reserve.reserve指出需要保护的寄存器当. .cproccproc/./.endprocendproc内的代码明显使用了要保护的寄存器,优化器也可能使用该寄存器,如:指出运算迭代次数DotpDotp:.:.cproccprocp_m,p_n,countp_m,p_n,count.regregp_m,m,p_n,n,p_m,m,p_n,n,prod,sum,countprod,sum,countzerosumzerosumloop:loop:.trip40.trip40ldhldh*p_m+,m*p_m+,mldhldh*p_n+,n*p_n+,nmpympym,n,prodm,n,prodaddprod,sum,sumaddprod,sum,sumcountsubcount,1,countcountsubcount,1,countcountbloopcountbloop.returnsum.returnsum. .endprocendproc指出运算迭代次数汇编优化汇编优化n可以通过以下方法对代码进行优化(1)写并行代码(2)有用的代码填充延迟间隙(3)循环展开(4)字长优化第一步:写并行代码第一步:写并行代码第一步:写并行代码第二步:有用的代码填充延迟间隙第三步:循环展开n每循环一次,SUB and B指令至少会由两个附加的周期第四步:字长优化n使用字访问半字数据n使用双字字访问字数据n不同的乘法指令可供选择操作数可以是有符号,也可以是无符号的 乘法指令需一个延迟间隙使用LDH的点积使用LDW的点积使用LDW/MPYH第四步:字长优化n按照word进行数据访问,MPY 和MPYH代码可写为:nNote:每个循环中能够实现两个16*16bit的乘法,所以整个循环的运行时间会减半。优化结果小结优化小结n可知,代码优化可以采用以下四种方法:写并行代码 有用的代码填充延迟间隙 字长优化 循环展开 提高性能?减小代码大小?学习目标n为什么要使用软件流水,SP?n理解软件流水的基本概念n软件流水的实现步骤n编写字访问的、流水的点积程序n流水填充和排空对软件流水的设计影响为什么要使用软件流水,SP?nSP可以实现高度优化的循环代码:写并行代码 延迟间隙填充有效的指令代码 最大化功能单元的使用率nSP实现途径:由开发工具产生编译选项-o2-o3 如果是.sa文件,要用到汇编优化器软件流水概念n假设所有的指令均在一个周期内完成 左边的代码执行1次,需 要多少个时钟周期? (不考虑延迟间隙) 3 cycles软件流水概念左边的循环执行5次,要多少个时钟周期?5*3=15 cycles看一下功能单元的使用情况n无软件流水n软件流水只需7个时钟周期,是非软件流水时钟周期的一半软件流水建立循环完成最后操作单周期循环,3次迭代软件流水代码软件流水的步骤n1 C代码实现算法并且验证n2 写C6x的线性汇编代码n3 创建相关图n4 分配寄存器n5 创建编排表n6 将编排表转换成C6X代码软件流水举例(第一步)写C6X的线性汇编代码(第二步)n书写线性汇编语言程序的基本法则:自上而下,按照程序要完成的功能的逻辑顺序书写线性汇编语句写C6X的线性汇编代码(第二步)1 不需要NOP填充(延迟间隙)2 不需要编排并行 (并行语句)3 不需要指定:功能单元、寄存器简单估计相关图的几个术语画相关图的基本步骤n(a)根据算法画出节点和路径n(b)标出每一条指令执行完毕需要的周期数n(c)对每个节点指定”required”功能单元n(d)将节点划分为A、B两侧,再给所有功能单元进行A、B两侧的分配画相关图(a)n每条指令均被表示成一个节点n节点由一个圆圈表示圈外:标明指令 圈内:结果将要写入的寄存器节点由一个圆圈表示节点之间由路径相连,表示数据流向Note:条件路径由虚线表示画相关图(a)画相关图(a)画相关图(a)画相关图(b)n下一步中,在相关图中加入每条指令执行完毕需要的周期数 n具体位置:写在相应数据路径的旁边。画相关图(b)画相关图(c)n下一步,给每个节点分配功能单元n建议先给需要特殊功能单元的指令进行分配: load/Store Branch因为,.M单元是能够执行乘法的唯一功能单元,所以不需要对其进行特殊考虑。Note:此时还没有考虑A侧和B侧画相关图(c)画相关图(d)n这一步需要对数据路径进行A侧、B侧的划分n使用尽量多的功能单元,同时尽量少的使用交叉通道以优化相应的代码n在相关图上由一根直线来体现划分结果n这样,每条指令对应的功能单元可以带上药采用哪一组寄存器的信息画相关图(d)第四步 分配功能单元n功能单元分配必须满足下列规则:nADD 和 SUB还可以使用.S,.L,.D单元第四步 分配功能单元第四步 分配功能单元第五步 创建编排表n分析软件流水技术的基本方法模迭代编排表n从最长数据通路开始n尽可能早开始n一旦确定指令执行的周期,在这以后的周期内,连续发生各次迭代n倒推跳转和循环计数指令的发生周期第五步 创建编排表如何知道循环结束于第8个时钟周期填充长度数出最长一条路径的长度(周期数)即可 5+2+1=8 cycles.第五步 创建编排表第五步 创建编排表第五步 创建编排表第六步 将编排表转换成C6x代码第六步 将编排表转换成C6x代码第六步 将编排表转换成C6x代码第六步 将编排表转换成C6x代码第六步 将编排表转换成C6x代码第六步 将编排表转换成C6x代码第六步 将编排表转换成C6x代码第六步 将编排表转换成C6x代码Note:单周期循环执行40次
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号