簡體   English   中英

為什么編譯器做這個除法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM