我真的不明白RISC-V (这里回答:What is meant by the FENCE instruction in the RISC-V instruction set?)和FENCE.TSO的普通栅栏之间的区别。手册上说:
可选的FENCE.TSO指令被编码为带有fm=1000、predecessor=RW和successor=RW的栅栏指令。FENCE.TSO在其后继集中的所有内存操作之前对其前任集中的所有加载操作进行排序,而在其后继set.This中的所有存储操作之前,它的所有存储操作都在FENCE.SO的前一集中对非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我就是这么理解的。但我仍然对这句话感到困惑,这句话在leaves中留下了非AMO存储操作,set的前任集无序,其后续集中有非AMO负载。什么是非AMO负载和非AMO存储操作?
好吧,AMO似乎是“原子记忆操作”的意思。我还是在想,为什么我不能用“正常”的栅栏。
发布于 2020-01-14 20:53:00
您可以使用“正常”FENCE,因为它比FENCE.TSO更严格地命令操作。这可以从关于与不支持可选.TSO扩展的实现的向后兼容性的说明中推断出来:
FENCE.TSO编码是作为对原始基本栅栏指令编码的可选扩展添加的。基本定义要求实现忽略任何设置位,并将栅栏视为全局的,因此这是一个向后兼容的扩展。
那么,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可以被重新排序,但是A和B必须在不迟于C和D的时间内被观察到。
当<fence>是FENCE.TSO RW,RW时,适用以下规则:
A < C
A < D
B < D请注意B < C是如何丢失的;FENCE.TSO不会在前一个存储和成功加载之间强制执行任何命令。据推测,这种较弱的订购使得它比“正常”的FENCE便宜。
这给了我们五个可能的订单: ABCD,BACD,ABDC,BADC和ACBD。如果您的程序可以接受这一点,则可以使用FENCE.TSO。
https://stackoverflow.com/questions/56717361
复制相似问题