**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
我一直认为num * 0.5f
和num / 2.0f
是等价的,因为我认为编译器足够聪明,可以优化除法,所以今天我决定测试一下这个理论,结果让我很困惑。
给定以下示例代码:
float mul(float num) {
return num * 0.5f;
}
float div(float num) {
return num / 2.0f;
}
x86-64 clang和gcc都生成以下程序集输出:
mul(float):
push rbp
mov rbp, rsp
movss DWORD PTR [rbp-4], xmm0
movss xmm1, DWORD PTR [rbp-4]
movss xmm0, DWORD PTR .LC0[rip]
mulss xmm0, xmm1
pop rbp
ret
div(float):
push rbp
mov rbp, rsp
movss DWORD PTR [rbp-4], xmm0
movss xmm0, DWORD PTR [rbp-4]
movss xmm1, DWORD PTR .LC1[rip]
divss xmm0, xmm1
pop rbp
ret
当将其馈送(循环)到在X1 E3 F1 X处可用的代码分析器中时,其分别向我们示出9.0和16.0(Skylake)CPU周期的预测吞吐量。
我的问题是:为什么编译器不强制div函数等价于穆尔函数呢?当然,让rhs成为一个常量值应该会更方便,不是吗?
- PS.我还在Rust中尝试了一个等效的示例,结果分别为4.0和11.0 CPU周期。*
1条答案
按热度按时间sbtkgmzw1#
如果使用
-O2
优化进行编译,两个编译器将得到相同的实现。https://godbolt.org/z/v3dhvGref