|
楼主 |
发表于 2006-10-22
|
1.2 算法级低功耗设计策略
算法级低功耗设计主要在于软件代码的优化,减少由于算法的低效率引起的不必要功耗。一方面是对标准C代码的优化。C语言具有易读性、可移植性,但是C语言在实际工程应用中,不便于对系统硬件资源的直接控制,无法发挥SoC的特点。用汇编语言编程,可以根据芯片自身硬件结构特点,对汇编程序进行优化与精简,往往能够使一些复杂的算法和功能模块在实时处理方面取得非常好的效果。另一方面分析了影响执行效率的数据相关、控制相关和资源冲突等因素后,在手工汇编的基础上充分挖掘算法的潜力,最大限度发挥硬件性能,以达到实时要求和低功耗设计的指标。
在本设计里主要根据SoC平台的资源和指令集特点,使用软硬件协同设计方法在C代码转化为汇编代码时,通过分析标准C算法发现,大部分循环和函数的调用存在冗余,频繁的函数调用操作(压栈出栈)占用了CPU的部分处理时间。在汇编代码中可以通过循环展开以减少不必要的循环判断,其基本原则的原始代码为:普通的单循环,一个周期执行一次乘累加(MAC)指令,优化后进行了4次循环展开。在优化后的代码中,4个MAC被同时使用,并且在作乘累加时,提取下次运算的数据,消除了流水线等待,充分应用了硬件资源,提高了效率。除了循环展开,在某些情况下进行循环合并也可提高效率。主要原因是每个循环体均需要有控制指令,减少循环的个数自然会减少控制指令的条数。注意两个合并的循环必须有相同的循环数。
对于在代码里多次用到的函数,应考虑用调用指令,这样可以大大减少代码的体积;而对于只调用少次的函数,则宜嵌入主函数中,因为它不仅可以减少传参过程中的指令,而且可以减少调用函数的压栈出栈操作。当然,对于一些大而复杂的函数,虽然它只被调用1次,但由于寄存器的数目有限,如果考虑直接嵌入主函数,可能要频繁地做push和pop操作,反而得不偿失,这时就应该用调用指令。
如果有些处理比较复杂,在整个解码过程中运算量大且耗时长,有必要设计相关硬件协处理器,通过汇编指令直接操作协处理器,既可以提高效率减少运算量也有利于控制功耗,但成本会增加。这种处理方法在实时影响明显的模块尤其关键和有效。例如在MP3的解码中,通过增加矩阵乘法器以提高子带综合滤波的处理速度,取得明显效果:可减少运算时间91%。这种软硬件协同的设计手段在语音解码器中多处用到。
在算法级中还涉及其他方面的低功耗设计,如减少存储器的存取次数,缩短片选信号的宽度等方面的考虑,本设计也做了相应的处理。总的说来,算法级的优化设计在降低系统功耗方面潜力大,对降低整个语音解码器的功耗具有重要意义。
|
|