hig*_*guy 3 c compiler-construction optimization gcc numeric
打开gcc优化的简单方法是添加-0#到编译器选项.很有诱惑力-O3.但是,我知道-O3包括优化,这是非保存的,因为一旦包含此选项,数值计算的结果可能会有所不同.如果算法稳定,结果的微小变化可能是微不足道的.另一方面,精度可能是某些数学运算的问题,因此数学优化会产生重大影响.
我发现在调试过程中考虑编译器相关问题是不方便的.即我不想知道代码中的微小变化是否会导致强烈不同的行为,因为编译器在内部更改了它的优化.
如果我想在我的代码中使用确定性(因此可控制)行为,哪些选项可以安全添加?这几乎是安全的,也就是说,哪些选项与性能优势相比只会产生微小的不确定性?
我想到了这样的选项:-finline -finline-limit=2000即使它们很长,也会内联函数.
-O3包含数字上不安全的优化是不正确的.根据手册,-O3包括以下优化过程-O2:
-finline-functions,-funswitch-loops,-fpredictive-commoning,-fgcse-after-reload,-ftree-vectorize和-fipa-cp-clone
你可能指的是-ffast-math,默认打开-Ofast,但不是-O3:
-ffast-math套-fno-math-errno,-funsafe-math-optimizations,-ffinite-math-only,-fno-rounding-math,-fno-signaling-nans和-fcx-limited-range.此选项会导致__FAST_MATH__定义预处理器宏.此选项不会被任何
-O选项打开,-Ofast因为它可能导致程序的输出不正确,这些程序依赖于IEEE或ISO规则/数学函数规范的精确实现.但是,对于不需要保证这些规范的程序,它可能会产生更快的代码.
换句话说,所有的-O,-O2以及-O3是用于数字编程安全.