fp:精确与fp:严格性能

fp:precise vs. fp:strict performance

本文关键字:fp 性能      更新时间:2023-10-16

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

仔细想想,我意识到在我的程序中使用fp:specific模型可能更好,因为它的特性,但我担心性能。我试图找到一些关于fp:sstrict的性能问题的信息,或者精确和严格模型之间的性能差异,但我发现的信息很少。

有人知道这件事吗??

提前谢谢。

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

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

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

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

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

只提供我的两美分:

我有一个自动矢量化的图像处理程序,目的是以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

严格的未矢量化

使用strict将代码的速度降低了2倍。这是不可接受的。

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

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

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

最大。