正如我在英特尔网站上读到的:
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 的 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 中有什么内容,并尝试组合这些标志以达到预期的效果。
让我们来看看英特尔怎么说:
首先,英特尔默认禁用异常,因此
-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
。