而 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 位原子性。
对 16 字节对象执行原子操作,这大于原生原子操作宽度,必须使用锁cmpxchg16b。与普通原子操作相比,这可能会导致显着的性能开销,使其不适合性能至关重要的场景。
以上是x86_64 是否为双精度浮点值和向量提供真正的原子支持?的详细内容。更多信息请关注PHP中文网其他相关文章!