【发布时间】:2018-05-14 08:12:12
【问题描述】:
【问题讨论】:
-
因为第一种情况没有适当优化...可以缩短为
return a[n-1] * x * x * x * x;,丢弃整个循环。 =我的意思是,您的问题毫无意义,编译器首先必须生成正确的代码,是否接近最佳解决方案是次要的,取决于源有多大,编写得如何,使用了哪些选项和编译器,等等......你甚至没有指定使用了哪个编译器和哪些选项,所以完全不可能说出为什么会出现特定的机器代码,但即使有细节也很难。 -
也许我对缩短的理解是错误的,是吗?必须检查一下,gcc 7.3 没有找到它,我想这是我这边的错误,而不是这么早成为那个超人......哦,clang 找到了,所以它真的只是 gcc 未能识别简化的公式。有趣的。 godbolt.org/g/p2MGHs(我没有提到
n的测试当然是需要的,对于(n <= 0)完全跳过for)。 -
什么硬件有速度差异? IvyBridge 和更高版本应该能够以每时钟 1 个
imul运行loop1的汇总版本(感谢mov-elimination 的 3 个 ALU 微指令),所以最近的硬件-funroll-loops只有在有帮助的情况下才有帮助gcc 省略无用的imul指令以进行除最后一个以外的循环迭代,或完全优化循环。 -
是的,
-funroll-loops只是帮助 gcc 解决错过的优化问题。虽然这段代码似乎来自一个古老的 gcc 版本,比如 gcc4.1 godbolt.org/g/eDe8FX。甚至 gcc4.9 也将imul排除在循环之外,但即使 gcc8.1 仍然会执行所有加载。 (不过,使用 SSE2 或 AVX2 进行自动矢量化!)
标签: assembly