下一代英特尔编译器上的快速浮点模型被打破



描述

我正试图从使用英特尔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;";
}

编译器标志:-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,我可以恢复行为,但不能恢复性能。

有人知道一个潜在的解决方案,既可以保持以前的行为&使用下一代编译器的快速浮点模型的性能?

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

在针对ICC用户到DPCPP或ICX的"英特尔移植指南"中指出:

FP严格性:不支持比默认值更严格的内容。不支持-fp-model strict、-fp-investigation=safe、#pragma fenv_access等。在开源社区中,实现对这些功能的支持是一项正在进行的工作。

即使它适用于当前版本的测试编译器(icx 2022.0.0(,也存在差异:要么文档过时(更有可能(,要么此功能意外工作(可能性较小(。

最新更新