欢迎来到天天文库
浏览记录
ID:50469590
大小:32.00 KB
页数:9页
时间:2020-03-06
《DSP平台c语言编程优化方法(精).doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、dsp编程优化方法工作阶段:工作流程一般分为三个阶段。阶段一:直接按照需要用C语言实现功能。在实际的DSP应用中,许多算法都是非常复杂,直接用汇编代码编写,虽然优化效率很高,可是实现的难度却很大,所以一般都采用先用C语言来实现,然后编译运行,利用C64X开发环境的profile?clock工具测试程序运行时间,若不能满足要求,则进行第二阶段。阶段二:C语言级的优化。选择C64X开发环境提供的优化方式以及充分运用其他技巧,优化C代码,若还不能满足效率要求,则进行第三步。阶段三:汇编级的优化。将上一阶段C程序中优化效率较低的部分提出来,用线性汇编语言编
2、写,利用汇编优化器进行优化。汇编优化器的作用是让开发人员在不考虑C64X流水线结构和分配其内部寄存器的情况下,编写线形汇编语言程序,然后汇编优化器通过分配寄存器和循环优化将汇编语言程序转化为利用流水线方式的高速并行汇编程序。上述的三个阶段不是都必须经过,当在某一阶段获得了期望的性能,就不必进行下一阶段的优化。1)选用C编译器提供的优化选项在编译器中提供了分为若干等级和种类的自动优化选项,如下:●-o:使能软件流水和其他优化方法●-pm:使能程序级优化●-mt:使能编译器假设程序中没有数据存储混淆,可进一步优化代码。●-mg:使能分析(profile
3、)优化代码●-ms:确保不产生冗余循环,从而减小代码尺寸●-mh:允许投机执行●-mx:使能软件流水循环重试,基于循环次数对循环试用多个方案,以便选择最佳方案。根据实际编译的程序,选择合适的优化选项,进行源程序的优化。2)减小存储器相关性为使指令达到最大效率,C64X编译器尽可能将指令安排为并行执行。为使指令并行操作,编译器必须知道指令间的关系,因为只有不相关的指令才可以并行执行。当编译器不能确定两条指令是否相关时,则编译器假定它们是相关的,从而不能并行执行。设计中常采用关键字const来指定目标,const表示一个变量或一个变量的存储单元保持不变
4、。因此,在代码中加入关键字const,可以去除指令间的相关性。例如下面的程序:voidvecsum(short*sum,short*in1,short*in2,unsignedintN){inti;for(i=0;i5、dvecsum(short*sum,constshort*in1,constshort*in2,unsignedintN){inti;for(i=0;i6、数名称前有下划线作特殊标识。当汇编指令功能不易采用C语言表达时,可采用内联函数表示。例如在定点运算中经常要求出源操作数的冗余符号位数,这一功能如果用C完成的话,需要如下的代码:unsignedintnorm(intsrc1){unsignedintsign,result=0;sign=src1&0×80000000;while(1){if(sign){if((src1=src1<<1)&sign)result+=1;elsereturnresult;}else{if((src1=src1<<1)7、sign)returnresult;elseresu8、lt+=1;}}}该源程序代码冗长,有较多的逻辑操作和判断跳转,运行效率低下。若用内联函数,则是result=_norm(src1),减少了代码长度,提高了运行效率。因此对于需要大量C代码才能表示的复杂功能,应该尽量用C64X的内联函数来表示。4)short型数据的int处理C64XDSP具有双16bit扩充功能,芯片能在一个周期内完成双16bit的乘法、加减法、比较、移位等操作。在设计时,当对连续的short型数据流操作时,应该转化成对int型数据流的操作,这样一次可以把两个16位的数据读入一个32位的寄存器,然后用内部函数来对它们处理(如_su9、b2等),充分运用双16bit扩充功能,一次可以进行两个16bit数据的运算,速度将提升一倍。5)尽量少进行函数调用函数调
5、dvecsum(short*sum,constshort*in1,constshort*in2,unsignedintN){inti;for(i=0;i6、数名称前有下划线作特殊标识。当汇编指令功能不易采用C语言表达时,可采用内联函数表示。例如在定点运算中经常要求出源操作数的冗余符号位数,这一功能如果用C完成的话,需要如下的代码:unsignedintnorm(intsrc1){unsignedintsign,result=0;sign=src1&0×80000000;while(1){if(sign){if((src1=src1<<1)&sign)result+=1;elsereturnresult;}else{if((src1=src1<<1)7、sign)returnresult;elseresu8、lt+=1;}}}该源程序代码冗长,有较多的逻辑操作和判断跳转,运行效率低下。若用内联函数,则是result=_norm(src1),减少了代码长度,提高了运行效率。因此对于需要大量C代码才能表示的复杂功能,应该尽量用C64X的内联函数来表示。4)short型数据的int处理C64XDSP具有双16bit扩充功能,芯片能在一个周期内完成双16bit的乘法、加减法、比较、移位等操作。在设计时,当对连续的short型数据流操作时,应该转化成对int型数据流的操作,这样一次可以把两个16位的数据读入一个32位的寄存器,然后用内部函数来对它们处理(如_su9、b2等),充分运用双16bit扩充功能,一次可以进行两个16bit数据的运算,速度将提升一倍。5)尽量少进行函数调用函数调
6、数名称前有下划线作特殊标识。当汇编指令功能不易采用C语言表达时,可采用内联函数表示。例如在定点运算中经常要求出源操作数的冗余符号位数,这一功能如果用C完成的话,需要如下的代码:unsignedintnorm(intsrc1){unsignedintsign,result=0;sign=src1&0×80000000;while(1){if(sign){if((src1=src1<<1)&sign)result+=1;elsereturnresult;}else{if((src1=src1<<1)
7、sign)returnresult;elseresu
8、lt+=1;}}}该源程序代码冗长,有较多的逻辑操作和判断跳转,运行效率低下。若用内联函数,则是result=_norm(src1),减少了代码长度,提高了运行效率。因此对于需要大量C代码才能表示的复杂功能,应该尽量用C64X的内联函数来表示。4)short型数据的int处理C64XDSP具有双16bit扩充功能,芯片能在一个周期内完成双16bit的乘法、加减法、比较、移位等操作。在设计时,当对连续的short型数据流操作时,应该转化成对int型数据流的操作,这样一次可以把两个16位的数据读入一个32位的寄存器,然后用内部函数来对它们处理(如_su
9、b2等),充分运用双16bit扩充功能,一次可以进行两个16bit数据的运算,速度将提升一倍。5)尽量少进行函数调用函数调
此文档下载收益归作者所有