gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:39:15 25 4
gpt4 key购买 nike

我检测到发布版本和调试版本之间的程序结果存在一些差异。经过一些研究,我意识到一些浮点优化导致了这些差异。我已经通过使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com