【发布时间】:2019-06-22 16:50:55
【问题描述】:
我不太明白 RISC-V 中的普通 FENCE(已在此处回答:What is meant by the FENCE instruction in the RISC-V instruction set?)和 FENCE.TSO 之间的区别。手册说:
可选的 FENCE.TSO 指令被编码为 fm=1000、前驱=RW 和后继=RW 的 FENCE 指令。 FENCE.TSO 对其前身集合中的所有加载操作进行排序 其后继集中的所有内存操作,以及其前集中的所有存储操作 在其后继集中存储操作。这将在 FENCE.TSO 中留下非 AMO 存储操作 在其后继集中具有非 AMO 负载的前驱集无序。
好的,这是我的猜测。我将根据我的理解展示我的草图。
有两个集合(包括指令),被FENCE指令分隔,即前驱集和后继集。
Load Operation 1
Load Operation 2
Load Operation 3
Store Operation 1
Store Operation 2
Store Operation 3
**FENCE.TSO**
Memory Operation 1
Memory Operation 2
Memory Operation 3
Store Operation 4
Store Operation 5
Store Operation 6
我是这样理解的。但是我仍然对 这句话感到困惑,这使得 FENCE.TSO 中的非 AMO 存储操作 在其后继集中具有非 AMO 负载的前驱集无序。 什么是非 AMO 加载和非 AMO 存储操作?
好吧,AMO 似乎代表“原子内存操作”。我仍然想知道,为什么我不能只使用“正常”的 FENCE。
【问题讨论】:
-
AMO = 原子内存操作。不是答案,但前身中的商店仅针对后继者中的商店排序,因此我假设后继者中的负载可能会移至前身中的商店之前(但在任何负载之后)。 AMO 有自己的排序约束(acquire/release/seq_cst),这可能意味着针对前任的负载进行排序。