- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
语音编解码算法G.723.1在DSP上的优化
3.2主程序的优化
主程序的优化手段主要采用了以下几种方法:
(1)使用内联函数(intrinsics)
内联函数是可直接映射为C64xx指令的特殊函数,它在指令前加上"_"表示。例如:
#define L_add(L_var1,L_var2) _sadd(L_var1,L_var2)
#define L_mult(var1,vat2) _smpy(var1,var2)
等,基本函数的内联优化需要对原函数的定义和内联指令都比较熟悉。
使用内联函数代替相应的C语句是一种非常简便高效的优化方法。如上面提到的饱和乘法,在C语句中。我们通常要使用两个嵌套的条件判断语句来检查结果是否溢出,而指令int_smpy(int a.int b) 则在完成乘b的运算后,再做一次饱和处理,这样一条DSP指令就可完成C语言中多条语句才能完成的计算,可以节省很多时钟周期。
(2)循环展开(loop—unrolling)
程序中的有很多的双重循环和多晕循环(比如代数码本搜索计算),由于C64xx优化器在优化时只在最内层循环中形成一个指令流水(最多可以达到8级流水),这样循环语句就不能充分利用软件流水线,而且对于内部循环次数较少的情况,消耗在prolog和eplog上的时钟周期也不可忽视。针对这种情况,一个有效的办法就是将双重或多重循环展开,降低循环次数。这样虽然代码长度增加了,但有更多的运算能够参加到pipeline中。由于减少了流水线排空和提高了功能单元的利用率,程序执行速度会大大提高。
(3)减少分支和调用指令,减少判断指令
程序中的分支、调用以及判断指令会引起程序的跳转,而每个跳转指令都有5个延迟间隙。因此延长了程序执行时间;另外,循环内跳转也会使软件流水受到阻塞,降低了代码执行效率。优化中,可以使用内嵌、合并判断语句来减少判断次数或用逻辑指令替代判断的方法尽可能的消除中断流水线指令带来的影响。
(4)使用字或双字存取和计算
C64xx系列DSP是32位CPU,当16位数据在内存中连续存放时,可利用uint_amem4(void*ptr)或double & _amemd8 (void*ptr)指令进行字或双字数据的读取或存贮。这样每次可同时存取2个或4个16位数据,由于从内存执行取数操作需要4个delay,所以减少存取次数可以节省大量的时钟同期;同时,可利用C64xx指令集中特有的打包指令_pack2(unsigned a,unsigned b),_packh2(unsigned a,unsigned b)等将两个16位数打包成一个32位数,在进行乘、加计算时则利用_add 2(int a,int b)、_mpy2(int a,int b)同时完成两组16位数的加法和乘法,效率比单纯16位数的加法和乘法提高一倍。
3.3汇编编程的优化
线性汇编是TI提供的一种汇编语言,其指令系统和汇编语言的指令系统完全相同,但在编写时不需要指定寄存器和操作单元,也不需要考虑延时的问题,因此编写线性汇编相对要容易一些。
经过以上的优化后,音频编码程序在DM642上的运行状况有了很大改善,但是经测试仍然没有到达可以接收的程度,而高级语言的效率几乎发挥到了极致,所以在具体分析耗时大的模块特点后,采用线性汇编语言重新编写C代码的低效率段程序,迸一步提高程序的执行效率。
在编写线性汇编优化代码的过程中,为了提高代码执行效率,我们需要遵循以下原则:
(1)写并行代码:通过使用汇编指令并行执行的方法减少循环内的执行周期数,优化线性汇编代码。这里的关键问题是弄清指令相关性,只有不相关的指令才能并行执行。辨别指令是否相关.可以使用相关图。
(2)处理跳转指令和转移指令:汇编程序的一大特点就是频繁地跳转,当满足不同的条件时,要求程序进行不同的操作,或跳到相应的位置。对于"大于"、"大于等于"、"小于"、"小于等于"等较为接近的逻辑判断和处理,应慎重对待,否则将产生逻辑性错误,并且很难调试。当发生溢出需进行相应处理时,这种现象尤为突出。
(3)尽量减少循环体内的指令数[7]:G.72.1的算法实现,有许多是在循环内部完成的,有些地方如同定码本搜索过程中,为了确定四个非0脉冲的位置和幅度,还用到了多重循环。在循环内部,特别是在嵌套较深的循环内部,减少一条指令可以大大降低程序的操作次数。例如。对于一个每重循环8次的四重嵌套循环,在最内层循环每减少一条指令,整个程序可以少执行84=4096语句。因此在设计程序时,能够放在循环体外执行的语句.尽量放在循环体外执行。
(4)展开程序体:尽在一定条件下,尽量展开程序,以减少子程序的调用和返回次数,牺牲空问换取时间。
经汇编优化器优化后,代码效率比C语言直接编译有明显提高。
4 优化工作的创新点
在对G.723.1的优化中.本文在前人研究成果的基础上,针对DSP C64xx系列芯片提}n了一些有价值的新方法。这些创新点在不同程度上提高了代码的优化速度和执行效率,在语音编解码的DSP实时实现中起到了关键性作用。下面,本文将以举例的方式阐明一些经典的方法。
作者:王伟 黄俊恒 来源:微计算机信息
上一篇:全业务运营与IMS网络管理
下一篇:基片集成波导多层转换器的设计与仿真