[英]Why the compiler does this division
我正在嘗試優化 nbody 算法,但此操作很昂貴
real s = jMass / POW(distSqr,3.0/2.0);
所以我嘗試轉換為:
s = jMass * POW(distSqr, -3.0/2.0);
但是帶有 -Ofast 選項的編譯器 gcc 無論如何都會進行除法,為什么?
我必須在這里做出幾個假設(變量都是double
類型,並且POW
是一個擴展為pow
的宏):
#include <math.h>
double f0(double a, double b) {
return a / pow(b, 1.5);
}
double f1(double a, double b) {
return a * pow(b, -1.5);
}
這給了我(在 x86 上):
f0:
.cfi_startproc
movapd %xmm1, %xmm2
sqrtsd %xmm2, %xmm2
mulsd %xmm1, %xmm2
divsd %xmm2, %xmm0
ret
.cfi_endproc
f1:
.cfi_startproc
movapd %xmm1, %xmm2
sqrtsd %xmm2, %xmm2
mulsd %xmm1, %xmm2
divsd %xmm2, %xmm0
ret
.cfi_endproc
將pow(x, 1.5)
轉換為x * √x
是一個合理的優化,隨后的除法仍然比調用昂貴的pow()
函數要快得多。 換句話說,編譯器非常合理地選擇在使用-Ofast
時將pow(x, -1.5)
為1/(x*√x)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.