首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fp:精确vs. fp:严格性能

fp:精确vs. fp:严格性能
EN

Stack Overflow用户
提问于 2011-06-21 18:04:51
回答 4查看 5.3K关注 0票数 14

我检测到我的程序结果在发布版本和调试版本之间存在一些差异。经过一些研究后,我意识到一些浮点优化导致了这些差异。通过使用fenv_access杂注禁用一些关键方法的一些优化,我已经解决了这个问题。

考虑到这一点,我意识到在我的程序中使用fp:strict模型可能比使用fp:precise模型更好,因为它的特点,但我担心性能。我试图找到一些关于fp:strict的性能问题的信息,或者精确和严格模型之间的性能差异,但我找到的信息很少。

有人知道这件事吗??

提前谢谢。

EN

回答 4

Stack Overflow用户

发布于 2011-06-21 20:52:51

这是因为您是在32位模式下编译的,它使用x86浮点处理器。代码优化器删除了从FPU寄存器到内存再返回的冗余移动,将中间结果保留在FPU堆栈中。一个非常重要的优化。

问题是,FPU以80位的精度存储双精度数。而不是双精度的64位精度。英特尔最初认为这是一个功能,产生更准确的中间计算,但它实际上是一个错误。当他们设计64位编译器用来做浮点数学的SSE2指令集时,他们没有犯同样的错误。XMM寄存器为64位。

因此,在发布模式构建中,你会得到微妙的不同结果,因为计算是用更多的位来执行的。在使用浮点值进行计算的程序中,这不应该是一个问题,一个双精度只能存储15位有效数字。不同的是噪声数字,超过前15位的数字。但有时如果你的计算严重丢失了有效数字,就会更少。就像计算1-3* (1/3.0)。

但是,你可以使用fp:precise来获得一致的噪声数字。它强制将中间值刷新到内存中,这样它们就不能以80位精度保留在FPU中。当然,这会使你的代码变慢。

票数 14
EN

Stack Overflow用户

发布于 2011-06-22 21:25:55

我不确定这是不是一个解决方案,但我有:)正如我之前的post,我写了一个测试程序,执行浮点操作,据说是在fp:precise下优化的,而不是在fp:strict下优化的,然后测量性能。我运行了10000次,平均来说,fp:strict比fp:precise慢2.85%。

票数 1
EN

Stack Overflow用户

发布于 2013-04-21 16:30:50

仅提供我的两点意见:

我有一个自动矢量化的图像处理程序,目的是以matlab为金标准来比较其性能和精度。

使用VS2012和英特尔i950。

关键区域错误和运行时

代码语言:javascript
复制
2.3328196e-02 465 ms with strict 
7.1277611e-02 182 ms with precise
7.1277611e-02 188 ms with fast

严格的没有矢量化

使用strict使代码速度减慢了2倍。这是不可接受的。

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

https://stackoverflow.com/questions/6423547

复制
相关文章

相似问题

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