3

哪些 gcc 编译器选项可以安全地用于数值编程?

打开 gcc 优化的简单方法是添加-0#到编译器选项。很有诱惑力的说-O3。但是,我知道这-O3包括非保存的优化,因为一旦包含此选项,数值计算的结果可能会有所不同。如果算法稳定,结果的微小变化可能是微不足道的。另一方面,精度可能是某些数学运算的问题,因此数学优化可能会产生重大影响。

我发现在调试过程中考虑编译器相关问题很不方便。即我不想怀疑代码中的微小变化是否会导致截然不同的行为,因为编译器在内部改变了它的优化。

如果我希望代码中的行为具有确定性,因此可以安全地添加哪些选项?哪些几乎是安全的,也就是说,与性能收益相比,哪些选项只引起很小的不确定性?

我想到了这样的选项:-finline -finline-limit=2000即使它们很长,也可以内联函数。

4

1 回答 1

7

-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对数值编程都是安全的。

于 2012-11-22T22:28:39.810 回答