RISC-V笔记——显式同步

devtools/2024/10/18 21:50:43/

1. 前言

RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Explicit Synchronization(显示同步)。

2. 显示同步

显示同步指的是:a操作在程序顺序中先于b操作,a和b都访问常规主存,不是I/O区域,如果存在以下任何一个条件,那么a操作和b操作在全局内存顺序中的顺序也不会变。

  1. a和b之间有FENCE指令。
  2. a拥有acquire语义。
  3. b拥有release语义。
  4. a和b都有RCsc语义。
  5. a和b是配对的。

关于第一点,默认情况下,FENCE指令确保所有在程序顺序中位于FENCE之前的指令的内存访问(“前导集”)在全局内存顺序中比在程序顺序中位于FENCE之后的指令的内存访问(“后续集”)出现得更早。不过,为了性能上的考量,FENCE可以选择性进一步地限制前导集和后续集为较小的内存访问集。具体来说,FENCE有PR、PW、SR和SW bits,它们限制了前导集和后续集所包含的指令类型。如果PR为1,那么前导集包括load;如果PW为1,那么前导集包含store;如果SR为1,那么后续集包括load;如果SW为1,那么后续集包括store。

FENCE中PR、PW、SR和SW这4bit可以组成16种FENCE语义,但不是每一种组合都有用的。其中有7中组合具有空的前导集或后续集,因此是无操作的。另外FENCE还有一个额外的编码为FENCE.TSO,提供它主要是方便映射到“acquire+release”或RVTSO语义上。不过在这10(16-7+1)个选项中,只有下面6个在实践中常用:

RISC-V手册建议程序员只使用这6种FENCE指令,其他组合的FENCE指令可能不生效,而且会造成意外的结果。

关于第二点,通常在关键代码的临界区开始时使用acquire操作,要求在程序顺序在acquire之后的load和store操作也要在全局内存顺序上在acquire之后。这样可以确保关键代码临界区内位于acquire操作之后的所有load和store可以获取最新的数据。Acquire操作排序可以通过两种方式来实现。

  1. 使用acquire语义的指令:它只针对同步变量本身强制排序
  2. 使用FENCE R,RW:它针对之前的所有load强制排序

如下代码1使用第一种方案,因为amoswap使用了aq,所以临界区的load和store保证出现于获取锁的amoswwap之后的全局内存顺序中。然而a1和a2指向不同的内存位置,临界区的load和store可能与它们乱序,也就是在全局内存顺序中,它们之间的顺序不是固定的。

如下代码2使用第二种方案,在这种情况下,尽管amoswap不强制使用aq进行排序,但FENCE仍然强制amoswap在全局内存顺序中出现的时间比临界区中的所有load和store都要早。但使用FENCE的一个副作用就是,FENCE还强制执行了额外的排序,它还要求程序开始时的a2不相关的load指令出现的时间要早于临界区的load和store。因此,FENCE命令比aq命令在排序上更强硬些,当然也更粗糙些。

关于第三点,Release排序和acquire排序的工作原理类似,只是排序的方向相反。Release语义要求在release操作程序顺序之前的所有load和store也要在全局内存顺序上先于release操作。这样可以确保在全局内存顺序中,临界区的内存访问出现在release释放锁的store之前。就像acquire语义一样,release语义可以通过两种方式来实现:

  1. 使用带release的指令
  2. 使用FENCE RW,W指令

例子就如同第二点中代码1和代码2。代码1在关键代码片段的末尾使用rl来确保顺序,其中a3和a4与rl之间没有固定关系,在全局内存顺序上没有固定顺序。代码2在关键片段的末尾使用FENCE RW,W来确保顺序。

关于第四点,如果单独使用RCpc语义,就不会强制store release到load acquire的顺序,这有助于移植在TSO或RCpc内存模型下编写的代码。为了确保store release到load acquire的顺序,代码必须使用RCsc的语义。

关于第五点,在全局内存顺序中,SC必须出现在与其配对的LR之后。由于固有的语法数据依赖,通常使用LR/SC来执行原子读-修改-写操作。但其实即使store的值在语法上不依赖于成对LR返回的值,这一点也适用。


http://www.ppmy.cn/devtools/126830.html

相关文章

pandas在数据清洗中的实际应用

使用 pandas 进行数据清洗 一、引言 在当今数据驱动的时代,数据已成为企业和研究机构做出明智决策的核心要素。然而,原始数据往往充满了噪音、缺失值、重复值和异常值等问题。如果不对这些问题进行处理,可能会导致分析结果的偏差&#xff0…

Git基础-配置http链接的免密登录

问题描述 当我们在使用 git pull 或者 git push 进行代码拉取或代码提交时, 若我们的远程代码仓库是 http协议的链接时,就是就会提示我们进行账号密码的登录。 每次都要登录,这未免有些麻烦。 本文介绍一下免密登录的配置。解决方案 1 执行…

apache pulsar 安装最新版本, docker安装pulsar3.3.2

1. 官网地址: Run a standalone Pulsar cluster in Docker | Apache Pulsar 2. 下载镜像: 2.1 选择镜像版本: https://hub.docker.com/r/apachepulsar/pulsar/tags 2.2 版本3.3.2 docker pull apachepulsar/pulsar:3.3.2 3. 安装&#xff…

【Golang】Go语言中的反射原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Flutter结合鸿蒙next 中数据类型转换的高级用法:dynamic 类型与其他类型的转换解析

目录 写在前面 1. 什么是 dynamic 类型? 示例 2. dynamic 与其他类型的转换 2.1 强制类型转换 示例 2.2 使用 is 操作符 示例 2.3 从 List 转换 示例 3. dynamic 类型的最佳实践 3.1 避免过度使用 dynamic 3.2 使用 Null Safety 示例 3.3 异常处理 示…

【Oracle 数据库技术分享】BLOB 与 CLOB 的选择与应用

【Oracle 数据库技术分享】BLOB 与 CLOB 的选择与应用 文章目录 前言一、为什么选择 BLOB 或 CLOB?二、BLOB 与 CLOB 的区别1.数据类型2.性能3.功能4.兼容性5.存储限制6.查询和处理 三、选择 BLOB 或 CLOB 的建议1.根据数据类型选择2.考虑性能需求3.兼容性和集成4.综…

MFC工控项目实例二十四模拟量校正值输入

承接专栏《MFC工控项目实例二十三模拟量输入设置界面》 对模拟量输入的零点校正值及满量程对应的电压值进行输入。 1、在SenSet.h文件中添加代码 #include "BtnST.h" #include "ShadeButtonST.h"/ // SenSet dialogclass SenSet : public CDialog { // Co…

Java初学者的学习顺序

学习 Java 语言的全面流程可以分为多个阶段,从基础概念、编程语法、面向对象设计,到高级应用和项目实践,逐步深入。下面是一个详细的 Java 学习路径,适合初学者和中级开发者。 一、初级阶段:Java 基础语法 1. 安装和…