/ architecture / 2浏览

RISC-V RVWMO Memory Consistency Model

memory consistency model(内存一致性模型)定义什么?

memory consistency model定义一系列规则,指出从内存地址load数据时的合法值

RISC-V定义了什么内存一致性模型?

RISC-V Weak Memory Ordering (RVWMO)

to provide flexibility for architects to build high-performance scalable designs while simultaneously supporting a tractable programming model.

在RVWMO下,从同一硬件线程(hart)中的其他内存指令的角度来看,运行在单个硬件线程上的代码是按顺序执行的。也就是说,对于同一个hart来说,所有的内存指令的最终行为应该符合程序序。

但来自另一个hart的内存指令可能会观察到第一个hart的内存指令以不同的顺序执行。

RVWMO Memory Model的定义

The RVWMO memory model is defined in terms of the global memory order, a total ordering of the memory operations produced by all harts. In general, a multithreaded program has many different possible executions, with each execution having its own corresponding global memory order.

The global memory order is defined over the primitive load and store operations generated by memory instructions. It is then subject to the constraints defined in the rest of this chapter. Any execution satisfying all of the memory model constraints is a legal execution (as far as the memory model is concerned).

RVWMO内存模型是基于全局内存顺序定义的,这是一种对所有hart产生的内存操作进行全序排列的顺序。通常,一个多线程程序有许多不同的可能执行路径,每个执行路径都有其对应的全局内存顺序。全局内存顺序是基于内存指令生成的基本加载和存储操作定义的。然后,它受到本章其余部分定义的约束条件的限制。任何满足所有内存模型约束的执行路径都被视为合法执行(就内存模型而言)。

保留程序顺序(Preserved Program Order)

对于程序的任何给定执行,其全局内存顺序尊重每个硬件线程hart的部分程序顺序,但不是全部。程序顺序中必须被全局内存顺序尊重的子集称为保留程序顺序

保留程序顺序的完整定义如下(注意原子操作(AMOs)同时是加载和存储):如果内存操作a在程序顺序中先于内存操作b,并且ab都访问常规主存(而不是I/O区域),并且满足以下任一条件,则内存操作a在保留程序顺序中(因此也在全局内存顺序中)先于内存操作b

(1)重叠地址顺序:

1. b是一个store操作,并且ab访问重叠的内存地址

2. ab都是load操作,xab都读取的字节,在程序顺序中ab之间没有对x的存储操作,并且ab返回由不同内存操作写入的x的值

2的情况是例如有两个线程,在a读取完后可能另一个线程写入,但是在第一个线程看来,并没有指令写入过x所指向的内存地址

3. a由atomic操作(AMO)或SC指令生成,b是一个加载操作,并且b返回由a写入的值

SC指令,即“Store Conditional”指令,是一种原子操作指令,通常用于多处理器或多线程环境中。它的主要目的是在特定条件下执行存储操作,并且只有在满足这些条件时,存储操作才会成功。如果条件不满足,存储操作将不会执行,并且通常会返回一个失败状态。

(2)显式同步

4. 存在一个FENCE指令,它使a排在b之前

5. a具有获取annotation属性

定义:Acquire annotation用于标记一个内存操作(通常是加载操作),表示该操作必须在其后续的所有内存操作之前完成。换句话说,acquire操作确保在其之后的所有内存操作都不会在它之前执行。

作用:Acquire annotation通常用于确保在加载某个共享资源之后,对该资源的后续操作不会被重排序到加载操作之前。这有助于防止数据竞争和确保线程间的同步。

示例:假设有一个加载操作 load.acquire,它读取一个共享变量的值。这个annotation确保在读取操作完成之前,其他线程对该变量的写操作不会被重排序到读取操作之前。

6. b具有释放annotation属性

7. ab都具有RCsc注解

Relaxed Consistency, Store-Conditional

8. ab配对

(3)流水线依赖关系

12. b是一条load指令,并且在程序顺序中,ab之间存在某条存储指令m,使得ma具有地址或数据依赖关系,并且b返回由m写入的值

13. b是一条store指令,并且在程序顺序中,ab之间存在某条指令m,使得ma具有地址依赖关系

很奇怪的一条