我不太了解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,RW
和FENCE.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
。