任何人都可以帮助我理解使用gcc编译时-ffast-math选项的作用。我发现使用-O3和-ffast-math执行时程序执行时间相差20秒,而只使用-O3
答案 0 :(得分:13)
为什么不读gcc man page,这是你的朋友和我的朋友。这是它告诉我的:
设置-fno-math-errno,-funsafe-math-optimizations, -ffinite-math-only,-fno-rounding-math,-fno-signaling-nans和 -fcx-有限范围。
因此它本身没有做任何有趣的事情,但它只是几个更有趣的编译器选项的简写。各个旗帜做了什么?
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
允许编译器不进行某些复数运算检查。除非你真的使用复杂的数字,否则不太可能影响你的程序!简而言之,它允许编译器以失去标准合规性和一些安全性为代价来优化您的程序。