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

M_e*_*ght 6 memory processor riscv

我不太明白RISC-V中普通FENCE之间的区别(已在这里回答:RISC-V指令集中的FENCE指令是什么意思?)和FENCE.TSO之间的区别。手册说:

\n\n

可选的 FENCE.TSO 指令被编码为 FENCE 指令,其中 fm=1000、前驱=RW、后继=RW。FENCE.TSO 将其前驱集中的所有加载操作排序在其后继集中的所有内存操作之前,并将其前驱集中的所有存储操作排序在其后继集中的所有存储操作之前。这会在 FENCE 中留下非 AMO 存储操作。 TSO\xe2\x80\x99s\n前驱集无序,其后继集中包含非 AMO 负载。

\n\n

好吧,这是我的猜测。我将仅根据我的理解展示我的草图。

\n\n

有两个集合(包括指令),被FENCE指令分隔开,即前驱集和后继集。

\n\n
Load Operation 1\nLoad Operation 2\nLoad Operation 3\nStore Operation 1\nStore Operation 2\nStore Operation 3\n**FENCE.TSO**\nMemory Operation 1\nMemory Operation 2\nMemory Operation 3\nStore Operation 4\nStore Operation 5\nStore Operation 6\n
Run Code Online (Sandbox Code Playgroud)\n\n

我是这样理解的。但我仍然对这句话感到困惑这使得 FENCE.TSO\xe2\x80\x99s\n前驱集中的非 AMO 存储操作无序,其后继集中的非 AMO 加载。\n什么是非 AMO 加载和非 AMO 存储操作?

\n\n

好吧,AMO 似乎代表“原子内存操作”。我仍然想知道为什么我不能只使用“普通”围栏。

\n

Sni*_*kow 6

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

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

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

load A
store B
<fence>
load C
store D
Run Code Online (Sandbox Code Playgroud)

<fence>是 时FENCE RW,RW,适用以下规则:

A < C
A < D
B < C
B < D
Run Code Online (Sandbox Code Playgroud)

这会产生四种不同的可能顺序:ABCD、BACD、ABDC 和 BADC。换句话说,A/B 可以重新排序,C/D 可以重新排序,但 A 和 B 必须不迟于 C 和 D 都是可观察的。

<fence>是 时FENCE.TSO RW,RW,适用以下规则:

A < C
A < D
B < D
Run Code Online (Sandbox Code Playgroud)

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

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