微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 是否有一个(Linux)g相当于Visual Studio中使用的/ fp:precise和/ fp:fast标志?

背景:

许多年前,我继承了一个使用Visual Studio(VC)标志’/ fp:fast’的代码库,在特定的计算重型库中生成更快的代码.不幸的是,’/ fp:fast’产生的结果与不同编译器(Borland C)下的同一个库略有不同.当我们需要产生完全相同的结果时,我切换到’/ fp:精确’,这是很好的,从那以后,一切都是桃子.然而,现在我正在使用u在Ubuntu Linux 10.04上编译同一个库,我看到类似的行为,我想知道它是否可能有类似的根本原因.我的g构建的数值结果与VC构建的数值结果略有不同.这带给我我的问题:

题:

g对VC中的“fp:fast”和“fp:precise”选项有相同或相似的参数? (和他们是什么?我想激活’fp:精确’等价物.)

更详细信息:

我使用’make’编译,它调用g.据我所知(make文件有点隐含,并不是由我写的),g调用添加的唯一参数是“正常”(包括文件夹和要编译的文件)和-fPIC(我不知道这个开关是什么,我在’man’页面上看不到它).

“man g”中唯一的相关参数似乎是打开优化选项. (例如,安全数学优化).但是,我不认为我打开任何东西,我只想关闭相关优化.

我已经尝试发布和调试版本,VC为发布和调试提供相同的结果,g给出相同的发布和调试结果,但是我无法获得g版本,以提供与VC版本相同的结果.

解决方法

过多的寄存器精度仅在FPU寄存器上是一个问题,编译器(使用正确的使能开关)往往会避免.当在SSE寄存器中进行浮点计算时,寄存器精度等于存储器的精度.

在我的经验中,大多数/ fp:快速影响(和潜在的差异)来自于编译器自由地执行代数变换.这可以像更改总和顺序一样简单:

( a + b ) + c --> a + ( b + c)

可以像*(b c)一样分布乘法,并且可以获得一些相当复杂的变换 – 所有这些都旨在重用以前的计算.
在无限精度下,这种变换当然是良性的 – 但是在有限的精度下,它们实际上改变了结果.作为玩具的例子,尝试a = b = 2 ^( – 23),c = 1的summand-order-example.MS的Eric Fleegal describes it in much more detail.

在这方面,最接近/ fp:precise的gcc开关是-fno-unsafe-math-optimizations.我认为这是认的 – 也许您可以尝试明确设置它,看看它是否有所作为.类似地,您可以尝试明确地关闭所有的-ffast-math优化:-fno-finite-math-only,-fmath-errno,-ftrapping-math,-frounding-math和-fsignaling-nans(最后2个选项是非认!)

原文地址:https://www.jb51.cc/c/115073.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐