首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc -ffp-合同期权的差异

gcc -ffp-合同期权的差异
EN

Stack Overflow用户
提问于 2017-04-11 17:24:02
回答 1查看 3.7K关注 0票数 9

我有一个关于GNU GCC的-ffp-contract旗帜的问题(见https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)。

旗标文档如下所示:

-ffp-contract=off禁用浮点表达式收缩。-ffp-contract=fast启用浮点表达式收缩,例如,如果目标具有本机支持,则形成融合的乘法添加操作。如果语言标准允许,-ffp-contract=on支持浮点表达式收缩.这目前还没有实现,并被视为等于-ffp-contract=off。默认情况是-ffp-contract=fast

现在的问题是:

  • 快和快有什么区别?
  • 除了FMA (或者类似于熔断子),还有其他收缩的例子吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-11 23:08:20

在C89中,FP收缩是不允许的。从C99开始,默认情况下,实现可以对表达式进行FP收缩,但随后需要提供#pragma STDC FP_CONTRACT (优先选择),以影响收缩行为。

所以GCC的开关是假定的是:

  • -ffp-contract=off:不要做收缩。忽略#pragma STDC FP_CONTRACT。这是-std=c89的默认设置。
  • -ffp-contract=on:默认启用收缩并尊重#pragma STDC FP_CONTRACT。这将是-std=c99和更高版本的默认设置。
  • -ffp-contract=fast**:这是GCC的默认值,甚至_都没有_的任何快速数学选项。*我们不主张在快速数学模式下符合_,所以总是收缩,甚至是单独的表达式都可以(见Marc的评论)。这是-std=gnu99和C的其他GNU方言的默认设置。

不幸的是,gcc -ffp-contract=on 还没有在GCC中实现#pragma STDC FP_CONTRACT,所以目前做的是保持ISO一致所必需的东西:nothing。也就是说,on = off,因为GCC唯一知道如何实现(快速)的行为对on来说太激进了。

你必须挖掘来源(或邮件列表),看看GCC能做什么样的收缩,但它不一定要局限于FMA。

有关一个表达式和2个语句的简单测试用例,请参见GCC与Clang谈“神栓”-ffp-contract=off默认为,但如您所见,支持onfast。GCC只支持offfaston映射到off

C11标准对#pragma STDC FP_CONTRACT有什么看法?

§6.5 8:可以收缩浮动表达式,即将其计算为单个操作,从而省略源代码和表达式计算方法所隐含的舍入错误。89) 中的FP_CONTRACT实用程序提供了一种不允许收缩表达式的方法。否则,表达式是否和如何收缩就是实现-定义.90)

  1. 收缩表达式中的中间操作被计算成无限的范围和精度,而最后的操作被舍入到表达式计算方法确定的格式。收缩表达式也可能忽略浮点异常的产生。
  2. 此许可证专门用于允许实现利用合并多个C操作符的快速机器指令。由于收缩可能会破坏可预测性,甚至会降低包含表达式的准确性,因此它们的使用需要有明确的定义和明确的文档。
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43352510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档