强度折减
强度折减(Strength reduction)是一个编译器最优化技术,它将昂贵的运算以相同但是相对便宜的运算取代,最经典的范例就是将乘法转换为使用循环的连续加法,这经常使用在阵列的定址。
简介
强度折减是编译器优化技术中的一种,主要目的是减少程序运行时的计算成本。在软件工程领域,这种技术尤其重要,因为它可以显著提高程序的执行效率。强度折减的典型应用是将昂贵的运算替换为成本较低的运算,例如将乘法运算替换为加法运算。这种优化通常应用于数组定址和循环结构中,可以减少循环中的计算量,从而加快程序的执行速度。
强度折减的范例包括:
- 使用循环及加法取代乘法运算。
- 使用循环及乘法取代指数运算。
程式码分析
在程序执行过程中,大部分的执行时间往往集中在一些较小的代码段落,这些代码段通常位于循环结构中。编译器通过分析循环及其内部的寄存器值的特性,可以应用强度折减技术来优化代码。编译器识别的关键特征包括:
- 循环不变式(Loop invariants):在循环内部值不会改变的变量。
- 归纳变数(Induction variables):在循环内每次迭代时,其值会按照固定量增加或减少的变量。
循环不变式在循环内部可以视为常数,尽管它们的值可能在循环外部发生变化。归纳变量则是按照已知的量进行变化。在嵌套循环的情况下,一个归纳变量在外层循环中也可能是归纳变量。
强度折减会寻找涉及循环不变式和归纳变量的运算,尝试将其简化。例如,循环不变式`c`和归纳变量`i`的乘法运算可以被加法所取代。
最佳化
编译器将会开始进行最佳化(并不只有强度折减),循环内的常数(不变式)将会被放到循环外面(Loop-invariant code motion),常数可以在循环外面载入,例如浮点数暂存器 fr3 及 fr4。接着辨识出不会改变的变数,例如常数N,这使得一些暂存器在循环内允许被合并,所以r2、r4、r7、r12可以被合并移置循环外或是消除。r8及r13同时有着相同的运算 i*n ,所以他们也可以被合并,最内层的循环(0120-0260)已经从11道指令减少为7道指令,为一个还留在最内层循环的乘法为0210行的乘法运算。
其它强度折减的运算
强度折减运算子(经营者 strength reduction)使用数学的方法,以更快的运算子取代了缓慢的数学操作,这个优势将会根据目标CPU以及一些程式(不同的CPU有着不同的可用功能)而有所不同。