fp:精确与fp:严格的表现

Ale*_*lex 14 c++ floating-point performance visual-c++

我在Release和Debug版本的程序结果中发现了一些差异.经过一些研究后,我意识到一些浮点优化会导致这些差异.我已经通过使用fenv_access pragma来禁用某些关键方法的某些优化来解决了这个问题.

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

有人对这个有了解吗??

提前致谢.

Han*_*ant 14

发生这种情况是因为您在32位模式下编译,它使用x86浮点处理器.代码优化器消除了从FPU寄存器到存储器和返回的冗余移动,将中间结果留在FPU堆栈中.一个非常重要的优化.

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

因此,在发布模式构建中,由于使用更多位执行计算,因此会得到微妙的不同结果.这在使用浮点值来计算的程序中永远不会成为问题,double只能存储15位有效数字.有什么不同的是噪音数字,超过前15位的数字.但有时候,如果你的计算失去了重要的数字,那就少了.比如计算1 - 3*(1/3.0).

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

  • 对 80 位与 64 位差异的很好的解释。但是,……也许有点挑剔……这真的能回答问题吗?还是“隐含”的问题?亚历克斯主要询问“性能影响”......而这正是您没有回答的部分。 (2认同)
  • 32位编译器也可以使用SSE2进行fp数学运算,如果在MSVC上设置`/ arch:SSE2`,它会尽可能覆盖带有SSE2变量的x87指令:) (2认同)

Max*_*Max -5

调试版本和发布版本之间出现性能差异是绝对正常的。

编译器和运行时将在调试版本中进行更多额外的健全性检查;不要将两者进行比较,尤其是在性能方面;比较版本与具有不同编译器开关的版本。

另一方面,如果两个版本之间的结果不同,那么您将必须进入并检查编程错误(很可能)。

最大限度。

  • 正如您所说,调试和发布性能没有可比性。我不想比较这个。另一方面,我在调试版本和发布版本之间得到了不同的结果。现在我已经解决了这个问题。我的疑问是因为使用 fp:strict 作为我的程序的浮点模型可能更好。所以我正在寻找的是对 fp:strict 模型的性能问题及其与 fp:precise 的差异的某种分析或一般概述。 (2认同)