Memory RISC-V ISA中的FENCE.TSO是什么意思?

Memory RISC-V ISA中的FENCE.TSO是什么意思?,memory,processor,riscv,Memory,Processor,Riscv,我真的不明白RISC-V中的正常围栏(这里已经回答:)和FENCE.TSO之间的区别。手册上说: 可选的FENCE.TSO指令被编码为FENCE指令,fm=1000,precedure=RW,succession=RW。FENCE.TSO命令其前一个集合中的所有加载操作 其后继集合中的所有内存操作,以及其前一集合中的所有存储操作 将操作存储在其后续集合中。这会将非AMO存储操作保留在FENCE.TSO中 前置集无序,后续集中加载了非AMO Load Operation 1 Load Operat

我真的不明白RISC-V中的正常围栏(这里已经回答:)和FENCE.TSO之间的区别。手册上说:

可选的FENCE.TSO指令被编码为FENCE指令,fm=1000,precedure=RW,succession=RW。FENCE.TSO命令其前一个集合中的所有加载操作 其后继集合中的所有内存操作,以及其前一集合中的所有存储操作 将操作存储在其后续集合中。这会将非AMO存储操作保留在FENCE.TSO中 前置集无序,后续集中加载了非AMO

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
好吧,这是我的猜测。我将根据我的理解展示我的草图

有两个集合(包括指令),它们由围栏指令分隔,即前置集合和后续集合

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
这就是我的理解。但我仍然对这句话感到困惑,因为这句话让非AMO商店的运营处于困境 前置集无序,后续集中加载了非AMO。 什么是非AMO装载和非AMO存储操作

好的,AMO似乎代表“原子内存操作”。我仍然在想,为什么我不能只使用“正常”围栏。

你可以使用“正常”
围栏,因为它比
FENCE.TSO
命令操作更严格。这可以从关于与不支持可选的
.TSO
扩展的实现的向后兼容性的说明中推断出来:

FENCE.TSO编码是作为原始基础围栏的可选扩展添加的 指令编码。基本定义要求实现忽略任何设置位和 将围栏视为全局的,因此这是向后兼容的扩展

那么,
FENCE RW,RW
FENCE.TSO RW,RW
之间有什么区别呢?让我们举一个简单的例子。

load A
store B
<fence>
load C
store D
这将导致四种不同的可能顺序:ABCD、BACD、ABDC和BADC。换句话说,A/B可以被重新排序,C/D可以被重新排序,但A和B必须在C和D之前都是可见的

FENCE.TSO RW,RW
时,以下规则适用:

A < C
A < D
B < C
B < D
A < C
A < D
B < D
A
注意
B
是如何丢失的<代码>围栏。TSO
不会在前置存储和后续加载之间强加任何顺序。据推测,这种较弱的排序使得它比“正常的”
围栏
更便宜


这给了我们五种可能的顺序:ABCD、BACD、ABDC、BADC和ACBD。如果您的程序可以接受,您可以使用
FENCE.TSO

AMO=原子内存操作。不是答案,但前置中的存储只针对后续中的存储排序,因此我假设后续中的加载可能会移动到前置中的存储之前(但在任何加载之后)。AMO有自己的排序约束(acquire/release/seq_cst),这可能意味着针对前一个负载进行排序。