【发布时间】:2020-11-17 09:49:55
【问题描述】:
我喜欢在启用浮点异常的情况下运行我的代码。 我在 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.
【问题讨论】:
-
clang 是否有 GCC 的
-ftrapping-math等效项以使 FP 异常成为可见的副作用? (请注意,默认情况下,GCC 的该选项版本是打开的,但实际上已损坏:它无法阻止 GCC 进行一些优化,这些优化会更改 FP 异常的数量或类型,可能包括从 0 到非零 IIRC。) -
当我喂它
-ftrapping-math时,clang 没有抱怨,但它没有解决它。要停止 FPE,我必须提供-mno-mmx -mno-sse参数。 -
提交错误报告。
-
您确定它生成的是
divps而不是divss?你能提供一个minimal reproducible example吗? -
@chtz 不是 OP,但很容易复制,请参见:godbolt.org/z/Wd98eG
标签: floating-point clang simd floating-point-exceptions sigfpe