gpt4 book ai didi

floating-point - 如何避免未使用的 SIMD channel 中的浮点异常

转载 作者:行者123 更新时间:2023-12-03 16:33:20 25 4
gpt4 key购买 nike

我喜欢在启用浮点异常的情况下运行我的代码。
我在 Linux 下使用:

feenableexcept( FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW );
到现在为止还挺好。
我遇到的问题是,有时编译器(我使用 clang8)决定使用 SIMD 指令进行标量除法。好吧,如果这更快,即使对于单个标量,为什么不呢。
但结果是 SIMD 寄存器中未使用的 channel 可能包含零。
并且在执行 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 或 llvm 中发现了一个错误。
Here’s how I have reproduced ,clang 10.0 发出相同的代码,即也有那个错误。显然,那个vdivps指令仅在向量的前 2 条 channel 中具有有效数据,而在较高的 2 条 channel 中它将运行 0.0/0.0,因此如果在 mxcsr 中启用这些中断,您将获得运行时异常像您一样注册。
微软、英特尔和 gcc 不发出 divps对于那个代码。如果可以,切换到 gcc 应该不错。
更新: Clang 10+ 有一个控制此类优化的选项,-ffp-exception-behavior=maytrap ,看看:https://godbolt.org/z/WG7bEE

关于floating-point - 如何避免未使用的 SIMD channel 中的浮点异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63125919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com