我真的不了解RISC-V中的正常FENCE(已在此处回答:What is meant by the FENCE instruction in the RISC-V instruction set?)与FENCE.TSO之间的区别。手册说:
可选的FENCE.TSO指令被编码为FENCE指令,其中fm = 1000,前任= RW,后继= 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
这就是我的理解方式。但是我仍然对这句话感到困惑,因为这会在FENCE中留下非AMO商店的操作。 前继集合在其后继集合中无序排列且非AMO负载。 什么是非AMO负载和非AMO商店操作?
好的,AMO似乎代表“原子内存操作”。我仍然想知道,为什么我不能只使用“正常”的FENCE。
答案 0 :(得分:1)
您可以使用“普通” 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
。