RISC-V指令集中的FENCE指令是什么意思?

20

在研究RISC-V ISA时,我在内存模型部分看到了一个指令(FENCE指令)。它的确切含义是什么?

2个回答

36
RISC-V ISA采用宽松的内存模型,其中一个线程执行的加载和存储顺序可能会因另一个线程而异。这样做是为了实现提高内存系统性能的技术。
例如,线程1可能执行:
- 加载A - 存储B - 存储C
但线程2在与第一个线程相关的情况下可能会看到加载和存储的顺序不同:
- 存储C - 加载A - 存储B
FENCE确保在栅栏之前观察到所有操作,在栅栏之后观察到任何操作。所以如果上面的内容改为:
线程1:
- 加载A - 存储B - FENCE - 存储C
那么线程2将保证在存储C之前看到对A的加载和对B的存储,但仍然可以在加载A之前看到对B的存储。
线程2:
- 存储B - 加载A - 存储C

来源:RISC-V ISA(第2.7节第20页)

根据Chris P的评论:

通过FENCE指令,可以单独控制I/O(I和O标志)和内存访问(R和W)。例如:您可以控制只有内存写入应由FENCE排序,但内存读取和I/O操作不受FENCE的影响。为此,应设置PW和SW位。如果仅设置了PW(前任写入),则FENCE将确保在FENCE之前所有内存写入也被其他harts(线程)观察到,但是FENCE之后的内存写入也可以在FENCE之前被观察到。


6
请问是否需要将输入的指令中各个标志位的含义进行详细解释?包括 I、O、R 和 W 标志位的前驱和后继集合,以及它们在 FENCE 指令中设置的不同选项对行为的影响。 - Samuel A. Falvo II
4
使用 FENCE 指令可以分别控制 I/O(I 和 O 标志)和内存访问(R 和 W)。例如:您可以控制只有内存写入应该由 FENCE 排序,但内存读取和 I/O 操作不受 FENCE 影响。为此,应设置 PW 和 SW 位。如果仅设置了 PW(前继写入),则 FENCE 将确保在 FENCE 之前所有内存写入都被其他 harts(线程)观察,但在 FENCE 之后的内存写入也可以在 FENCE 之前被观察到。 - ChrisP
如果我要为 RISC-V 编译软件,应该选择带有或不带有围栏的架构?我正在针对通用 RISC-V 处理器进行定位,因此“G”扩展似乎是一个方便的选择,但是在互联网上,我到处都可以看到 IMAFD(这是不带围栏的 G),所以我想知道它是否更好。 - Aaron Franke
1
@AaronFranke FENCE 包含在基本的 RISC-V ISA 中(根据 risc-v-spec-v2.2,第20页)。 - Mark Watson
1
@ChrisP,你能把这个加到原来的答案里吗?这是必要的信息。 - Mah35h
@Mah35h - 添加了评论。 - Craig S. Anderson

-1

在使用FENCE指令时,我发现有一种情况是必要的。

  1. SoC中的某个模块通过HostIO总线将值写入CSR 0x783(MIPI)来生成中断。
  2. 固件跳转到中断处理程序。
  3. 处理程序尝试通过向寄存器写入1来重置用户实现设备中的'pending'位。
  4. 这样的操作被编译为带有立即值=1的'store'指令。
  5. 因此,如果我不在处理程序开头实现FENCE,则会得到垃圾值而不是指令的正确立即参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接