我不太了解RISC-V中的正常FENCE(已在此处回答:What is meant by the FENCE instruction in the RISC-V instruction set?)和FENCE.TSO之间的区别。该手册说:

可选的FENCE.TSO指令被编码为FENCE指令,其中fm = 1000,predecessor = RW,successor = RW。 FENCE.TSO在其之前的集合中命令所有加载操作
继任者集中的所有内存操作,以及所有继任者之前的所有存储操作
商店的后续操作中。这将非AMO商店操作留在FENCE.TSO的
前继集合在其后继集合中与非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

这就是我的理解。但是我仍然对这句话感到困惑。这将非AMO商店运营留在FENCE.TSO的
前继集合在其后继集合中与非AMO负载无序排列。
什么是非AMO负载和非AMO商店操作?

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

最佳答案

您可以使用“正常”的FENCE,因为它比FENCE.TSO更加严格地对操作进行排序。这可以从关于不支持可选.TSO扩展的实现的向后兼容性的注释中推断出:

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

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

load A
store B
<fence>
load C
store D

<fence>FENCE RW,RW时,适用以下规则:
A < C
A < D
B < C
B < D

这导致了四个不同的可能顺序:ABCD,BACD,ABDC和BADC。换句话说,可以对A / B进行重新排序,并且可以对C / D进行重新排序,但是必须不迟于C和D观察A和B。

<fence>FENCE.TSO RW,RW时,适用以下规则:
A < C
A < D
B < D

注意B < C如何丢失; FENCE.TSO在前置存储和后继加载之间不施加任何顺序。据推测,这种较弱的排序使其比“正常”的FENCE便宜。

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

10-08 16:53