首页 > 后端开发 > C++ > 正文

尽管存在 C 限制,如何在 x86_64 上实现双精度和向量的原子操作?

Patricia Arquette
发布: 2024-11-28 06:06:19
原创
358 人浏览过

How Can Atomic Operations on Doubles and Vectors Be Achieved on x86_64 Despite C   Limitations?

尽管 C 的 std::atomic 存在限制,缺乏无锁支持,但 x86_64 为双精度和向量上的某些原子操作提供了汇编级支持。

原子双操作x86_64

  • 自然对齐的加载和存储(最多 8 个字节)是原子的。
  • 原子读取-修改-写入操作 (RMW) 需要使用 cmpxchg 进行重试循环.
  • cmpxchg16b 可用于 16 字节原子加载,

x86_64 上的 SSE/AVX 向量操作

虽然 C 目前缺乏对原子 AVX/SSE 向量操作的支持,但没有办法保证 128b 或 256b 缓存行在整个缓存中的原子传输系统。

但是,在对齐双精度的共享数组上使用矢量加载/存储时,可以采取某些预防措施来最大程度地降低撕裂风险。

原子 16B 加载

  • 使用lock cmpxchg16b 和desired=expected 可以提供原子16B 加载。

原子 16B 存储和 RMW

  • 锁 cmpxchg16b 可用于原子 16B 存储和 RMW 操作。

原子操作具有 8B 半部的 16B 对象

  • 可以在独立读取 8B 半部的同时原子地更新 16B 对象。

编译器和原子操作

编译器可能并不总是生成最优的原子操作的汇编代码。例如,他们可能会避免在 XMM 和双寄存器之间直接进行 movsd 加载/存储,而是选择迂回方法。

以上是尽管存在 C 限制,如何在 x86_64 上实现双精度和向量的原子操作?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板