虽然 C 11 支持无锁 std::atomic
x86_64 支持以下对双精度的原子操作,使用锁执行 -自由的说明:
不幸的是,无法保证 128b 或 256b 向量在缓存一致性系统中存储或加载的原子性。但是,对于对齐向量,您可以安全地在共享双精度数组上使用向量加载和存储,而无需担心撕裂的风险。
如果需要原子 16B 加载,则唯一的选择是使用带有desired=expected 的锁 cmpxchg16b。如果成功,它将用自身替换现有值。如果失败,您将获得旧内容。请注意,此“加载”会在只读内存上出现错误,因此在将指针传递给执行此操作的函数时要小心。
原子 16B 存储和 RMW 都可以以明显的方式使用锁 cmpxchg16b。这使得纯存储比常规向量存储昂贵得多,尤其是在多次重试 cmpxchg16b 的情况下。然而,原子 RMW 已经很昂贵了。
您可以原子更新 16B 对象,但单独读取 8B 一半。然而,编译器没有提供一种干净的方式来表达这一点,并且由于编译器开发人员不断的考虑,内联 cmpxchg16b 是不可靠的。
以上是x86_64 是否支持双精度和 SSE/AVX 向量上的原子操作?的详细内容。更多信息请关注PHP中文网其他相关文章!