首页 > 后端开发 > C++ > x86_64 是否支持双精度和 SSE/AVX 向量上的原子操作?

x86_64 是否支持双精度和 SSE/AVX 向量上的原子操作?

Mary-Kate Olsen
发布: 2024-11-27 06:58:10
原创
1003 人浏览过

Does x86_64 Support Atomic Operations on Doubles and SSE/AVX Vectors?

x86_64 上的原子浮点运算和 SSE/AVX 矢量加载/存储

虽然 C 11 支持无锁 std::atomic,但它确实支持由于 CPU 依赖性,当前不支持原子 AVX/SSE 向量。然而,问题出现了:x86_64 是否为双精度或向量上的原子操作提供汇编级支持?

x86_64 上的原子操作

x86_64 支持以下对双精度的原子操作,使用锁执行 -自由的说明:

  • 加载
  • 存储

原子向量运算x86_64

不幸的是,无法保证 128b 或 256b 向量在缓存一致性系统中存储或加载的原子性。但是,对于对齐向量,您可以安全地在共享双精度数组上使用向量加载和存储,而无需担心撕裂的风险。

如果需要原子 16B 加载,则唯一的选择是使用带有desired=expected 的锁 cmpxchg16b。如果成功,它将用自身替换现有值。如果失败,您将获得旧内容。请注意,此“加载”会在只读内存上出现错误,因此在将指针传递给执行此操作的函数时要小心。

原子 16B 存储和 RMW 都可以以明显的方式使用锁 cmpxchg16b。这使得纯存储比常规向量存储昂贵得多,尤其是在多次重试 cmpxchg16b 的情况下。然而,原子 RMW 已经很昂贵了。

原子向量运算的局限性

  • 原子<__m128d>由于使用 cmpxchg16b,即使对于只读或只写操作也会很慢。
  • atomic<__m256d>不能是无锁的。
  • alignas(64)atomic共享缓冲区[1024];将允许自动矢量化,但编译器不会为此生成有效的 asm。

原子读取和更新 16B 对象

您可以原子更新 16B 对象,但单独读取 8B 一半。然而,编译器没有提供一种干净的方式来表达这一点,并且由于编译器开发人员不断的考虑,内联 cmpxchg16b 是不可靠的。

以上是x86_64 是否支持双精度和 SSE/AVX 向量上的原子操作?的详细内容。更多信息请关注PHP中文网其他相关文章!

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