gpt4 book ai didi

c++ - 是否有一个(Linux)g++相当于/fp :precise and/fp:fast flags used in Visual Studio?

转载 作者:可可西里 更新时间:2023-11-01 14:52:49 28 4
gpt4 key购买 nike

背景:

许多年前,我继承了一个代码库,该代码库使用 Visual Studio (VC++) 标志“/fp:fast”在特定的计算量大的库中生成更快的代码。不幸的是,'/fp:fast' 产生的结果与不同编译器 (Borland C++) 下的同一个库略有不同。因为我们需要产生完全相同的结果,所以我切换到“/fp:precise”,效果很好,从那以后一切都很顺利。但是,现在我在 uBuntu Linux 10.04 上用 g++ 编译同一个库,我看到了类似的行为,我想知道它是否有类似的根本原因。我的 g++ 构建的数值结果与我的 VC++ 构建的数值结果略有不同。这引出了我的问题:

问题:

g++ 是否具有与 VC++ 中的“fp:fast”和“fp:precise”选项等效或相似的参数? (它们是什么?我想激活等效的“fp:precise”。)

更多详细信息:

我使用调用 g++ 的“make”进行编译。据我所知(make 文件有点神秘,不是我写的)添加到 g++ 调用的唯一参数是“正常”参数(包括文件夹和要编译的文件)和 -fPIC (我不确定这个开关的作用,我没有在“手册”页面上看到它)。

“man g++”中唯一相关的参数似乎是用于打开优化选项。 (例如 -funsafe-math-optimizations)。但是,我不认为我正在打开任何东西,我只是想关闭相关的优化。

我试过 Release 和 Debug 版本,VC++ 给出了相同的发布和调试结果,g++ 给出了相同的发布和调试结果,但我无法让 g++ 版本给出与 VC++ 相同的结果版本。

最佳答案

来自GCC manual :

-ffloat-store Do not store floating point variables in registers, and inhibit other options that might change whether a floating point value is taken from a register or memory.

This option prevents undesirable excess precision on machines such as the 68000 where the floating registers (of the 68881) keep more precision than a double is supposed to have. Similarly for the x86 architecture. For most programs, the excess precision does only good, but a few programs rely on the precise definition of IEEE floating point. Use -ffloat-store for such programs, after modifying them to store all pertinent intermediate computations into variables.

扩展一下,这些差异大部分来自使用 x86 80 位浮点寄存器进行计算(相对于用于存储 double 值的 64 位)。如果中间结果保存在寄存器中而不写回内存,您可以有效地在计算中获得 16 位的额外精度,使它们更精确,但可能与将中间值写入/读取内存(或从计算只有 64 位 FP 寄存器的体系结构)。

这些标志(在 GCC 和 MSVC 中)通常强制将每个中间结果截断为 64 位,从而使计算对代码生成和优化的变幻莫测以及平台差异不敏感。除了准确性/精度方面的成本之外,这种一致性通常会带来轻微的运行时间成本。

关于c++ - 是否有一个(Linux)g++相当于/fp :precise and/fp:fast flags used in Visual Studio?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3234042/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com