解析RISCV 原子指令

news2024/12/23 6:19:40

背景

原子指令顾名思义,就是这条指令的指令是一个整体,是“不可拆分的”,要么没做,要么已经完成了,不会出现只完成一半的场景。对于一些原子指令来说,可能需要分好几步来实现,比如“读-修改-写”。如果一个核在执行原子指令,那么在别的核的视角里,这条指令要么没做,要么这条原子指令的所有步骤都已经做完了。
这种特性在多处理器系统中尤为重要,可以用来实现同步锁,可以防止因多个处理器同时访问和修改同一数据而导致的竞争条件和数据不一致问题。因此,原子指令主要用于实现多核间的同步,确保在多个线程或进程之间正确地共享和访问资源,从而避免死锁、竞争条件等同步问题。

原子指令

RV A extension中介绍了AMO指令(即原子指令),AMO指令需要完成“读-修改-写”的操作,包括如下指令:

  • AMOADD.W/D(原子加字):将内存中地址为x[rs1]中的字与x[rs2]相加,并将结果写回该地址。同时,将原始值符号位扩展后存入rd寄存器。
  • AMOXOR.W/D(原子异或字):将内存中地址为x[rs1]中的字与x[rs2]进行按位异或操作,并将结果写回该地址。同时,将原始值符号位扩展后存入rd寄存器。
  • AMOAND.W/D(原子与字):将内存中地址为x[rs1]中的字与x[rs2]进行按位与操作,并将结果写回该地址。同时,将原始值符号位扩展后存入rd寄存器。
  • AMOOR.W/D(原子或字):将内存中地址为x[rs1]中的字与x[rs2]进行按位或操作,并将结果写回该地址。同时,将原始值符号位扩展后存入rd寄存器。
  • AMOSWAP.W/D(原子字交换):将内存中地址为x[rs1]的字与x[rs2]的值进行交换,并将x[rs1]原值符号位扩展后存入rd寄存器。
  • AMOMIN.W/D(原子最小字):比较内存中地址为x[rs1]的字与x[rs2]的值,将较小值(二进制补码比较)写回该地址。同时,将原始值符号位扩展后存入rd寄存器。
  • AMOMAX.W/D(原子最大字):比较内存中地址为x[rs1]的字与x[rs2]的值,将较大值(二进制补码比较)写回该地址。同时,将原始值符号位扩展后存入rd寄存器。
  • AMOMINU.W/D(原子无符号最小字):比较内存中地址为x[rs1]的字与x[rs2]的值,将无符号数比较后的较小值写回该地址。同时,将原始值符号位扩展后存入rd寄存器。
  • AMOMAXU.W/D(原子无符号最大字):比较内存中地址为x[rs1]的字与x[rs2]的值,将无符号数比较后的较大值写回该地址。同时,将原始值符号位扩展后存入rd寄存器。

用途

在背景中,我们介绍了原子指令可以实现线程之间同步锁,spec举了一个例子使用原子指令来实现经典的spinlock自旋锁。自旋锁保证了在任何时刻,只有一个线程(或CPU)能够获得锁,并且执行Critical section中的内容,其他线程(或CPU)则会忙等待,直到获得锁为止。

li t0, 1
again:
lw t1, (a0) # 将锁的值读回来
bnez t1, again # 检查锁是否被占据(不为0),如果被占,则再读一次
amoswap.w.aq t1, t0, (a0) # 如果锁未被占据,则将t0和锁的值互换
bnez t1, again # 如果锁在bnez和amoswap之间被占据了,则再尝试一次
#…
#Critical section.
#…
amoswap.w.rl x0, x0, (a0) # 将锁释放

硬件实现

在硬件实现上,CPU需要保证该原子指令的执行不被打断,并且在多核系统中,原子操作时,别的核不能访问该原子指令访问的地址。CPU需要做到但不限于以下要求:

  1. 原子指令准提交执行,避免该原子指令处于错误的分支上。
  2. 在原子指令执行期间,屏蔽中断,调试等需要可恢复的异步事件。
  3. 对于有cache的核,应当保证原子指令在执行期间,该数据应当一直唯一地存在于该核中(可以理解为MOSEI模型中的E态)。
  4. 如果需要总线来保证其原子指令的原子性,可以由lock传输等方式保证该地址不被其他master访问。但lock传输容易引发系统的死锁,AXI4协议中也取消了lock传输。因此在多核系统中,还是推荐使用cache将要访问地址缓存在本核的cache中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址:https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具,包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息,因此从古代岩画到现代建筑图纸,素描在世界各地被用于各种用途。儿童…

初等函数整理

1.幂函数 2.指数函数 3.对数函数

【C/C++】手搓项目中常用小工具:日志、sqlit数据库、Split切割、UUID唯一标识

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论​: 本章将写到一些手搓常用工具,方便在项目中的使用,并且在手搓的过程中一些函数如:日志 宏中的__VA_ARGS__接收可变参…

路径规划之启发式算法之二十一:狼群算法(Wolf Pack Algorithm,WPA)

狼群算法(Wolf Pack Algorithm,WPA)是一种模拟狼群捕食行为及其猎物分配方式的群体智能优化算法。它由吴虎胜等人在2013年提出,算法采用了基于人工狼主体的自下而上的设计方法和基于职责分工的协作式搜索路径结构。它通过抽象狼群搜索、围攻以及更新换代的三种行为方式来实…

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】

继上一篇的hello world: 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门hello world输出【入门一】-CSDN博客】 这一篇我们开始任务的创建。 工程还是用上一篇的hello world作为模板,hello world就不再app_main函数中输出,改成在任务…

用音乐与自我对话 ——澄迈漓岛音乐节x草台回声

四季循环,昼夜往复,在相对恒定的日常中,音乐是扇打量世界又内观本心的双向窗户。难以描述的触动,透过音乐语言转换为温热且真实的吟唱,一次又一次记录与释放。 除却生浪主舞台中的声音玩具乐队以及STOLEN秘密行动&…

基础元器件的学习

1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负,然后下正上负。当二极管接到反向电压,二极管存在寄生电容,电压不能立刻突变,当输入频率变高时&#…

HTTP协议及安全防范

由于图片解析问题,可以点击查看 👉🏻 博客原文 HTTP(Hypertext Transfer Protocol)超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议,客户端通过发送请求到服务器来获取…

LabVIEW深海气密采水器测控系统

LabVIEW的深海气密采水器测控系统通过高性价比的硬件选择与自主开发的软件,实现了高精度的温度、盐度和深度测量,并在实际海上试验中得到了有效验证。 项目背景 深海气密采水器是进行海底科学研究的关键工具,用LabVIEW开发了一套测控系统&am…

基于自然语言处理自动分配和高效执行制造任务可提高制造代理的灵活性和适应性

概述 论文地址:https://arxiv.org/abs/2406.01893 本研究提出了一种将大规模语言模型(LLMs)集成到多代理系统(MAS)中的新框架,以解决传统制造业在适应动态环境和快速响应生产变化方面所面临的困难。具体来…

使用 acme.sh 申请域名 SSL/TLS 证书完整指南

使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL?前置要求安装过程 步骤一:安装 acme.sh步骤二:配置 ZeroSSL 证书申请 方法一:手动 DNS 验证(推荐新手使用)方法二&#xf…

越疆科技营收增速放缓:毛利率未恢复,持续亏损下销售费用偏高

《港湾商业观察》施子夫 12月13日,深圳市越疆科技股份有限公司(以下简称,越疆科技,02432.HK)发布全球发售公告,公司计划全球发售4000万股股份,其中3800万股国际发售,200万股香港公开…

windows下搭建本地sofa-registry

官方介绍: SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。SOFARegistry 最早源自于淘宝的 ConfigServer,十年来,随着蚂蚁金服的业务发展,注册中心架构已经演进至第五代。目前 SOFARegistry 不仅全面服…

「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件

本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。 关键词 UI互动应用天气预报数据绑定动态展示状态管理 一、功能说明 自定义…

Pytorch | 从零构建MobileNet对CIFAR10进行分类

Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练过程和测试结果…

支付域——清结算系统体系

摘要 本文深入探讨了支付清算的基础知识和跨机构清算原理,涵盖了组织、账户、支付工具和系统的基础,支付流程的模型,以及支付清算的全局实现。文章还详细介绍了支付机构的五大业务和支付系统的总架构,并通过案例分析了支付清算的…

javaEE-线程的常用方法-4

目录 一.start():启动一个线程 调用start()方法 start()方法只能调用一次: java中的API: start()和run()的区别: 二.中断一个线程 中断线程方法1:引入标志位 中断线程方法2:调⽤interrupt()⽅法 抛出的异常: 三.等待一个线程 join() 四、获取线程引用 五…

uniapp小案例---趣味打字坤

当点击输入框时出现小鸡打字 当输入框失焦时打字鸡沉下去 原图自取 这里运用了一个三元 :class"isActive?active:"&#xff0c;当聚焦时isActivetrue从而让class绑定&#xff0c;当失焦时isActivefalse <template><view class"out"><inp…

JS使用random随机数实现简单的四则算数验证

1.效果图 2.代码实现 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

vue3项目结合Echarts实现甘特图(可拖拽、选中等操作)

效果图&#xff1a; 图一&#xff1a;选中操作 图二&#xff1a;上下左右拖拽操作 本案例在echarts​​​​​​​示例机场航班甘特图的基础上修改​​​​​​​ 封装ganttEcharts组件&#xff0c;测试数据 airport-schedule.jsonganttEcharts代码: 直接复制粘贴可测​​​​…