使用gcc进行编译时,-ffast-math选项究竟是什么

pav*_*van -2 gcc gcc4 fast-math

任何人都可以帮助我理解使用gcc编译时-ffast-math选项的作用.使用-O3和-ffast-math执行时,我看到程序执行时间相差20秒,而只使用-O3

kvi*_*iri 14

为什么不阅读gcc手册页,它既是你的朋友,也是我的朋友.这是它告诉我的内容:

设置-fno-math-errno,-funsafe-math-optimizations,-finite-math-only,-fno-rounding-math,-fno-signaling-nans和-fcx-limited-range.

所以它本身没有做任何有趣的事情,但只是几个更有趣的编译器选项的简写.个别旗帜有什么作用?

  • fno-math-errno 使单指令数学运算未设置 ERRNO
  • funsafe-math-optimizations 允许数学优化假定有效参数并且可能违反ANSI和IEEE标准(谨慎,实际上并不有趣和安全)
  • ffinite-math-only同样,允许数学优化,假设任何浮点值既不是无限的也不是 NaN
  • fno-rounding-math并且fno-signaling-nans实际上是默认开启的.他们的对立frounding-mathfsignaling-nans禁用一些可能不安全/不可移植的优化.
  • fcx-limited-range允许编译器不进行某些复数运算检查.除非您实际使用复杂的数字,否则不太可能影响您的程序!

简而言之,它允许编译器以失去标准合规性和一些安全性为代价来优化您的程序.