如何在gcc中禁用fma3指令

我需要为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))。'

我在g++ -g0 -march=x86-64 -O2 -mtune=generic -msse3 -mno-fma -DNDEBUG main.cpp的gcc环境中运行此代码,并始终获得0.48674319998526999 4602440005894221059

如何使用gcc复制_set_fma3_enable(0)结果?

Visual Studio 16.7.4。 gcc版本9.3.0(带有wsl)

zhaojun730730 回答:如何在gcc中禁用fma3指令

如何在gcc中禁用fma3指令

可以使用-mno-fma选项禁用FMA3指令的生成。 -ffp-contract=off是另一个选项,该选项还应禁止对FMA进行单独的乘法和加法运算的压缩。

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

显然,不是通过禁用FMA指令来完成的。 FMA不是唯一影响浮点运算精度的因素。

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

如果您不依赖于获得完全相同的结果,将会更简单。


P.S。由于读取形式的非活动联合成员,所显示程序的行为在C ++中未定义。

本文链接:https://www.f2er.com/1451418.html

大家都在问