Clang 融合乘加取决于表达式参数的恒定性

Clang fused multiply-add depends on constancy of expression arguments

提问人:Fedor 提问时间:3/28/2023 最后编辑:phuclvFedor 更新时间:7/5/2023 访问量:178

问:

clang 14.0.0 浮点优化的答案中所示,从版本 14 开始,Clang 应用融合乘加 (FMA) 指令,即使对于在编译时执行的常量计算也是如此。

同时,可以观察到结果取决于表达式参数的形式恒定性:

#include <stdio.h>

int main() {
    const float A = 2.1f;
    const float B = 0.1f;
          float C = 0.1f;
    float V = A * B - A * B;
    float W = A * C - A * C;
    printf( "%g %g", V, W );
}

在 Clang 中,程序打印,在线演示:https://godbolt.org/z/a3fcYG7ob0 1.49011e-10

从汇编代码中可以看出,两者都是在编译时计算的。是否有一些规则规定只能使用 FMA 指令进行评估?VWW

添加用于禁用 FMA 指令的命令行选项不会更改结果中的任何内容。-mno-fma

C 优化 浮点 Clang FMA

评论

1赞 Peter Cordes 7/5/2023
还相关:如果将数学移动到内联函数,为什么 C++ 舍入行为(对于编译时常量)会发生变化?回复:const 或 constexpr 对 FP 收缩(到 FMA)与常数传播的影响。还有 clang 14.0.0 浮点优化
0赞 Sam Mason 7/5/2023
不要认为这是你想要的,但似乎你可以通过显式使用它来强制编译 FMA 的使用: godbolt.org/z/adjxYr19K

答: 暂无答案