【问题标题】:How to disable fma3 instructions in gcc如何在 gcc 中禁用 fma3 指令
【发布时间】:2020-10-05 11:12:52
【问题描述】:

我需要为 64 位系统禁用 FMA3 指令(出于向后兼容性问题)。 我在 Windows 环境中使用了_set_FMA3_enable(0)。我需要使用什么选项(或宏)来禁用 gcc 中的 FMA3?

例如。

#include <iostream>
#include <iomanip>
#include <math.h>
#include <limits>

union value
{
    double real;
    long long unsigned integer;
};

int main()
{
#if defined (_WIN64)
    _set_FMA3_enable(0);
#endif

    value x;
    x.integer = 4602754097807755994;
    value y;
    y.real = sin(x.real);
    
    std::cout << std::setprecision(17) << y.real << std::endl;
    std::cout << y.integer << std::endl;
}

在 Visual C++ 上,它运行到 0.48674319998526994 4602440005894221058 和 _set_FMA3_enable(0)。 0.48674319998526999 4602440005894221059 没有它(或使用 `_set_FMA3_enable(1))。'

我在 gcc 环境中使用g++ -g0 -march=x86-64 -O2 -mtune=generic -msse3 -mno-fma -DNDEBUG main.cpp 运行此代码,并且总是得到0.48674319998526999 4602440005894221059。

如何使用 gcc 重现 _set_FMA3_enable(0) 结果?

Visual Studio 16.7.4。 gcc 9.3.0 版(带 wsl)

【问题讨论】:

标签: c++ gcc cross-platform fma


【解决方案1】:

如何在 gcc 中禁用 fma3 指令

可以使用-mno-fma 选项禁用 FMA3 指令的生成。 -ffp-contract=off 是另一个选项,它还应该禁用单独乘法的收缩并将操作添加到 FMA。

如何使用 gcc 重现 [visual studio] 结果?

显然,不是通过禁用 FMA 指令。 FMA 并不是唯一影响浮点运算准确性的因素。

您可以尝试不依赖sin 的标准库,而是在两个系统上使用相同的实现。您还可以显式设置舍入模式,以便您不依赖系统默认值。如果你这样做了,那么你也应该使用-frounding-math。

如果你不能依赖获得完全相同的结果,那会更简单。


附:由于读取表单非活动联合成员,所示程序的行为在 C++ 中未定义。

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多