我有一个关于GNU GCC中< code>-ffp-contract标志的问题(见https://GCC . GNU . org/online docs/GCC/Optimize-options . html)。
标志文档编写如下:
< code>-ffp-contract=off禁用浮点表达式收缩。< code>-ffp-contract=fast启用浮点表达式收缩,如融合乘加运算的形成(如果目标具有对它们的本机支持)。< code>-ffp-contract=on如果语言标准允许,则启用浮点表达式收缩。这目前尚未实现,并被视为等于< code>-ffp-contract=off。默认值为< code>-ffp-contract=fast。
现在的问题是:
在 C89 中,FP 收缩是不允许的。从 C99 开始,默认情况下,实现可以对表达式执行 FP 收缩,但随后需要提供一个#pragma STDC FP_CONTRACT
(cppreference),可以切换该代码来影响收缩行为。
因此,GCC 开关应该是:
-ffp-合约=关闭
:不要进行收缩。忽略#pragma STDCFP_CONTRACT
。这是-std=c89
的默认值。-ffp-合约=on
:默认启用收缩并尊重#pragma STDCFP_CONTRACT
。这将是-std=c99
及更高版本的默认值。-ffp-合约=快速
:这是GCC默认设置,即使没有任何快速数学选项。我们不要求在快速数学模式下符合ISO,因此始终收缩是可以的,即使是单独的表达式(参见Marc Glisse的评论)。这是-std=gnu99
和C.的其他GNU方言的默认设置。不幸的是,#pragma STDCFP_CONTRACT
还没有在GCC中实现,所以目前gcc-ffp-合同=on
做了保持符合ISO的必要工作:没有。即on=off,因为GCC知道如何实现(快速)的唯一其他行为对于on
来说太激进了。
你必须深入研究来源(或邮件列表),看看GCC能够做什么样的收缩,但它不必局限于FMA。
有关一个表达式与2个语句的简单测试用例,请参阅Gobolt上的GCC和Clang。如您所见,Clang默认为-ffp合约=off
,但支持on
和Fast
。GCC仅支持off
和Fast
,on
映射到off
。
C11标准对#pragma STDC FP_CONTRACT的评价:
§6.5¶8:浮动表达式可以被收缩,也就是说,计算就好像它是单个操作一样,从而省略了源代码和表达式计算方法所暗示的舍入误差 FP_CONTRACT。
收缩表达式中的中间操作被计算为无限范围和精度,而最终操作被四舍五入为表达式计算方法确定的格式。收缩表达式还可能省略浮点异常的引发。
此许可证专门用于允许实现利用组合多个 C 运算符的快速机器指令。由于收缩可能会破坏可预测性,甚至会降低包含表达式的准确性,因此需要明确定义和清楚地记录它们的使用。
我有一台i5-4250U,它有AVX2和FMA3。我正在Linux上测试我写的GCC 4.8.1中的一些密集矩阵乘法代码。下面是我编译的三种不同方式的列表。 SSE2和AVX版本在性能上明显不同。然而,AVX2 FMA并不比AVX版本好。我不明白这一点。假设没有FMA,我可以获得超过80%的CPU峰值翻转,但我认为我应该可以用FMA做得更好。矩阵乘法应该直接受益于FMA。我基本上是在AVX中一次做
本文向大家介绍Scala选项作为集合,包括了Scala选项作为集合的使用技巧和注意事项,需要的朋友参考一下 示例 Option具有一些有用的高阶函数,通过将选项查看为具有零个或一个项目的集合,可以很容易地理解它们-None行为类似于空集合,而Some(x)行为类似于具有单个项的集合x。
sdiff key1 key2...keyN 返回所有给定key的差集 sdiffstore dstkey key1...keyN 同sdiff,并同时保存差集到dstkey下
如何获取所有可用优化标志及其参数值的列表?像这样的东西 https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html,但在命令行上
Solidity中合约有点类似面向对象语言中的类。合约中有用于数据持久化的状态变量(state variables),和可以操作他们的函数。调用另一个合约实例的函数时,会执行一个EVM函数调用,这个操作会切换执行时的上下文,这样,前一个合约的状态变量(state variables)就不能访问了。 创建合约 合约可以通过Solidity,或不通过Solidity创建。当合约创建时,一个和合约同名的
Solidity 合约类似于面向对象语言中的类。合约中有用于数据持久化的状态变量,和可以修改状态变量的函数。 调用另一个合约实例的函数时,会执行一个 EVM 函数调用,这个操作会切换执行时的上下文,这样,前一个合约的状态变量就不能访问了。 创建合约 可以通过以太坊交易“从外部”或从 Solidity 合约内部创建合约。 一些集成开发环境,例如 Remix, 通过使用一些用户界面元素使创建过程更加流