【发布时间】:2016-12-24 14:38:05
【问题描述】:
我正在处理一些浮点数字代码,让我感到沮丧的是,O3 优化(GCC 4.8.3)代码的行为与 O2 情况(稳定的情况)产生了非常不同的结果,并且它结束了正如预期的那样,出现了数字灾难。
我查看了可能相关的this thread,但那里的答案并不能解决我的问题。我知道 O3 除了 O2 之外所做的主要是关于内联和循环展开。而且我很确定原因是由于浮点计算部分,因为在我明确使用 O2 优化该部分后,结果看起来很好。
#pragma GCC push_options
#pragma GCC optimize ("O2")
FP computation code (double precision)
#pragma GCC pop_options
所以我的问题是,O3 所做的哪种优化真的可以对浮点计算产生巨大的影响?
【问题讨论】:
-
它利用了未定义的行为?有更多细节吗?
-
如果
-fno-fast-math没有解决问题,请发布受影响的代码示例。 (我不认为-O3会打开-ffast-math,但我可能错了。-ffast-math是一种委婉说法;它可以实现广泛的不正确优化在浮点代码上。) -
@zwol 但这不符合 IEEE-754 对吗?
-
另外,如果您的代码使用 32 位 x86,请尝试
-mfpmath=sse。 (这是 x86-64 的默认设置。) -
发布您的代码。
-O3不 包含不安全的数学优化。-Ofast会。
标签: c++ c gcc optimization floating-point