DSP程序优化方法2.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DSP程序优化方法2

DSP程序优化方法(2) 5、循环优化 ( 1)、充分分解小的循环    要充分利用 CPU的指令缓存,就要充分分解小的循环。 特别是当循环体本身很小的时候,分解循环可以提高性能。注意 :很多编译器并不能自动分解循环。 不好的代码: // 3D 转化:把矢量 V 和 4x4 矩阵 M 相乘 for (i = 0 ; i 4 ; i ++) {    r[i] = 0 ;    for (j = 0 ; j 4 ; j ++)    {      r[i] += M[j][i]*V[j] ;    } } 推荐的代码: r[0] = M[0][0]*V[0] + M[1][0]*V[1] + M[2][0]*V[2] + M[3][0]*V[3] ; r[1] = M[0][1]*V[0] + M[1][1]*V[1] + M[2][1]*V[2] + M[3][1]*V[3] ; r[2] = M[0][2]*V[0] + M[1][2]*V[1] + M[2][2]*V[2] + M[3][2]*V[3] ; r[3] = M[0][3]*V[0] + M[1][3]*V[1] + M[2][3]*V[2] + M[3][3]*v[3] ; ( 2)、提取公共部分 对于一些不需要循环变量参加运算的任务可以把它们放到循环外面,这里的任务包括表达式、函数的调用、指针运算、数组访问等,应该将没有必要执行多次的操作全部集合在一起,放到一个 init 的初始化程序中进行。 ( 3)、延时函数 通常使用的延时函数均采用自加的形式: void delay (void) { unsigned int i; for (i=0;i1000;i++) ; } 将其改为自减延时函数: void delay (void) { unsigned int i; for (i=1000;i0;i--) ; } 两个函数的延时效果相似,但几乎所有的 C 编译对后一种函数生成的代码均比前一种代码少 1~3 个字节,因为 几乎所有的 MCU 均有为 0 转移的指令 ,采用后一种方式能够生成这类指令。在使用 while 循环时也一样,使用自减指令控制循环会比使用自加指令控制循环生成的代码更少 1~3 个字母。但是在循环中有通过循环变量“ i ”读写数组的指令时,使用预减循环有可能使数组超界,要引起注意。 ( 4)、while循环和do…while循环 用 while 循环时有以下两种循环形式: unsigned int i; i=0; while (i1000) { i++; // 用户程序 } 或: unsigned int i; i=1000; do { i--; // 用户程序 } while (i0); 在这两种循环中, 使用 do … while 循环编译后生成的代码的长度短于 while 循环。 ( 6)、循环展开 这是经典的速度优化,但许多编译程序 ( 如 gcc -funroll-loops) 能自动完成这个事,所以现在你自己来优化这个显得效果不明显。 旧代码 : for (i = 0; i 100; i++) { do_stuff(i); } 新代码 : for (i = 0; i 10; ) { do_stuff(i); i++; do_stuff(i); i++; do_stuff(i); i++; do_stuff(i); i++; do_stuff(i); i++; do_stuff(i); i++; do_stuff(i); i++; do_stuff(i); i++; do_stuff(i); i++; do_stuff(i); i++; } 可以看出, 新代码里比较指令由 100 次降低为 10 次,循环时间节约了 90% 。 不过注意 : 对于中间变量或结果被更改的循环,编译程序往往拒绝展开, ( 怕担责任呗 ) ,这时候就需要你自己来做展开工作了。 还有一点请注意,在有内部指令 cache 的 CPU 上 ( 如 MMX 芯片 ) ,因为循环展开的代码很大,往往 cache 溢出,这时展开的代码会频繁地在 CPU 的 cache 和内存之间调来调去,又因为 cache 速度很高,所以此时循环展开反而会变慢。 还有就是循环展开会影响矢量运算优化。 ( 6)、循环嵌套 把相关循环放到一个循环里,也会加快速度。 旧

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档