Ste*_*ger 5 c floating-point gcc compiler-optimization fma
我对-ffp-contractGNU GCC中的标志有疑问(请参阅https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)。
标志文档编写如下:
-ffp-contract=off禁用浮点表达式收缩。-ffp-contract=fast如果目标对它们有本机支持,则启用浮点表达式收缩,例如形成融合的乘法加法运算。-ffp-contract=on如果语言标准允许,则启用浮点表达式收缩。目前尚未实现,并且将其视为-ffp-contract=off。默认值为-ffp-contract=fast。
现在的问题是:
在C89中,FP收缩是不允许的。从C99开始,默认情况下,实现可以执行FP表达式的收缩,但是随后需要提供#pragma FP_CONTRACT可切换以影响收缩行为的。
因此,GCC开关应该是:
-ffp-contract=off:不要收缩。忽略#pragma FP_CONTRACT。这是的默认设置-std=c89。-ffp-contract=on:默认启用收缩和荣誉#pragma FP_CONTRACT。这将是-std=c99及以上的默认设置。-ffp-contract=fast:即使没有任何快速选项,这也是GCC的默认设置。 我们不要求在快速数学模式下符合ISO要求,因此总是可以收缩甚至是单独的表达式(请参阅Marc Glisse的评论)。不幸的是,#pragma FP_CONTRACT是不是还没有在GCC中实现,所以现在做什么是必要留ISO-符合:没有。即on = off,因为GCC知道的唯一其他行为(快速)对于而言过于激进。-ffp-contract=on on
您必须深入研究来源(或邮件列表),以查看GCC能够执行哪种收缩,但不必局限于FMA。
有关一个表达式与2个语句的简单测试用例,请参见Godbolt上的GCC和Clang。 Clang默认为,-ffp-contract=off但支持on和fast。GCC仅支持关闭和快速。
C11标准必须说些什么#pragma FP_CONTRACT:
§6.5¶8:浮动表达式可能会收缩,也就是说,就像将其视为单个操作一样进行评估,从而忽略了源代码和表达式评估方法所隐含的舍入错误。89)FP_CONTRACT编译指示提供了一种禁止使用压缩的表达式。否则,是否以及如何收缩表达式由实现定义(90)。
89)对收缩表达式中的中间运算进行评估,就好像是无限范围和精确度一样,而最终运算将四舍五入为表达式评估方法确定的格式。收缩表达式也可能会忽略浮点异常的引发。
90)该许可证专门用于允许实现利用结合了多个C运算符的快速机器指令。由于收缩可能会破坏可预测性,甚至可能降低包含表达式的准确性,因此需要明确定义并明确记录其用法。
| 归档时间: |
|
| 查看次数: |
1102 次 |
| 最近记录: |