【发布时间】:2020-06-04 10:32:01
【问题描述】:
这个问题是对此的后续/澄清:
Does the MOV x86 instruction implement a C++11 memory_order_release atomic store?
这表明MOV 汇编指令足以在 x86 上执行获取-释放语义。我们不需要LOCK、栅栏或xchg 等。但是,我很难理解它是如何工作的。
英特尔文档第 3A 卷第 8 章指出:
https://software.intel.com/sites/default/files/managed/7c/f1/253668-sdm-vol-3a.pdf
在单处理器(核心)系统中......
- 读取不会与其他读取重新排序。
- 写入不会与较旧的读取一起重新排序。
- 对内存的写入不会与其他写入一起重新排序,但以下情况除外:
但这是针对单核的。多核部分似乎没有提到负载是如何执行的:
在多处理器系统中,以下排序原则适用:
- 单个处理器使用与单处理器系统相同的排序原则。
- 所有处理器以相同的顺序观察单个处理器的写入。
- 来自单个处理器的写入不会相对于来自其他处理器的写入进行排序。
- 内存排序遵循因果关系(内存排序尊重传递可见性)。
- 除了执行存储的处理者之外,任何两个存储都以一致的顺序被处理器看到
- 锁定指令有一个总顺序。
那么 MOV 一个人怎么能促进获取-释放呢?
【问题讨论】:
-
MOV本身不是顺序一致而不是设置rel-acq栅栏吗?因为它只会在非常有限的条件下重新排序。这让我想起了很久以前 Herb Sutter 对 SC-DRF 记忆模型的非常有见地的介绍。 -
@DeanSeo:不,x86 的硬件内存模型是 SC + 带有存储转发的存储缓冲区。这就像 acq_rel,而不是 SC。
-
@PeterCordes 有趣!谢谢指正!
标签: c++ x86 memory-barriers memory-model stdatomic