DSP C语言优化-(二)
来源:互联网 发布:中国好声音网络歌手 编辑:程序博客网 时间:2024/04/26 02:00
工作流程一般分为三个阶段。
上述的三个阶段不是都必须经过,当在某一阶段获得了期望的性能,就不必进行下一阶段的优化。
1) 选用C编译器提供的优化选项
2) 减小存储器相关性
3) 使用内联函数(intrinsics)
该源程序代码冗长,有较多的逻辑操作和判断跳转,运行效率低下。若用内联函数,则是result =_norm(src1),减少了代码长度,提高了运行效率。因此对于需要大量C代码才能表示的复杂功能,应该尽量用C64X的内联函数来表示。
4) short型数据的int处理
C64XDSP具有双16bit扩充功能,芯片能在一个周期内完成双16bit的乘法、加减法、比较、移位等操作。在设计时,当对连续的short型数据流操作时,应该转化成对int型数据流的操作,这样一次可以把两个16位的数据读入一个32位的寄存器,然后用内部函数来对它们处理(如_sub2等),充分运用双16bit扩充功能,一次可以进行两个16bit数据的运算,速度将提升一倍。
5) 尽量少进行函数调用
函数调用的时候,要将PC和一些寄存器压栈保存,函数返回时,则将这些寄存器出栈返回,增加了一些不必要的操作。所以一些小的函数,最好是用适当的内联函数代替直接写入主函数里,一些调用不多的函数,也可以直接写入主函数内,这样可减少不必要的操作,提高速度。但是这样往往会增加程序的长度,因此是一种利用空间换取时间的办法。
6) 尽量使用逻辑运算代替乘除运算
在DSP里,乘除运算指令的执行时间要远远超过逻辑移位指令,尤其是除法指令,在设计的时候,可以根据实际情况,进行一些调整,尽量用逻辑移位运算来代替乘除运算,这样可以加快指令的运行时间。
7) 软件流水线技术的使用
软件流水线技术用来对一个循环结构的指令进行调度安排,使之成为多重迭代循环并行执行。在编译代码时,可以选择编译器的-o2或-o3选项,则编译器将根据程序尽可能地安排软件流水线。
在DSP算法中存在大量的循环操作,因此充分地运用软件流水线方式,能极大地提高程序的运行速度。但使用软件流水线还有下面几点限制:
● 循环结构不能包含代码调用,但可以包含内联函数。
● 循环计数器应该是递减的。
● 循环结构不能包含break,if语句不能嵌套,条件代码应当尽量的简单。
● 循环结构中不要包含改变循环计数器的代码。
● 循环体代码不能过长,因为寄存器(32个)的数量有限,应该分解为多个循环。
在软件流水线的运用上,应该尽量使复杂的循环分解成简单的小循环,以避免寄存器的数量不够;对于过于简单的循环,应该适当的展开,以增加代码数量,增加流水线中的迭代指令。
8) 采用指令乱序技术
尤其在循环里,当循环体较小的时候,可以把多个循环的代码写在一个循环体里,合并成一个循环,从而减小循环内指令的相关性,增加指令运行的并行性。但是要注意不要使循环过于复杂,以至不能进行软件流水线的优化。
由于C语言编译出来的程序,不是最有效率的汇编语言,而没有办法达到实时播放。所以为了要使程序执行的速度能够加快,必须要做最佳化,使其能够达到实时播放的速度。然而C6x 的编译器也提供了最佳化的指令,如在编译时加上 -o3 的参数,它可以用软件来分析我们的程序是否有可以改进的地方,如此一来,在产生组语的汇编语言档案之前,编译器会对我们写的C语言程序不断的进行编译,也会对程序中的循环部份重新编排,产生另一较有效率的核心循环,以最有效率的方式重新编排程序,来加快程序速度
- DSP C语言优化-(二)
- dsp C语言优化-(三)
- dsp C优化-(四)
- [TECH]DSP中C语言的优化等级
- dsp中C优化-(一)
- DSP C语言的总结(一)
- 基于ADI Blackfin系列DSP处理器的C语言编程与优化——优化DSP Kernel
- C语言编程之代码优化(二)(转)
- DSP的C语言学习
- DSP C语言基础要点
- DSP C语言基础要点
- DSP C语言基础要点
- DSP开发-C语言环境
- C语言(二)
- DSP优化C循环的例子
- DSP平台优化实例:C代码评估
- 基于ADI Blackfin系列DSP处理器的C语言编程与优化——C编程规则
- dsp cache优化(转载)
- json数组对象和对象数组
- 数据结构之链表(C实现)
- 条件注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]>
- luabind和c++相互调用
- IOS开发之所有类型的UIKeyboardType图片展示
- DSP C语言优化-(二)
- 使用迭代器遍历图像
- VC6.0各个小模块代码整理集合
- jQuery解读之after
- 创建对象和使用方法以及属性
- java 调用第三方dll学习心得
- 2014编程之美资格赛第三题-格格取数
- .net 2.0 BackgroundWorker类详细用法
- 理解递归