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

Ane*_*ran 9 compiler-construction processor microprocessors riscv

在浏览RISC-V ISA时,我在内存模型部分(FENCE指令)中看到了一条指令.这究竟是什么意思?

Cra*_*son 11

RISC-V ISA使用宽松的内存模型,其中一个线程执行的加载和存储的顺序在被另一个线程看到时可能不同.这样做是为了使技术能够提高内存系统性能.

例如,线程1可以执行:

  • 加载A.
  • 商店B
  • 存储C

但是线程2可以看到与第一个线程无关的负载和存储:

  • 存储C
  • 加载A.
  • 商店B

FENCE确保在围栅之后的任何操作之前观察围栏之前的所有操作.所以,如果上述内容改为:

线程1:

  • 加载A.
  • 商店B
  • 围栏
  • 存储C

然后线程2将保证在存储到C之前看到A和存储到B的加载,但仍然可以在加载A之前看到存储到B.

线程2:

  • 商店B
  • 加载A.
  • 存储C

来源:http://riscv.org/download.html(用户级ISA Spec v2.0第19页)

  • @SamuelA.FalvoII I/O(I 和 O 标志)和内存访问(R 和 W)可以使​​用 FENCE 指令单独控制,例如:您可以控制仅内存写入应按 FENCE 排序,但内存读取和 I/ O操作不受FENCE影响。为此,应设置 PW 和 SW 位。如果只设置了PW(predecessor write),那么FENCE将确保,FENCE之前的所有内存写入也可以被FENCE之前的其他hart(线程)观察到,但FENCE之后的内存写入也可以之前观察到。 (4认同)
  • 您能否详细说明该指令作为输入使用的标志的含义?特别是I,O,R和W标志的前一组和后一组,以及它们的各种设置如何影响FENCE的行为? (2认同)

小智 -1

我发现一种情况,使用 FENCE 指令是必要的。例子:

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