首页 >后端开发 >C++ >x86_64 是否为双精度浮点值和向量提供真正的原子支持?

x86_64 是否为双精度浮点值和向量提供真正的原子支持?

DDD
DDD原创
2024-12-02 02:57:10727浏览

Does x86_64 Offer True Atomic Support for Double-Precision Floating-Point Values and Vectors?

汇编级原子支持是否可用于 x86_64 中的双精度数和向量?

而 C 11 std::atomic在典型实现上通常是无锁的,但由于编译器生成的代码可能效率低下,它面临着效率限制。编译器可能并不总是为涉及浮点值的原子操作生成最佳汇编。

此外,C 11 std::atomic 不为英特尔的整数或浮点事务内存扩展 (TSX) 提供 API点操作。 TSX 可以通过消除与通用寄存器和浮点寄存器之间的数据移动相关的开销来显着提高原子操作的性能。

向量的原子加载和存储

尽管声称 x86_64 缺乏原子操作对向量、自然对齐加载和最多 8 个字节的存储(包括向量)的支持在 x86 处理器上是原子的。这包括使用 x87 或 SSE 指令进行加载和存储。因此,双精度浮点值的对齐加载和存储是原子的。

原子读-修改-写操作

原子读-修改-写操作(例如原子加法)是不直接支持双精度浮点值或向量。 x86_64 上这些操作的唯一选项是使用 cmpxchg 指令或 TSX 重试循环。

原子操作的特殊情况

IEEE 浮点运算的一些特殊情况可以使用整数实现运营。例如,可以通过使用原子操作翻转符号位来实现双精度浮点值的求反。

原子向量加载和存储

虽然原子操作没有硬件保证向量加载和存储,通常可以安全地假设双精度浮点值的对齐向量加载和存储不会导致撕裂。但是,涉及未对齐值的原子向量操作可能不安全。例外情况是 Intel 的 AVX 功能,它保证 SSE/AVX 操作的 128 位原子性。

16B 对象上的原子操作

对 16 字节对象执行原子操作,这大于原生原子操作宽度,必须使用锁cmpxchg16b。与普通原子操作相比,这可能会导致显着的性能开销,使其不适合性能至关重要的场景。

以上是x86_64 是否为双精度浮点值和向量提供真正的原子支持?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn