强度折减
编译器最佳化技术
软件工程领域,强度折减(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有着不同的可用功能)而有所不同。
参考资料
最新修订时间:2022-08-25 16:30
目录
概述
简介
程式码分析
参考资料