c++ - fp :precise vs. fp: 严格性能

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

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

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

有人知道吗?

提前致谢。

最佳答案

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

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

因此,在 Release模式构建中,您会得到略有不同的结果,因为计算是使用更多位执行的。在使用浮点值进行计算的程序中,这应该永远不会成为问题,double 只能存储 15 个有效数字。不同的是噪音数字,即前 15 位数字之外的数字。但如果您的计算严重丢失有效数字,有时会更少。就像计算 1 - 3 * (1/3.0)。

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

关于c++ - fp :precise vs. fp: 严格性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6423547/

相关文章:

c++ - 在特定内存地址创建堆,用于动态内存分配

Python:在哪里编译 RE?

c++ - 通过引用或指针传递 char 或 Short 是否比通过值传递慢?

python - 如何加速python循环

C++ 对象被向上转换为基类;不能调用派生方法

windows - 关于编译器选项 "Assembly, Machine Code and Source (/FAcs)"

c++ - 在成员函数的默认参数中使用强类型枚举的成员

c++ - 计算 N 组交集的快速算法

c++ - 有没有办法在不删除内容的情况下从 C++ 映射中删除键?

c++ - 按升序合并两个数组(两个数组大小相同)