-O3与-Ofast优化之间的gcc差异



我刚刚阅读了gcc手册,想找出-O3-Ofast之间的区别。

对于-O3

-O3

Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the following optimization flags:
-fgcse-after-reload 
-fipa-cp-clone
-floop-interchange 
-floop-unroll-and-jam 
-fpeel-loops 
-fpredictive-commoning 
-fsplit-paths 
-ftree-loop-distribute-patterns 
-ftree-loop-distribution 
-ftree-loop-vectorize 
-ftree-partial-pre 
-ftree-slp-vectorize 
-funswitch-loops 
-fvect-cost-model 
-fversion-loops-for-strides

-Ofast

-Oast

Disregard strict standards compliance. -Ofast enables all -O3 optimizations. It also enables optimizations that are not valid for
all standard-compliant programs. It turns on -ffast-math,
-fallow-store-data-races and the Fortran-specific -fstack-arrays, unless -fmax-stack-var-size is specified, and -fno-protect-parens

因此,我想知道-Ofast是否出于某种原因不如-O3安全,因此我应该在大多数时候坚持使用-O3

你能澄清一下";实际差异";使用它们时?如果-Ofast真的是安全的?

Ofast支持违反C标准浮点语义要求的优化。特别是在-Ofast(也称为-ffast-math(下,它将自由地重新排序浮点计算(默认情况下是禁止的,因为通常a + (b + c) != (a + b) + c != a + (c + b)用于浮点(。

-Ofast在特定情况下是否安全取决于算法,但通常大多数非科学应用程序都能很好地使用它。例如,大多数游戏引擎都是用-ffast-math构建的。

最新更新