相关疑难解决方法(0)

浮点计算如何确定?

浮点计算既不是关联的,也不是处理器上的分配.所以,

(a + b) + c 不等于 a + (b + c)

a * (b + c)不等于a * b + a * c

有没有办法执行不会给出不同结果的确定性浮点计算.它对于单处理器来说是确定性的,但是如果线程增加一个总和,它在多线程程序中就不是确定性的,因为线程可能有不同的交错.

所以我的问题是,如何在多线程程序中实现浮点计算的确定性结果?

c deterministic

13
推荐指数
1
解决办法
4269
查看次数

为什么 MinGW GCC 对 atan2、cos、exp 和 sin 使用 x87 80 位 FP 库代码?

我在从 Intel 2023 和 MSC Visual C++ 2022 移植工作数字代码时遇到一个奇怪的问题。使用 GCC 编译的代码非常准确(太准确),因为某些库调用以完整的 80 位浮点精度工作 - 特别是 sqrt、sin 和 cos。我可以通过使用 TUI 跟踪 gdb 的库调用来反汇编库代码执行来验证这一点。

它也出现在基准计时中,因为 x87 atan2、cos、exp 和 sin 都约为 100 个周期,而 sqrt 约为 80 个周期。SSE/AVX2 代码的相应时序低于 50 个周期,大部分在 20-30 个周期左右。

奇怪的是 tan、atan使用 AVX2 编译的。但 cos、sin、sqrt 和 atan2 在 GCC 系统库中使用旧版 x87 代码。我已经在 32 位端口和 64 位版本上尝试过此操作,并且都遇到了相同的问题。我是海湾合作委员会的新手,所以我可能忽略了一些事情。我在 Windows 上使用默认的 MinGW 端口版本 13.1.0 (MinGW-W64 i686-ucrt-posix-dwarf),它可能有其自身的特点。

顺便说一句,我刚刚注意到 MSC 2022 有时会编码 x87 sqrt,即使启用了所有 gofaster 优化和 AVX2 代码,因为这也是我之前没有注意到的基准计时中的异常值。Intel 将其编译为本机 sqrtsd,因此速度要快得多。我回到 MSC x86 进行内联汇编,以确认 x87 …

floating-point gcc mingw avx x87

5
推荐指数
0
解决办法
80
查看次数

标签 统计

avx ×1

c ×1

deterministic ×1

floating-point ×1

gcc ×1

mingw ×1

x87 ×1