x86_64 中双精度数和向量的原子操作
而 C 11 std::atomic在大多数实现上提供无锁操作,原子 AVX 或 SSE 向量操作仍然依赖于 CPU,并且缺乏汇编级支持。
双精度上的原子操作
- 对于 8 个字节,包括双精度数,加载和存储操作自然是原子的。
- 读取-修改-写入操作需要一个使用 cmpxchg(或 TSX)重试循环,因为没有直接内存目标指令。
- Cmpxchg16b 可用于 16 字节原子 RMW 操作。
- IEEE 浮点操作的一些特殊情况可以是使用整数运算实现(例如绝对值,
向量上的原子操作
- 跨缓存一致性系统的原子向量加载/存储操作没有硬件支持。
- 双精度对齐数组上的向量加载/存储可能可以安全使用,而不会带来缓存行的风险
- 对于 16 字节原子加载/存储/RMW,可以使用 cmpxchg16b。
- 原子更新 16 字节对象是可能的,但不能保证单独读取 8 字节一半是原子的。
编译器支持
- 编译器并不总是为atomic生成有效的汇编。加载/存储(例如,直接使用 mov 指令传入/传出 xmm 寄存器)。
- 原子向量(原子<__m128d> 或原子<__m256d>)未有效实现,因为即使是只读,它们也需要 cmpxchg16b或只写操作。
以上是x86_64 上的双精度运算和向量运算的原子性如何?的详细内容。更多信息请关注PHP中文网其他相关文章!