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中.它会使你的代码变慢.
Max*_*Max -5
调试版本和发布版本之间出现性能差异是绝对正常的。
编译器和运行时将在调试版本中进行更多额外的健全性检查;不要将两者进行比较,尤其是在性能方面;比较版本与具有不同编译器开关的版本。
另一方面,如果两个版本之间的结果不同,那么您将必须进入并检查编程错误(很可能)。
最大限度。
| 归档时间: |
|
| 查看次数: |
4842 次 |
| 最近记录: |