我正在努力了解 ARM STLR 的确切语义。
根据文档,它具有发布语义。所以如果你有 STLR 商店,你会得到:
[StoreStore][LoadStore]
X=r1
Run Code Online (Sandbox Code Playgroud)
其中X
是内存和r1
一些寄存器。
问题是释放存储和获取加载无法提供顺序一致性:
[StoreStore][LoadStore]
X=r1
r2=Y
[LoadLoad][LoadStore]
Run Code Online (Sandbox Code Playgroud)
在上述情况下,允许重新排序 X=r1 和 r2=Y。为了使这个顺序一致,需要添加一个[StoreLoad]:
[StoreStore][LoadStore]
X=r1
[StoreLoad]
r2=Y
[LoadLoad][LoadStore]
Run Code Online (Sandbox Code Playgroud)
你通常在商店里这样做,因为装载更频繁。
在 X86 上,普通存储是发布存储,普通加载是获取加载。[StoreLoad] 可以通过 MFENCE 来实现,或者使用LOCK ADDL %(RSP),0
Hotspot JVM 中的方式来实现。
当查看ARM文档时,LDAR似乎具有获取语义;所以这将是[LoadLoad][LoadStore]。
但 STLR 的语义很模糊。当我使用 memory_order_seq_cst 编译 C++ 原子时,只有一个 STLR;没有DMB。所以看来STLR比release store有更强的内存排序保证。对我来说,在栅栏层面上,STLR 相当于:
[StoreStore][LoadStore]
X=r1
[StoreLoad]
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
ARMv8.3 引入了新指令:LDAPR。
当 STLR 后跟 LDAR 到不同的地址时,这两个不能重新排序,因此称为 RCsc(释放一致顺序一致)。
当 STLR 后跟 LDAPR 到不同的地址时,这 2 个地址可以重新排序。这称为RCpc(发布一致处理器一致)。
我的问题是PC部分。
PC 是 TSO 的松弛,其中 TSO 是多副本原子,而 PC 是非多副本原子。
ARMv8的内存模型已改进为多副本原子,因为没有供应商创建过非多副本原子微体系结构,这使得内存模型更加复杂。
所以我遇到了矛盾。
关键问题是:每个存储(包括宽松的存储)都是多副本原子的吗?
如果是这样,那么 rcpc 的 PC 部分对我来说没有意义,因为 PC 是非多副本原子的。由于 ARM 过去是非多副本原子的,它是否可能是一个遗留名称?
PC有多种定义;所以也许这就是原因。
由于其 TSO 内存模型,X86 保证所有商店的总顺序。我的问题是是否有人知道这是如何实际实施的。
我对所有 4 个围栏是如何实现的印象很好,所以我可以解释如何保留本地秩序。但是 4 个栅栏只会给 PO;它不会给您 TSO(我知道 TSO 允许旧商店跳到新负载前面,因此只需要 4 个围栏中的 3 个)。
单个地址上所有内存操作的总顺序是一致性的责任。但我想知道英特尔(特别是 Skylake)如何在多个地址的商店上实现总订单。
x86 intel cpu-architecture memory-barriers micro-architecture