【问题标题】:aarch64; Load-Acquire Exclusive vs Load Exclusiveaarch64; Load-Acquire Exclusive vs Load Exclusive
【发布时间】:2019-05-29 15:15:38
【问题描述】:

AArch64 指令集中的LDAXR 和LDXR 指令有什么区别?

从参考手册来看,它们看起来完全一样(“获取”字样除外):

LDAXR - 加载-获取独占寄存器:将字从由基址寻址的内存加载到 Wt。将物理地址记录为独占访问。

LDXR - 加载独占寄存器:从基址寻址的内存中加载一个字到 Wt。将物理地址记录为独占访问。

谢谢

【问题讨论】:

  • 请提供对您的“参考手册”的参考,因为我在 ARMv8 ARM 的 D 版中看到了一些不同的东西。
  • “ARMv8 指令集概述”中的内容

标签: arm locking arm64


【解决方案1】:

最简单的形式是LDAEX == LDXR +DMB_SY。

这是我为 LDAXR 找到的描述:

C6.2.104 LDAXR

Load-Acquire Exclusive Register 从基址派生地址 寄存器值,从内存中加载一个 32 位字或 64 位双字, 并将其写入寄存器。内存访问是原子的。 PE标记 作为独占访问被访问的物理地址。这 独占访问标记由存储独占指令检查。看 第 B2-135 页的同步和信号量。该指令还 具有 Load-Acquire 中描述的内存排序语义, Load-AcquirePC 和 Store-Release(第 B2-108 页)。有关信息 关于内存访问,请参阅第 C1-157 页的加载/存储寻址模式。

来自DDI0487 Da的第 K11.3 节

ARMv8 架构将获取和释放语义添加到 Load-Exclusive 和 Store-Exclusive 指令,允许它们 获得排序获取和/或释放语义。负载专用 指令可以被指定为具有获取语义,并且 可以指定 Store-Exclusive 指令有释放 语义。这些可以任意组合以允许原子 由成功的 Load-Exclusive 和 Store-Exclusive 对创建的更新 有任何一个:

  • 无排序语义(使用 LDREX 和 STREX)。

  • 仅获取语义(使用 LDAEX 和 STREX)。

  • 仅发布语义(使用 LDREX 和 STLEX)。

  • 顺序一致的语义(使用 LDAEX 和 STLEX)。

还有(B2.3.5),

Load-Acquire 指令的基本原理是引入 Load-Acquire 生成的内存访问之间的顺序 指令和内存访问后按程序顺序出现 Load-Acquire 指令,这样生成的内存访问 Load-Acquire 指令在某种程度上被每个 PE 观察到 要求该 PE 连贯地观察访问,在任何 出现在程序顺序之后的内存访问 Load-Acquire 指令被那个 PE 观察到,在某种程度上 要求 PE 连贯地观察访问。

【讨论】:

  • 谢谢,我用指令助记词搜索,错过了那部分。
  • 所以总结一下,这只是关于内存排序和简单地说LDAEX == LDXR + DMB_SY
  • 请注意,内部实现不一定必须为所有内容添加屏障,例如DMB_SY。高性能实现可能只确保它发生在任何先前的发布存储之后,但允许使用先前的普通存储重新排序。这就是使操作本身seq_cst 所需的全部内容。 (如果您避免在 seq_cst 存储或 RMW 之后立即执行 seq_cst 加载,那么 AArch64 上的 seq_cst 可能比其他机器上的成本要低得多。)
猜你喜欢
  • 2013-12-17
  • 2022-12-02
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2023-03-16
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多