【发布时间】:2013-12-10 21:38:14
【问题描述】:
谁能帮助我理解使用 gcc 编译时 -ffast-math 选项的作用。与仅使用 -O3 相比,使用 -O3 和 -ffast-math 执行的程序执行时间相差 20 秒
【问题讨论】:
谁能帮助我理解使用 gcc 编译时 -ffast-math 选项的作用。与仅使用 -O3 相比,使用 -O3 和 -ffast-math 执行的程序执行时间相差 20 秒
【问题讨论】:
为什么不阅读gcc man page,它是你的朋友,也是我的朋友。这是它告诉我的:
设置 -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-math 和 fsignaling-nans 禁用了一些可能不安全/不可移植的优化。fcx-limited-range 允许编译器不进行某些复数算术检查。除非您实际处理的是复数,否则不太可能影响您的程序!简而言之,它允许编译器以牺牲标准合规性和一些安全性为代价来优化您的程序。
【讨论】: