尽管我不阅读 Itanium 程序集,也没有声称了解它的内存模型,但我注意到在一个将 C/C++ 原子映射到 Itanium 的提议中存在一些非常奇怪且明显矛盾的地方。
在C/C++11 到处理器的映射中,在 Itanium 上建议的原子实现建议没有获取或释放栅栏:
Consume Fence: <ignore>
Acquire Fence: <ignore>
Release Fence: <ignore>
Acq_Rel Fence: <ignore>
(到底什么是消费围栏?)
事实上,在该提案中,放松的原子加载和存储从未放松:
Load Relaxed: ld.acq
Load Consume: ld.acq
Load Acquire: ld.acq
...
我们看到,在这些映射中,所有轻松的简单(不是 RMW)操作都已经是 Acq_Rel。但是查看 RMW 操作会发现松弛和非松弛操作是不同的:
Cmpxchg Release: cmpxchg.rel
Cmpxchg AcqRel: cmpxchg.rel; mf
除非 Cmpxchg AcqRel 实现无偿mf
(不太可能),否则这意味着获取行为在cmpxchg.rel
.
一个宽松的、仅发布的 RMW 操作后跟一个获取栅栏不应该至少提供 acq_rel RMW 的保证吗?如果是这样,那不是表明提案有缺陷吗?