3

尽管我不阅读 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 的保证吗?如果是这样,那不是表明提案有缺陷吗?

4

0 回答 0