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

时间:2011-06-21 10:04:51

标签: c++ performance visual-c++ floating-point

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

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

有谁知道这件事?

提前致谢。

4 个答案:

答案 0 :(得分:14)

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

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

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

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

答案 1 :(得分:1)

我不确定这是否是一个解决方案但是我有:) 正如我之前发布的那样,我已经编写了一个测试程序来执行浮点运算,据说在fp下进行了优化:精确而不是在fp:strict下,然后测量性能。我运行了10000次,平均而言,fp:strict比fp:precision慢2.85%。

答案 2 :(得分:0)

只提供我的两分钱:

我有一个自动向量化的图像处理程序,目的是比较matlab作为黄金标准的性能和准确性。

使用VS2012和Intel i950。

关键区域错误&运行

2.3328196e-02 465 ms with strict 
7.1277611e-02 182 ms with precise
7.1277611e-02 188 ms with fast

严格没有进行反击

使用严格将代码减慢2倍。这是不可接受的。

答案 3 :(得分:-3)

看看Debug和Release版本之间的性能差异是绝对正常的。

编译器和运行时将在调试版中进行更多额外的健全性检查;不要相互比较,特别是在性能方面;使用不同的编译器开关比较发布与发布。

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

最大