-2

任何人都可以帮助我了解使用 gcc 编译时 -ffast-math 选项的作用。与仅使用 -O3 相比,使用 -O3 和 -ffast-math 执行的程序执行时间相差 20 秒

4

1 回答 1

16

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

设置 -fno-math-errno、-funsafe-math-optimizations、-ffinite-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允许编译器不进行某些复数算术检查。除非您实际使用复数,否则不太可能影响您的程序!

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

于 2013-11-25T23:21:14.413 回答