第七讲:DSP软件的优化

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实时信号处理系统设计第七讲DSP的软件的优化联系方式:zyh@ccee.cqu.edu.cn重庆大学通信工程学院C6000软件优化本节内容1:Twomaingoalsofsoftwareoptimisation–Fasterexecutiontime.–Smallcodesize–TradeoffbetweenthetwogoalsBasicknowledgeToimplementefficientsoftware,theprogrammermustbefamiliarwith:–Processorarchitecture.–Programminglanguage(C,assemblyorlinearassembly).–Thecodegenerationtools(compiler,assemblerandlinker).CodeOptimisationProcedureOptimiseAlgorithmProgramin'C'andcompilewithoutanyoptimisationCodeFunctioning?Makethenecessarycorrection(s)ProfileCodeResultSatisfactory?UseintrinsicsProfileCodeResultSatisfactory?Setn=0(-On)Compilecodewith-OnoptionCodeFunctioning?Makethenecessarycorrection(s)ProfileCodeResultSatisfactory?N3?NNNYNNNNofurtheroptimisationisrequiredYNofurtheroptimisationisrequiredYPasstonextstepofoptimisaion(N=N+1)yNofurtheroptimisationisrequiredIdentifyCodeFunctionstobefurtheroptimisedfromProfilingResultConvertcodeneedingoptimisationtolinearassemblyCodeFunctioning?Makethenecessarycorrection(s)ResultSatisfactory?NofurtheroptimisationisrequiredWritecodeinhandassemblyYNYNYY软件优化要点•1个时钟周期内让尽可能多的功能单元在执行指令。趋近8*主频(MHz)MIPS•前提:满足各种资源限制(resourcebound)•途径:(1)资源合理分配、充分使用(2)算法DSP结构的映射DSP适合对大量数据做相同的运算软件优化要点(续)•相同的工作放在一起完成,形成循环,便于软件流水。•循环中工作太多,导致资源不够(如:寄存器不够分配),则可以拆分循环。•充分利用指令局部性和数据局部性的特点Cache优化的3个层次•1.手工汇编优化•2.线性汇编优化•3.C语言级的优化2&3和编译器交流:Feedbackofloop资源分配情况设置-k编译器选项,保留asm文件compilerassembly目的:软件流水C6000手工汇编语言优化并行指令填充延迟间隙展开循环存取带宽优化(使用LDW/LDDW)软件流水使用并行指令哪些指令可以并行?并行指令哪些指令可以并行?(1)两条取指令并行:放“||”在第二个ldh前.d1改为.d2,A改为B填充延迟间隙NOP:相当于未优化为了消除NOP,如何调整指令顺序?填充延迟间隙Sub和b指令移到ldh指令后:LD的nop由4降为2B的nop被消除填充延迟间隙优化结果循环代码展开举例循环展开:减少B的开销,但增加代码尺寸循环次数减少一半字长优化•使用字访问半字数据•使用双字字访问字数据使用LDH的点积使用LDW进行优化使用LDW/MPYH软件流水•产生高性能循环代码执行并行指令填充延迟间隙功能单元使用最大化•由开发工具产生由编译器选项-o2或o3引入汇编优化器/C优化器产生代码举例这个循环执行5次需要多少周期?(不考虑延迟间隙)周期非流水代码流水代码软件流水中的术语填充(建立循环)循环(单周期循环3次迭代)排空(完成最后操作)流水代码软件流水步骤1用C语言实现算法并验证2写C6x线性汇编代码3画相关图4分配功能单元和寄存器5建编排表6将编排表转换为C6x汇编代码第一步:用C语言实现算法并验证第二步:写C62xx线性汇编代码线性汇编不需要指出和考虑:•功能单元•寄存器•延迟间隙•并行指令简单估计指令功能单元每周期可使用数目需要数目LDH,LDH.D22MPY.M21B.S21ADD,SUB.L(.D/.S)2(2-6)2第三步:画相关图画相关图步骤:1、画节点(包括:指令、结果、通路)2、在通路旁标出父指令执行周期3、安排功能单元安排必须的功能单元节点分配到A、B两侧对所有节点分配功能单元平分.D、.S、.M最小化交叉通路平衡功能单元仲裁画点积相关图1.画节点(1)画点积相关图1.画节点(2)循环传递通路画点积相关图1.画节点(3)画点积相关图2.标出父指令执行周期画点积相关图3.安排功能单元(1)画点积相关图3.安排功能单元(2)画点积相关图3.安排功能单元(3)第四步:分配功能单元根据功能单元和交叉通路的使用,可在单周期循环内编排这些指令。第四步:分配寄存器第五步:建编排表(1)循环填充长度•抽出最长数据通路•计算长度:5+2+1=8周期•编排表列出0-7周期•填充:第0-6周期•循环:第7周期编排周期057填写指令建议从最长数据通路开始尽可能早开始(第0周期)一旦确定指令执行的周期,在这以后的周期内,连续发生各次迭代倒推跳转和循环计数指令的发生周期第五步:建编排表(2)第六步:写汇编代码执行40次代码尺寸的优化•需求:programcache的存在•消除冗余循环.trip•压平循环填充与循环排空-mh线性汇编和汇编优化器本节内容2:学习内容•写线性汇编代码•使用汇编优化器•多周期循环的软件流水•汇编优化器选项和伪指令内容一、写线性汇编代码二、写线性汇编代码举例—点积三、调用汇编优化器四、多周期循环的软件流水五、加权矢量和(WVS)循环展开一、写线性汇编代码软件工具流程线性汇编文件基本考虑事项线性汇编文件使用“.sa”扩展名仅对指定的代码段进行优化,指定代码段外的代码被拷贝为输出“.asm”文件线性汇编过程可以:–传递参数–返回结果–使用符号变量–不考虑流水线问题二、写线性汇编代码举例—点积点积线性汇编线性汇编不需要指出和考虑:•功能单元•寄存器•延迟间隙确定优化代码段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确定要优化的代码段,它们也必须成对使用使用符号变量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仅在.cproc/.endproc内有效当变量为40/64bit时,变量使用寄存器对格式:如ahi:alo参数传递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,]];给出返回结果保护寄存器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内的代码明显使用了要保护的寄存器,优化器也可能使用该寄存器,如:冗余循环非流水代码执行较慢运算迭代次数=最小循环次数流水代码执行较快消除冗余循环•关闭软件流水(-mu)减小代码尺寸,但也减小吞吐量•指出运算迭代次数(.trip)如果.trip≧最小循环次数,仅产生流水循环如果.trip最小循环次数,产生两种循环•不产生冗余循环(-ms)如果没给出.trip,仅产生不流水循环如果给出.trip,且.trip≧最小循环次数,仅产生流水循环指出运算迭代次数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指出运算迭代次数点积的完整线性汇编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.用C语言实现算法并验证2.写C6x线性汇编代码3.画相关图4.分配功能单元和寄存器5.建编排表6.将编排表转换为C6x汇编代码加权矢量和软件流水第一步:C代码第二步:线性汇编代码第三步:相关图第四步:分配功能单元2周期循环2个周期/每次循环迭代迭代间隔:每次循环迭代占用的周期数多周期循环第五步:建迭代间隔编排表(1)第五步:建迭代间隔编排表(2)第五步:建迭代间隔编排表(3)第五步:建迭代间隔编排表(4)第五步:建迭代间隔编排表(5)第五步:建迭代间隔编排表(6)展开加权矢量和代码.D单元数/每次循环结果/每次循环循环周期312623展开加权矢量和:2个结果/每3个周期要点:循环展开,充分利用资源汇编优化器选项和伪指令•-on选项•-mt选项和.no_mdep伪指令【C程序的restrict关键字】•.mdep伪指令•.mptr伪指令•.trip伪指令【C程序的MUST_ITERATEpragma】-on选项•软件流水需要选择-o2或-o3选项•-o=-o2•-o3优化的工作:文件级优化1.删除未使用的所有函数2.当函数的返回值没有用到时,简化函数返回的形式3.内联

1 / 89
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功