下一代英特尔编译器破坏了快速浮点模型

Yat*_*yte 8 c++ floating-point compiler-flags icc icx

描述

我正在尝试从使用英特尔 OneAPI 工具包中的经典英特尔编译器切换到下一代 DPC/C++ 编译器,但处理浮点运算的默认行为似乎已损坏或不同,因为comparison with infinity always evaluates to false in fast floating point modes. 以上既是编译器警告,也是我现在在 ICX 中遇到的行为,但不是经典编译器中遇到的行为(对于使用相同的最小编译器标志集)。

最小可重复示例

#include <iostream>
#include <cmath>

int main()
{
    double a = 1.0/0.0;
    if (std::isinf(a))
        std::cout << "is infinite";
    else
        std::cout << "is not infinite;";
}
Run Code Online (Sandbox Code Playgroud)

编译器标志: -O3 -Wall -fp-model=fast

ICC 2021.5.0 输出:( is infinite 也在几个旧版本上进行了测试)

ICX 2022.0.0 输出:( is not infinite 也在 2022.0.1 上测试)

编译器浏览器上的现场演示: https: //godbolt.org/z/vzeYj1Wa3

默认情况下-fp-model=fast在两个编译器上都启用。如果我手动指定,-fp-model=precise我可以恢复行为,但不能恢复性能。

有谁知道使用下一代编译器保持快速浮点模型之前的行为和性能的潜在解决方案?

Ave*_*lia 7

如果添加-fp-speculation=safe-fp-model=fast,您仍然会收到警告,-fp-model=fast如果您想检查无穷大,则不应使用,但条件将正确评估:godbolt

英特尔 ICC 用户向 DPCPP 或 ICX 移植指南中指出:

FP 严格性:不支持比默认值更严格的内容。不支持 -fp-model strict、-fp-speculation=safe、#pragma fenv_access 等。开源社区正在努力实现对这些的支持。

尽管它适用于测试编译器的当前版本(icx 2022.0.0),但存在差异:文档已过时(更有可能),或者此功能是偶然工作的(可能性较小)。