如何让GCC优化长XOR链
How to get GCC to optimize long XOR chain
我有一个类似的循环
uint32_t result = 0;
for ( int i = 0; i < CONSTANT; ++i )
{
result ^= expr;
}
return result;
总的来说,GCC在这个代码方面做得很好。它完全展开循环并为expr
生成最佳代码。然而,它执行result
异或CONSTANT
次。它可以是累积部分结果,并按层次将它们异或在一起。
我怀疑,如果我用宏手动展开它,我可以手动完成(CONSTANT
不是很大),但我想知道为什么它看不到这一点,或者我是否正在做一些由于某些晦涩的C++语言规则而阻止它的事情。
在这里积累部分结果可能没有任何好处。如果你使用一种分而治之的策略(XOR与赔率持平,将大小减半,然后重复,每次将操作数减半),你最终仍然会做O(CONSTANT)
的功(一半的功加四分之一的功加八分之一的工,等等,最终执行CONSTANT - 1
运算)。
将部分结果累积为块的行为相同。从根本上讲,您必须具有CONSTANT - 1
XOR操作。由于这些都是固定宽度的寄存器,不会增长任意精度的整数,所以每个XOR的工作都是相同的。除非并行化expr
工作,否则您不太可能从更复杂的方法中获得任何收益。
对于您的循环,要么expr
不依赖于i
,在这种情况下gcc
应该完全优化掉循环1,要么它确实这样做,在这种情形下gcc
仍然可以优化掉它(因为循环边界是恒定的,所以可以预先计算整个循环)。
不过,在后一种情况下,它似乎失败了,除非您为-march=haswell
进行了优化。这看起来真的很奇怪,但我以前确实见过这种行为。
在任何情况下2,您提到expr
编译为两条指令。为xor
、循环增量和测试指令添加3条指令,您已经为该循环添加了5条指令,这甚至超过了高端x86 CPU的退役率,因此在这里寻求额外的指令级并行性没有任何好处(除非您正在编译到宽度更高的非x86架构?)。
1。。。无论如何,在-O3
,它通常是这样做的。
2我们只能在这里猜测,因为你真的在严密地保守expr
的秘密。
- 我的神经网络不起作用 [XOR 问题]
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 使用模板化运算符重载 XOR 运算符失败
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 如何让GCC优化长XOR链