我有一个关于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。
现在的问题是:
发布于 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默认为,但如您所见,支持on和fast。GCC只支持off和fast,on映射到off。
C11标准对#pragma STDC FP_CONTRACT有什么看法?
§6.5 8:可以收缩浮动表达式,即将其计算为单个操作,从而省略源代码和表达式计算方法所隐含的舍入错误。89) 中的FP_CONTRACT实用程序提供了一种不允许收缩表达式的方法。否则,表达式是否和如何收缩就是实现-定义.90)
https://stackoverflow.com/questions/43352510
复制相似问题