我喜欢在启用浮点异常的情况下运行我的代码。我在 Linux 下使用:
feenableexcept( FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW );
到目前为止,一切都很好。
我遇到的问题是,有时编译器(我使用 clang8)决定使用 SIMD 指令进行标量除法。好吧,如果这样更快,即使是单个标量,为什么不呢。
但结果是 SIMD 寄存器中未使用的通道可能包含零。
并且在执行 SIMD 除法时,会抛出一个浮点异常。
这是否意味着如果您允许编译器使用 sse/avx 扩展,则根本不能使用浮点异常?
就我而言,这行 C 代码:
float a0, min, a, d;
...
a0 = (min - a) / (d);
...执行为:
divps %xmm2,%xmm3
然后抛出一个:
Thread 1 "noisetuner" received signal SIGFPE, Arithmetic exception.