首页 >后端开发 >C++ >x86_64 架构上如何处理原子浮点和向量运算?

x86_64 架构上如何处理原子浮点和向量运算?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-07 06:08:15485浏览

How are Atomic Floating-Point and Vector Operations Handled on x86_64 Architectures?

x86_64 上的原子浮点运算

虽然 C 本身不支持原子双精度运算,但它确实提供无锁原子 操作。大多数平台上的实现。这些实现通常使用带有锁定 cmpxchg 指令的比较和交换 (CAS) 操作。

对于 x86_64 上的原子向量操作,没有直接的硬件支持。然而,对齐的 128 位和 256 位加载和存储通常保证是原子的。对于非对齐向量操作,原子性保证不太明确。

对双精度和向量操作的汇编级支持

x86_64 为原子操作提供汇编级支持双打和向量:

  • 双精度: 通过内存目标指令 movsd、movq、addsd、subsd 和 mulsd 支持原子加载、存储和加/减/乘操作。
  • 向量:对齐128 位和 256 位加载和存储在具有 AVX 支持的 x86_64 上是原子的。对于非对齐向量操作,没有直接的原子性硬件保证。

MSVC 2017 实现无锁原子

MSVC 2017实现无锁原子使用双宽度整数寄存器进行操作。例如,加载操作涉及:

CAS: movq QWORD PTR [dst_addr], rax  // 64-bit CAS

添加操作使用:

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax  // 128-bit CAS

原子RMW(读-修改-写)操作

原子读-修改-写 (RMW) 操作,例如 fetch_add,需要 CAS 循环实现。在 x86_64 上,CAS 指令支持 16 字节操作 (cmpxchg16b)。

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax

虽然 CAS 循环提供原子 RMW 功能,但它们比原子加载和存储更昂贵。

附加说明

  • 一些非 x86 硬件支持 float/double 类型的原子加法操作。
  • Intel 的事务内存扩展 (TSX) 改进了对原子 FP 和 SIMD 操作的支持。
  • 编译器通常会生成低效的原子代码< ;双>操作,但正在改进。
  • 对对齐双精度数共享数组的原子操作应该是安全的,而对未对齐向量的操作可能涉及撕裂。
  • 可以在 16 上实现原子操作-byte 对象使用 cmpxchg16b,但性能会很差。

以上是x86_64 架构上如何处理原子浮点和向量运算?的详细内容。更多信息请关注PHP中文网其他相关文章!

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