小编pve*_*jer的帖子

ARM STLR 内存排序语义

我正在努力了解 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),0Hotspot 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)

有人可以解释一下吗?

concurrency multithreading arm atomic arm64

7
推荐指数
1
解决办法
1927
查看次数

ARMv8.3 rcpc的含义

ARMv8.3 引入了新指令:LDAPR。

当 STLR 后跟 LDAR 到不同的地址时,这两个不能重新排序,因此称为 RCsc(释放一致顺序一致)。

当 STLR 后跟 LDAPR 到不同的地址时,这 2 个地址可以重新排序。这称为RCpc(发布一致处理器一致)。

我的问题是PC部分。

PC 是 TSO 的松弛,其中 TSO 是多副本原子,而 PC 是非多副本原子。

ARMv8的内存模型已改进为多副本原子,因为没有供应商创建过非多副本原子微体系结构,这使得内存模型更加复杂。

所以我遇到了矛盾。

关键问题是:每个存储(包括宽松的存储)都是多副本原子的吗?

如果是这样,那么 rcpc 的 PC 部分对我来说没有意义,因为 PC 是非多副本原子的。由于 ARM 过去是非多副本原子的,它是否可能是一个遗留名称?

PC有多种定义;所以也许这就是原因。

arm cpu-architecture memory-model memory-barriers armv8

7
推荐指数
1
解决办法
1192
查看次数

Intel X86如何实现全店排序

由于其 TSO 内存模型,X86 保证所有商店的总顺序。我的问题是是否有人知道这是如何实际实施的。

我对所有 4 个围栏是如何实现的印象很好,所以我可以解释如何保留本地秩序。但是 4 个栅栏只会给 PO;它不会给您 TSO(我知道 TSO 允许旧商店跳到新负载前面,因此只需要 4 个围栏中的 3 个)。

单个地址上所有内存操作的总顺序是一致性的责任。但我想知道英特尔(特别是 Skylake)如何在多个地址的商店上实现总订单。

x86 intel cpu-architecture memory-barriers micro-architecture

1
推荐指数
1
解决办法
511
查看次数