我检测到我的程序结果在发布版本和调试版本之间存在一些差异。经过一些研究后,我意识到一些浮点优化导致了这些差异。通过使用fenv_access杂注禁用一些关键方法的一些优化,我已经解决了这个问题。
考虑到这一点,我意识到在我的程序中使用fp:strict模型可能比使用fp:precise模型更好,因为它的特点,但我担心性能。我试图找到一些关于fp:strict的性能问题的信息,或者精确和严格模型之间的性能差异,但我找到的信息很少。
有人知道这件事吗??
提前谢谢。
发布于 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中。当然,这会使你的代码变慢。
发布于 2011-06-22 21:25:55
我不确定这是不是一个解决方案,但我有:)正如我之前的post,我写了一个测试程序,执行浮点操作,据说是在fp:precise下优化的,而不是在fp:strict下优化的,然后测量性能。我运行了10000次,平均来说,fp:strict比fp:precise慢2.85%。
发布于 2013-04-21 16:30:50
仅提供我的两点意见:
我有一个自动矢量化的图像处理程序,目的是以matlab为金标准来比较其性能和精度。
使用VS2012和英特尔i950。
关键区域错误和运行时
2.3328196e-02 465 ms with strict
7.1277611e-02 182 ms with precise
7.1277611e-02 188 ms with fast严格的没有矢量化
使用strict使代码速度减慢了2倍。这是不可接受的。
https://stackoverflow.com/questions/6423547
复制相似问题