GCC/Clang 相当于 ICC 中的 -fp-model fast=1

问题描述 投票:0回答:2

正如我在英特尔网站上读到的:

Intel 编译器默认使用 /fp-model fast=1。本次优化 注重速度胜于标准合规性。您可以使用编译器选项 -mieee-fp 获取合规代码。

我对ICC中的fp-model选项的理解是(如果我错了请纠正我):

  • precise
    对应于 GCC 和 Clang 中的默认设置,
  • fast=2
    类似于
    -ffast-math
    ,
  • fast=1
    介于两者之间。

GCC 或 Clang 中的哪些选项可以使浮点数学与英特尔的默认值最相似

-fp-model fast=1

gcc floating-point clang icc fast-math
2个回答
3
投票

根据 GCC 的 set_fast_math_flags 函数,

ffast-math
选项(至少在 GCC 5.2 中)相当于

(1) 不安全选项组:

-fno-trapping-math
-fassociative_math
-fno-signed-zeros
-freciprocal-math

(2)其他人:

-ffinite-math-only
-fno-errno-math
-fno-signaling-nans
-fno-rounding-math
-fcx-limited-range

第一组缩写为选项

-funsafe-math-optimizations

您应该弄清楚 ICC 中有什么内容,并尝试组合这些标志以达到预期的效果。


0
投票

让我们来看看英特尔怎么说

首先,英特尔默认禁用异常,因此

-fno-trapping-math
。但这甚至适用于“精确”模式,所以这并不是一个答案。

“精确”和“一致”之间有区别,但没有解释。我的猜测是,它与“价值安全”优化有关,例如

-ffp-contract

没有像GCC那样对重新关联和其他假设进行解释。我们在选择使用哪种 libm 实现时确实有这种行为,据我所知,GCC 中没有等效的行为:

如果未指定以下选项,则 -fp-model 和 /fp 选项确定数学库函数结果的最大允许相对误差 (max-error) 的设置(以下选项仅适用于

ifort
):

  • -fimf-accuracy-bits(Linux* 和 macOS)或 /Qimf-accuracy-bits (Windows*)
  • -fimf-max-error(Linux 和 macOS)或 /Qimf-max-error (Windows)
  • -fimf- precision(Linux 和 macOS)或 /Qimf- precision (Windows)
  • [Q]快速超越论

选项 -fp-model=fast (和 /fp:fast)设置选项 -fimf- precision=medium (/Qimf- precision:medium) 和选项 -fp-model=precise (和 /fp:precise)意味着 -fimf-精度=高(和/Qimf-精度:高)。选项 -fp-model=fast=2 (和 /fp:fast2)设置选项 -fimf- precision=medium (和 /Qimf- precision:medium)和选项 -fimf-domain-exclusion=15 (和 /Qimf-domain-排除=15)。

这里

-fimf-precision
被描述为等同于
-fimf-max-error=4
,尽管文档没有告诉我们 1 和 4 意味着什么(什么是相对误差? ULP?)。

-fimf-domain-exclusion=15
更容易破译:它意味着数学函数假设不会传递“极端正常数输入”、nans、无穷大或非正规数。这大致对应于,仅用于 libm 调用
-fcx-limited-range -ffinite-math-only
,加上非规范处理(特定于 x86)
-mdaz-ftz

© www.soinside.com 2019 - 2024. All rights reserved.