使用 gcc 上的 -Ofast 标志,分解数学表达式会影响速度吗?
With the -Ofast flag on gcc, does breaking down a math expression affect speed?
我想知道在 gcc 上是否有 -Ofast 标志,代码
x += (a * b) + (c * d) + (e * f);
与faster/slower/the相同as/than此代码:
x += a * b;
x += b * c;
x += e * f;
我在嵌套循环中有一个这样的数学表达式,因此任何速度上的提升都可能产生重大影响。
凭直觉,我希望它们能编译成相同的代码。但是让我们看看到底发生了什么!将 godbolt 与您的第一个版本(单行)一起使用,我们得到以下代码:
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
使用 the second version,我们得到:
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]
我认为,这些指令是相同的,但顺序略有不同。我怀疑这两种情况下的性能几乎相同,尽管可能(?)管道性能与另一种情况略有不同。
我怀疑你的第一个版本在这里完全没问题。
我想知道在 gcc 上是否有 -Ofast 标志,代码
x += (a * b) + (c * d) + (e * f);
与faster/slower/the相同as/than此代码:
x += a * b;
x += b * c;
x += e * f;
我在嵌套循环中有一个这样的数学表达式,因此任何速度上的提升都可能产生重大影响。
凭直觉,我希望它们能编译成相同的代码。但是让我们看看到底发生了什么!将 godbolt 与您的第一个版本(单行)一起使用,我们得到以下代码:
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
使用 the second version,我们得到:
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]
我认为,这些指令是相同的,但顺序略有不同。我怀疑这两种情况下的性能几乎相同,尽管可能(?)管道性能与另一种情况略有不同。
我怀疑你的第一个版本在这里完全没问题。