在gcc上使用-Ofast标志,分解数学表达式是否会影响速度?

问题描述 投票:1回答:1

我想知道,在gcc上使用-Ofast标志时,代码中的

x += (a * b) + (c * d) + (e * f);

是更快,更慢,同样是这段代码。

x += a * b;
x += b * c;  
x += e * f;

我在一个嵌套循环里有一个这样的数学表达式 所以任何速度上的提升都会有显著的效果。

c math gcc compiler-optimization
1个回答
1
投票

直觉上,我希望这些代码能编译成同样的代码。但让我们看看实际情况 使用 榫头 和你的第一个版本(单行本),我们得到这个代码。

    mov     eax, DWORD PTR [rsp+20]
    mov     esi, DWORD PTR [rsp+28]
    imul    esi, DWORD PTR [rsp+32]
    imul    eax, DWORD PTR [rsp+24]
    lea     eax, [rax+rsi]
    mov     esi, DWORD PTR [rsp+36]
    imul    esi, DWORD PTR [rsp+40]
    add     esi, eax
    add     esi, DWORD PTR [rsp+44]
    mov     DWORD PTR [rsp+44], esi

With 第二版我们得到这个

    mov     esi, DWORD PTR [rsp+28]
    imul    esi, DWORD PTR [rsp+32]
    mov     eax, DWORD PTR [rsp+20]
    imul    eax, DWORD PTR [rsp+24]
    add     eax, DWORD PTR [rsp+44]
    lea     eax, [rax+rsi]
    mov     esi, DWORD PTR [rsp+36]
    imul    esi, DWORD PTR [rsp+40]
    add     esi, eax
    mov     DWORD PTR [rsp+44], esi]

我相信,这些是相同的指令,但顺序略有不同。我猜测这两种情况下的性能几乎是一样的,尽管其中一种与另一种的流水线性能可能(?)会有轻微的差异。

我怀疑你的第一个版本在这里是完全可以的。

© www.soinside.com 2019 - 2024. All rights reserved.