Page 10 - 《软件学报》2025年第9期
P. 10

徐学政 等: RISC-V  内存一致性模型的同地址顺序一致性定理证明                                             3921


                 意同地址访存序列的构建抽象为确定有限状态自动机, 每个状态对应一种访存序列的模式, 通过对各个模式满足
                 SCPL  以及模式转换正确性的证明, 从而实现对任意访存序列满足                   SCPL  的证明. 证明过程使用     Coq  进行了验证.
                 本研究是对    RVWMO   相关形式化方法的一个理论补充.

                                                        初始条件: x=0
                                                  线程 0             线程 1
                                                  a:  r 1 =x;      c: x=1;
                                                  b:  r 2 =x;      d: x=2;
                                                    最终结果: x=2; r 1 =2; r 2 =1
                                 图 3 被  RVWMO   禁止的访存序模式       (x 为共享变量, r 1 和  r 2 为寄存器)

                    本文涉及的     Coq  脚本与实验数据已开源       (https://gitee.com/twohaha/scpl_proof).
                    本文第   1  节详细介绍   RVWMO   及  Litmus 测试. 第  2  节介绍  RVWMO  公理模型的相关形式化定义. 第       3  节介
                 绍  SCPL  及其形式化描述. 第    4  节介绍基于确定有限状态自动机的定理证明过程. 第                5  节应用  SCPL  进行案例分
                 析. 最后总结全文.

                 1   背景知识

                 1.1   RVWMO  概述
                    RVWMO   是一种宽松的内存一致性模型, 属于           RC  模型  [15] 的变种. RVWMO  规定并行程序执行生成的所有访
                 存原语遵循全局访存序, 顺序与保留程序序一致, 且符合加载值公理, 原子性公理和进度保证公理. 其中, 访存原语
                 指的是不可中断的读写操作, 是访存操作的基本单元, 在后文中统称为访存事件或操作. 全局访存序指的是所有硬
                 件线程的访存事件遵循一个共同的观测顺序, 这是由                 RVWMO   满足多拷贝原子性       [17] 决定的. 相比之下, Power 内
                 存模型  [5] 不具备多拷贝原子性, 各个线程无法形成统一的全局访存序. 程序序                   (program order, po) 指的是单个线程
                 执行的指令序列构成的顺序, 而保留程序序指的是程序序中必须维护保留的部分, 即不可乱序的部分. 例如, 具有
                 依赖关系的两条指令在执行时不可乱序. RVWMO                共定义了   13  条保留程序序规则. 这里给出前两条规则的非形
                 式化定义   (形式化定义见第      2.1  节). (1) 具有程序序的两个对同地址的访存操作, 后者是写操作. (2) 具有程序序的
                 两个对同地址的读操作, 二者的值来自不同的写操作, 且程序序在二者之间不存在对同地址的写操作.
                    RVWMO   定义了   3  条公理对模型进行补充. 加载值公理规定, 对于任意读操作                r, 其目标地址   x 的值来自在以
                 下所有操作中位于全局访存序末位的操作: (1) 全局访存序位于                  r 之前的所有对    x 的写操作; (2) 程序序位于     r 之前
                 的所有对   x 的写操作. 图   4  给出了加载值公理的示意图, 其中所有操作的目标地址均相同, r 和                  w  分别表示读操作
                 和写操作. 其中, r 的值可能来自全局访存序在其之前的写操作                  (w 1 和  w 2 ) 以及程序序在其之前的写操作     (w 3 ), 将
                 以上  3  个写操作放在全局访存序中比较, r 的值最终来自排在末位的                  w 3 . 值得注意的是, w 3 的全局访存序在     r 之
                 后, 这是因为   RVWMO   允许线程内的写和读乱序. X86/TSO        模型同样放松了该约束        [2,3] , 主要由微架构中的写缓冲
                 机制导致的. 原子性公理规定了成对出现的读保留                (load-reserved) 和条件写  (store-conditional) 的相关访存约束. 进
                 度保证公理规定了访存操作在有限时间内全局可见, 这要求我们在判定访存序合法性时考虑每一个访存操作. 本
                 文的证明主要利用了加载值公理.

                                                          w 3
                                                          r
                                                w 1  w 2       w 3   w 4
                                                                     全局访存序
                                                          w 5
                                                     程序序
                                      图 4 加载值公理的示意图         (r 表示读操作, w  表示写操作)
   5   6   7   8   9   10   11   12   13   14   15