哪些gcc编译器选项可以安全地用于数值编程?
打开gcc优化的简单方法是将-0#添加到编译器选项中。说-O3是很诱人的。但是,我知道-O3包括优化,这是非保存的,因为一旦包含了这个选项,数值计算的结果可能会有所不同。如果算法是稳定的,结果中的小变化可能是微不足道的。另一方面,对于某些数学运算来说,精度可能是一个问题,因此数学优化可能会产生重大影响。
我发现在调试过程中考虑编译器相关问题是不方便的。也就是说,我不想怀疑代码中的小改动是否会导致强烈不同的行为,因为编译器在内部改变了它的优化。
如果我想要在我的代码中添加确定性的行为--因此也是可控的--哪些选项是安全的?哪种选择几乎是安全的,也就是说,与业绩效益相比,哪种选择只导致了较小的不确定性?
我想到了一些选项,比如:-finline -finline-limit=2000,它可以内联功能,即使它们是长的。
发布于 2012-11-22 22:28:39
-O3不包括不安全的数值优化,这是不正确的。根据the manual,与-O2相比,-O3包括以下优化传递
-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或规则/规范的数学函数。但是,对于不需要这些规范的保证的程序,它可能会产生更快的代码。
换句话说,所有的-O、-O2和-O3对于数字编程都是安全的。
https://stackoverflow.com/questions/13518759
复制相似问题