fp:精确与fp:严格性能
fp:precise vs. fp:strict performance
我在发布版本和调试版本之间的程序结果中检测到一些差异。经过一些研究,我意识到一些浮点优化导致了这些差异。我已经通过使用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倍。这是不可接受的。
看到调试版本和发布版本之间的性能差异是绝对正常的。
编译器和运行时间将在调试版本中进行更多额外的健全性检查;不要将两者进行比较,尤其是在性能方面;比较发行版与使用不同编译器开关的发行版。
另一方面,如果两个版本之间的结果不同,那么您将不得不进去检查编程错误(很可能)。
最大。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- fp:精确与fp:严格性能