首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何禁用《gcc》中的fma3指令

如何禁用《gcc》中的fma3指令
EN

Stack Overflow用户
提问于 2020-10-05 19:12:52
回答 1查看 202关注 0票数 0

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

例如。

代码语言:javascript
复制
#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++上,它通过_set_FMA3_enable(0)运行到0.48674319998526994 4602440005894221058。不使用它的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版(带无线用户线)

EN

回答 1

Stack Overflow用户

发布于 2020-10-05 20:48:33

《gcc》中的

如何禁用fma3指令

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

如何使用gcc重现visual studio的效果?

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64207507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档