【发布时间】:2020-06-05 12:37:02
【问题描述】:
为什么LOCK 前缀会在 x86 上造成完全障碍? (因此它会耗尽存储缓冲区并具有顺序一致性)
对于LOCK/read-modify-write 操作,不需要完整的屏障,对缓存行的独占访问似乎就足够了。是设计选择还是有其他限制?
【问题讨论】:
-
简短回答:它既是加载又是存储(它们必须在全局操作顺序中原子地保持在一起),因此它不能在任一方向上重新排序。所以它最终拥有成为一个完整的障碍。
-
@PeterCordes 我虽然谈到了这一点,但它是一种先加载后存储,而且 x86 内存模型已经禁止 LoadStore 重新排序。还不够吗?
-
是的,但请考虑一些示例,例如RMW 然后一个负载。 RMW 是否可以像普通商店一样延迟并在加载后出现?不,因为它会带来负载,那就是 LoadLoad 重新排序。
-
@PeterCordes 嗯,我明白了,所以在这种情况下,是为了防止其他负载在 RMW 负载和存储之间“潜行”吗? (会失去原子性)
-
差不多。 AFAICT,acq_rel RMW 和 seq_cst RMW ISO C++ 之间的唯一区别是 acq_rel 不禁止 IRIW 重新排序(当加载部分观察到来自另一个核心的纯存储时),但 x86 的总存储顺序不允许这样做。虽然见 cmets:How do memory_order_seq_cst and memory_order_acq_rel differ?
标签: x86 cpu-architecture memory-barriers