第四章CCS软件优化.ppt
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、表明存储器地址相关与不相关的伪指令 .mdep[symbol1],[symbol2] 1,2相关 .no_mdep 其后定义的函数段内存储器地址不相关5、定义变量,或者说描述存入寄存器的数值变量的伪指令:.reg variable1[,variable2,…] 6、过程的返回值 .return [argument]7、指出循环迭代次数的伪指令 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 C代码转换为线性汇编n第四步处理程序的循环体部分 定义一个标号loop:作为循环返回的标志;然后按照原C程序语句顺序改写成汇编语句(不必指定指令执行的功能单元): product = m[i] * n[i] ; 改写 LDH *addr_a++,m LDH *addr_x++,n MPY m,n,product sum += product ;改写为改写为 ADD sum,product,sumC代码转换为线性汇编n将循环变量vptr(即count)减一;利用C6x指令的条件执行功能通过对vptr是否为零的判断条件执行跳转指令:if ( vptr!=0) then B loopn最后,.return实现数据的返回n一切工作完成后,使用.endproc作为函数结束的标志C代码转换为线性汇编§ .def _DP§ _DP .cproc cptr0,cptr1,vptr§ .reg addr_a,addr_x§ .reg m,n§ .reg product,sum§ MV cptr0,addr_a§ MV cptr1,addr_x § ZERO sum § loop: § LDH *addr_a++,m§ LDH *addr_x++,n§ MPY m,n,product§ ADD sum,product,sum§ SUB vptr,1,vptr§ [vptr] B loop§ .return sum§ .endproc线性汇编不需要指出和考虑:n功能单元n寄存器n延迟间隙. .cproccproc/./.endprocendproc::·确定要优化的代码段·必须成对使用·可作为C调用的函数. .regreg伪指令:伪指令:·声明符号变量,变量由优化器 选择与功能单元一致的寄存器·.reg在.(c)proc/.endproc内有效·当变量为40/64bit时,变量使用 寄存器对格式:如ahi:alo·. .cproccproc[variable1[,variable2,]]: 给出输入参数·.return.return:给出返回结果·.return.return仅在.cproc/.endproc内有效. .procproc[register1[,register2,]]; 给出输入参数. .regregp_m,mvregister1,p_m;建立输入寄存器::;与变量关系mvsum,register1. .endprocendproc[register1[,register2,]];给出返回结果C代码转换为线性汇编n short DP(short *m, short *n, short count)n {n short i ;nint pro_h, pro_l ;n int sum_h = 0 ;n int sum_l = 0 ;n int sum = 0 ;n int *data_a = ( int *) m ;n int *data_x = ( int *) n ;n count = count >> 1 ;n for(i=0;i 优化结果小结优化小结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次。





