RISC-V笔记——显式同步

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个在实践中常用:

  • FENCE RW,RW
  • FENCE.TSO
  • FENCE RW,W
  • ENCE R,RW
  • FENCE R,R
  • FENCE W,W

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返回的值,这一点也适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/893267.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络空间指纹:新型网络犯罪研判的关键路径

前言 新型网络犯罪是指利用计算机技术和互联网平台进行犯罪活动的一类犯罪行为。它涵盖了一系列使用网络和数字技术进行非法活动的行为,如网络钓鱼、网络诈骗、恶意软件攻击、黑客入侵、数据泄露、网络色情和社交网络犯罪等。 随着当前打击治理新型网络犯罪博弈态…

idea中,git提交时忽略某些本地修改.将文件从git暂存区移除

我们有时候在本地调试代码时,某些配置文件需要修改成本地环境中。当改完后,需要提交代码时,这些文件又不能推到git上。如下图: 当出现这种情况,我们每次都需要手动去将不需要提交的文件的对号去掉。文件多了后&#x…

dlib库-人脸检测

文章目录 一、介绍二、与OpenCv对比三、dlib库安装1.直接安装2.dlib库whl文件进行安装 四、代码实现五、总结 一、介绍 dlib库是一个适用于C和Python的第三方库。包含机器学习、计算机视觉和图像处理的工具包,被广泛的应用于机器人、嵌入式设备、移动电话和大型高性…

STM32L031F6P6基于CubeMX的串口通信调试笔记

用CubeMX创建项目 本实例用的PA14、PA13两个引脚,LPUART1。 对串口参数进行设置: 开启串口中断: 时钟源设置成内部高频时钟: 对项目进行设置: 生成代码: 在串口初始化函数中加入 __HAL_UART_ENA…

wps图标没有坐标轴标题怎么办?wps表格不能用enter下怎么办?

目录 wps图标没有坐标轴标题怎么办 一、在WPS PPT中添加坐标轴标题 二、在WPS Excel中添加坐标轴标题 wps表格不能用enter下怎么办 一、检查并修改设置 二、检查单元格保护状态 三、使用快捷键实现换行 wps图标没有坐标轴标题怎么办 一、在WPS PPT中添加坐标轴标题 插入…

基于Java微信小程序的高校教务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

Django学习-后台管理相关操作

admin配置步骤: 注册自定义的模型类: 代码: from django.contrib import admin from .models import Book, Author# Register your models here. admin.site.register(Book) admin.site.register(Author)模型管理器类(修改&#…

工程技术-中英文普刊合集

文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网:https://ais.cn/u/3eEJNv 三、服务简述 四、投稿须知 1.在线投稿:由艾思科蓝支持在线投稿,请将文章全文投稿至艾思科蓝投稿系…

案例分析:Modbus设备如何通过MQTT网关连接阿里云IoT

物联网技术的发展,越来越多的传统工业控制系统需要与现代云平台集成,以便实现远程监控、数据分析等功能。Modbus协议作为工业控制领域的一种常见通讯协议,其设备通常需要转换为MQTT协议才能更好地与诸如阿里云IoT、华为云IoT、ThingsBoard等云…

pdf文件太大如何变小?

pdf文件太大如何变小?在处理PDF文件的过程中,文件大小往往成为了一个不可忽视的关键因素。庞大的文件不仅占据了宝贵的存储空间,还在文件传输过程中造成了时间上的延误,这无疑给工作效率带来了不小的挑战。特别是在电子邮件附件的…

突破干扰,无人机自动驾驶技术详解

突破干扰的无人机自动驾驶技术,是一个结合了多学科领域的复杂系统,旨在确保无人机在复杂电磁环境、人为干扰等条件下仍能自主、安全地完成飞行任务。以下是对该技术的详细解析: 一、技术概述 无人机自动驾驶技术通过集成传感器技术、人工智…

Axure基本元件库——基本元件、表单和菜单表格

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:认识和数据Axure基本元件库 主要内容:基本元件、表单元件和菜单表格 应用场景:原型绘制基本元件、页面组成和交互基础 正文…

网络爬虫中的几种数据存储方式(上篇)

本文的内容是介绍网络爬虫中的数据存储方式。大家都知道爬虫的最重要功能就是从网络中将数据提取出来。现在问题来了,那么提取出来的数据该何去何从,如果仅仅只是保存在内存当中,当程序结束后岂不是所有的内容都消失了?因此需要将…

大语言模型赋能病理AI,自动从报告文本中分类TNM分期|顶刊精析·24-10-17

小罗碎碎念 这篇文章介绍了一种名为BB-TEN(Big Bird – TNM staging Extracted from Notes)的方法,它能够自动从病理报告文本中分类TNM(肿瘤大小、区域淋巴结受累和远处转移)分期。 今天分享的这篇文章于2024-10-16发表…

elementUi el-table 表头高度异常问题

1、现象 在同一个页面通过状态切换不同table时&#xff0c;当从有合并标头行的table切换到无合并表头的table时&#xff0c;无合并表头的table的表头的高度异常了&#xff0c;如下图 切换后 2、解决 给每个el-table 加上一个唯一的key <el-table key"1"></…

大规模语言模型与生成模型:技术原理、架构与应用

大规模语言模型与生成模型&#xff1a;技术原理、架构与应用 个人主页&#xff1a;chian-ocean文章专栏 大规模语言模型与生成模型&#xff1a;技术原理、架构与应用1. 引言2. 大规模语言模型概述2.1 什么是大规模语言模型&#xff1f;2.2 常见的语言模型架构2.3 语言模型的技术…

在ESP-IDF环境中如何进行多文件中的数据流转-FreeRTOS实时操作系统_流缓存区“xMessageBuffer”

一、建立三个源文件和对应的头文件 建立文件名&#xff0c;如图所示 图 1-1 二、包含相应的头文件 main.h 图 2-1 mess_send.h mess_rece.h和这个中类似,不明白的大家看我最后面的源码分享 图2-2 三、声明消息缓存区的句柄 大家注意&#xff0c;在main.c中定义的是全局变…

Java 类和对象详解(上 )

个人主页&#xff1a; 鲤鱼王打挺-CSDN博客 Java专栏&#xff1a;https://blog.csdn.net/2401_83779763/category_12801101.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12801101&sharereferPC&sharesource2401_83779763&sharefromfrom_link &…

github下载文件的两种方式(非git形式)

1.以下面的图为例 &#xff0c;可以直接点击右上方的绿色Code按键&#xff0c;在弹出的列表中选择Download Zip选项&#xff0c;即可下载。 2.如果下载的是单独的某一个文件&#xff0c;则可以按照下图的格式点击下图所示的那个下载的图标即可。

研发线上事故风险解读之缓存篇

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》&#xff0c;进一步深入梳理线上事故缓存使用方面的问题点&#xff0c;重点关注缓存在使用和优化过程中可能出现的问题&#xff0c;旨在为读者提供具有实践指导意义的…