在
软件工程领域,强度折减(Strength reduction)是一个
编译器最佳化技术,它将昂贵的运算以相同但是相对便宜的运算取代,最经典的范例就是将乘法转换为使用循环的连续加法,这经常使用在阵列的定址。
在
软件工程领域,强度折减(Strength reduction)是一个
编译器最佳化技术,它将昂贵的运算以相同但是相对便宜的运算取代,最经典的范例就是将乘法转换为使用循环的连续加法,这经常使用在阵列的定址。
编译器使用一些方法来辨识循环以及循环内暂存器数值的特点,编译器可利用强度折减来辨识:
循环不变式本质上在循环内是个常数,但他们的数值可能在循环外会改变。归纳变数则是会被改变一个已知的量。而在巢状回圈的情况之下,一个归纳变数在循环外的循环内也可以是一个归纳变数。
强度折减会找寻涉及
循环不变式以及归纳变数,有些可以被简化,举例来说,循环不变式c及归纳变数i的乘法:
编译器将会开始进行最佳化(并不只有强度折减),循环内的常数(不变式)将会被放到循环外面(Loop-invariant code motion),常数可以在循环外面载入,例如浮点数暂存器 fr3 及 fr4。接着辨识出不会改变的变数,例如常数N,这使得一些暂存器在循环内允许被合并,所以r2、r4、r7、r12可以被合并移置循环外或是消除。r8及r13同时有着相同的运算 i*n ,所以他们也可以被合并,最内层的循环(0120-0260)已经从11道指令减少为7道指令,为一个还留在最内层循环的乘法为0210行的乘法运算。
强度折减运算子(Operator strength reduction)使用数学的方法,以更快的运算子取代了缓慢的数学操作,这个优势将会根据目标CPU以及一些程式(不同的CPU有着不同的可用功能)而有所不同。