【问题标题】:What is meant by FENCE.TSO in the RISC-V ISA?RISC-V ISA 中的 FENCE.TSO 是什么意思?
【发布时间】:2019-06-22 16:50:55
【问题描述】:

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

可选的 FENCE.TSO 指令被编码为 fm=1000、前驱=RW 和后继=RW 的 FENCE 指令。 FENCE.TSO 对其前身集合中的所有加载操作进行排序 其后继集中的所有内存操作,以及其前集中的所有存储操作 在其后继集中存储操作。这将在 FENCE.TSO 中留下非 AMO 存储操作 在其后继集中具有非 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.TSO 中的非 AMO 存储操作 在其后继集中具有非 AMO 负载的前驱集无序。 什么是非 AMO 加载和非 AMO 存储操作?

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

【问题讨论】:

  • AMO = 原子内存操作。不是答案,但前身中的商店仅针对后继者中的商店排序,因此我假设后继者中的负载可能会移至前身中的商店之前(但在任何负载之后)。 AMO 有自己的排序约束(acquire/release/seq_cst),这可能意味着针对前任的负载进行排序。

标签: memory processor riscv


【解决方案1】:

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

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

那么,FENCE RW,RWFENCE.TSO RW,RW 之间有什么区别?举个简单的例子吧。

load A
store B
<fence>
load C
store D

&lt;fence&gt;FENCE RW,RW 时,适用以下规则:

A < C
A < D
B < C
B < D

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

&lt;fence&gt;FENCE.TSO RW,RW 时,适用以下规则:

A < C
A < D
B < D

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

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

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2013-06-09
    • 1970-01-01
    • 2015-04-30
    • 2015-10-06
    相关资源
    最近更新 更多