Pon*_*nml 138 math floating-point performance gcc fast-math
我理解gcc的--ffast-math标志可以大大提高浮动操作的速度,并超出IEEE标准,但我似乎无法找到有关它正在发生的事情的信息.任何人都可以解释一些细节,并可能给出一个明确的例子,说明如果标志开启或关闭会有什么变化?
我确实尝试过挖掘SO以寻找类似的问题,但却找不到任何解释ffast-math工作原理的东西.
Dam*_*mon 240
-ffast-math 不仅仅是打破严格的IEEE合规性.
首先,当然,它确实打破了严格的IEEE合规性,允许例如将指令重新排序到数学上相同(理想情况下)但在浮点上不完全相同的事物.
其次,它禁用errno单指令数学函数后的设置,这意味着避免写入线程局部变量(这可以使某些体系结构上的那些函数有100%的差异).
第三,它假设所有数学都是有限的,这意味着没有对NaN(或零)进行检查,因为它们会产生不利影响.简单地假设这不会发生.
第四,它实现了除法和倒数平方根的倒数近似.
此外,它禁用有符号零(代码假定有符号零不存在,即使目标支持它)和舍入数学,这使得在编译时可以进行常量折叠.
最后,它生成的代码假定由于信令/捕获数学不会发生硬件中断(也就是说,如果在目标体系结构上无法禁用这些中断并因此确实发生,则不会处理它们).
Mys*_*ial 77
如您所述,它允许优化不保持严格的IEEE合规性.
一个例子是:
x = x*x*x*x*x*x*x*x;
Run Code Online (Sandbox Code Playgroud)
至
x *= x;
x *= x;
x *= x;
Run Code Online (Sandbox Code Playgroud)
由于浮点运算不是关联的,因此操作的排序和分解会因舍入而影响结果.因此,这种优化不是在严格的FP行为下完成的.
我实际上没有检查过GCC是否真的进行了这种特殊的优化.但这个想法是一样的.
| 归档时间: |
|
| 查看次数: |
45279 次 |
| 最近记录: |