描述
我正试图从使用英特尔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(,也存在差异:要么文档过时(更有可能(,要么此功能意外工作(可能性较小(。