c++ 为什么编译器不把“n / 2.0”强制转换成“n * 0.5”,如果这样更快的话?[已关闭]

oknrviil  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(72)

**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
我一直认为num * 0.5fnum / 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周期。*
sbtkgmzw

sbtkgmzw1#

如果使用-O2优化进行编译,两个编译器将得到相同的实现。
https://godbolt.org/z/v3dhvGref

相关问题