RISC-V学习基础(六)

news2024/11/24 3:56:51

原子指令

RV32A有两种类型的原子操作:

  • 内存原子操作(AMO)
  • 加载保留/条件存储(load reserved/store conditional)
    图6.1是RV32A扩展指令集的示意图:
    在这里插入图片描述
    图6.2列出了它们的操作码和指令格式
    在这里插入图片描述
  • AMO(atomic memory operation)指令对内存中的操作数执行一个原子操作,并将目标寄存器设置为操作前的内存值。原子表示内存读写之间的过程不会被打断,内存值也不会被其它处理器修改。
  • 加载保留和条件存储(load reserved/store conditional)保证了两条指令之间的操作的原子性。加载保留读取一个内存字,存入目标寄存器中,并留下这个字的保留记录。而如果条件存储的目标地址上存在保留记录,它就把这个字存入地址。如果存入成功,它向目标寄存器写入0;否则写入一个非0的错误代码。

编程语言的开发者会假定体系结构提供了原子的比较-交换操作(compare and swap):比较一个寄存器中的值和另一个寄存器中的内存地址指向的值,**如果它们相等,将第三个寄存器中的值和内存中的值进行交换。**这是一条通用的同步原语,其它的同步操作可以以它为基础来完成。

  • 仅管这样一条指令假如ISA看起来十分必要,它在一条指令中却需要3个源寄存器和1个目标寄存器,源操作数从两个增加到三个,会使得整数数据通路、控制逻辑和指令格式都变得复杂许多。
  • RV32FD的多路加法(multiply-add)指令有三个源操作数,但它影响的都是浮点数据通路,而不是整数数据通路。
  • 不过,加载保留和条件存储只需要两个源寄存器,用它们可以实现原子的比较交换。

用lr/sc实现内存字M[a0]的比较-交换操作。

# Compare-and-swap(CAD) memory word M[a0] using lr/sc.
# Expected old value in a1;desired new value in a2.

lr.w a3,(a0) # load old value
bne a3,a1,80 # old value equals a1?
sc.w a3,a2,(a0) # 相等则存入新的值
bnez a3,0 # 如果存入失败重新尝试
... code following successful CAS goes here ... 

地址80: 比较-交换不成功

在这里插入图片描述
第一个例子使用加载保留lr.w/条件存储sc.w实现比较-交换操作。
第二个例子使用原子交换amoswap.w实现互斥。

  • 另外还提供AMO指令的原因是,它们在多处理器系统中拥有比加载保留/条件存储更好的扩展性,例如可以用它们来实现高效的归约。AMO指令在I/O设备通信时也有用,可以实现总线事务的原子读写。

内存一致性模型
RISC-V具有宽松的内存一致性模型(relaxed memory consistency model),因此其它线程看到的内存访问可以是乱序的。图6.2中,所有的RV32A指令都有一个请求位(aq) 和一个释放位(rl)。

  • aq被置位的原子指令保证其它线程在随后的内存访问中看到顺序的AMO。
  • rl被置位的原子指令保证其它线程在此之前看到顺序的原子操作。

压缩指令

以前的ISA为了缩短代码长度而显著扩展了指令和指令格式的数量,比如添加了一些只有两个操作数的指令,减小立即数域等。但新的ISA为处理器和编译器增加了负担,同时也增加了汇编语言程序员的认知负担。

  • RV32C采用了一种新颖的方法:每条短指令必须和一条标准的32位RISC-V指令一一对应。此外,16位指令只对汇编器和链接器可见,并且是否以短指令取代对应的宽指令由它们决定。
  • 编译器编写者和汇编语言程序员可以幸福地忽略RV32C指令及其格式,它们能感知的是最后程序的大小小于大多数其它ISA的程序。图7.1是RV32C扩展指令集的图形化表示。
    在这里插入图片描述

基于以下的三点观察,架构师成功地将指令压缩到了16位:

  1. 对十个常用寄存器(a0-a5,s0-s1,sp以及ra)访问的频率远超过其它寄存器。
  2. 许多指令的写入目标是它的源操作数之一。
  3. 立即数往往很小,而且有些指令比较喜欢某些特定的立即数。
    因此,许多RV32C指令只能访问那些常用寄存器;一些指令隐式写入源操作数的位置;几乎所有的立即数都被缩短了,load和store操作只使用操作数整倍尺寸的无符号数偏移量。

图7.3列出了插入排序和DAXPY程序的RV32C代码。

插入排序中地址为4的地方

c.li a4,1 # (可扩展为 addi a4,x0,1) i = 1

RV32C的立即数指令比较短,因为它只能确定一个寄存器和一个小的立即数。

地址为10的地方

c.mv a2,a3 # 可扩展为add a2,x0,a3 

在这里插入图片描述
在这里插入图片描述
在执行之前用一个解码器将所有的16位指令转换为等价的32位指令。
图7.6到7.8列出了解码器可以转换的RV32C指令的格式和操作码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

向量

  • 当存在大量数据可供应用程序同时计算时,我们称之为数据级并行性。
  • 最著名的数据级并行架构是单指令多数据(SIMD,Signle Instruction Multiple Data)。SIMD最初流行是因为它将64位寄存器的数据分成多个8位、16位或32位的部分,然后并行计算他们。操作码提供了数据宽度和操作类型。数据传输只用单个SIMD寄存器的load和store进行。
  • 为了使SIMD更快,架构师随后加宽寄存器以同时计算更多部分。
  • 由于SIMD ISA属于增量设计,并且操作码指定了数据宽度,因此扩展SIMD寄存器意味着要同时扩展SIMD指令集。
  • 将SIMD寄存器宽度和SIMD指令数量翻倍的后续步骤让ISA更为复杂。

另一个利用数据级并行性的方案是向量架构。RISC-V使用向量。

  • 向量计算机从内存中收集数据,并将它们放入长的,顺序的向量寄存器中。在这些向量寄存器中,流水线执行单元可以高效地执行运算。
  • 接着,向量架构将结果从向量寄存器中取出,并将其分散地存回主存。
  • 向量寄存器的大小有现实决定,而不是像SIMD中那样嵌入操作码。
  • 将向量的长度和每个时钟周期进行最大操作数分离,是向量体系结构的关键所在。
  • 向量微架构可以灵活地设计数据并行硬件,而不会影响到程序员,程序员可以不用重写代码就享受到长向量带来的好处。

图8.1是RV32V扩展指令集的图形表示。
在这里插入图片描述

  • 前面章节提到的每一个整数和浮点计算指令基本都有对应的向量版本:图8.1中的指令继承了来自RV32I、RV32M、RV32F、RV32D和RV32A的操作。
  • 每个向量指令都有几种类型,具体取决于操作数是否都是向量(.vv后缀),或者源操作数包含一个向量和一个标量(.vs后缀)。
  • 一个标量后缀意味着有一个操作数来自x或f寄存器,另一个来自向量寄存器(v)。对于向量-标量操作,rsl域指定了要访问的标量寄存器。
  • 对诸如减法和除法之类的非对称运算,他们还会使用向量指令的第三种变体。其中第一个操作数是标量,第二个是向量(.sv后缀)。像Y = a - X这样的操作就会使用这种变体。

向量寄存器和动态类型

  • RV32V添加了32个向量寄存器,他们的名称以v开头,但每个向量寄存器的元素个数不同。
  • 该数量取决于操作的宽度和专用于向量寄存器的存储大小。如果处理器为向量寄存器分配了4096个字节,则这足以

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

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

相关文章

chatgpt赋能python:Python如何更新包

Python如何更新包 Python是当今最流行的编程语言之一,它通过其丰富的生态系统和充足的工具库为许多开发者提供了便捷、快速、高效的开发体验。在Python的世界里,包是一种最重要的组件之一,因为它们可以让你轻松地扩展Python的功能&#xff0…

【跨域】如何解决跨域问题

同源策略 同源 相同协议相同域名相同端口 内容 浏览器的同源策略 - Web 安全 | MDN (mozilla.org) 浏览器页面向不同源的服务器发送ajax请求资源时,响应的数据会被浏览器拦截 意义 出于安全性的考虑,防止恶意获取数据 解决方案 JSONP 不使用aj…

Rust每日一练(Leetday0022) 最小路径和、有效数字、加一

目录 64. 最小路径和 Minimum Path Sum 🌟🌟 65. 有效数字 Valid Number 🌟🌟🌟 66. 加一 Plus One 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 P…

docker水位如何清理(容器水位清理详细分析)

docker水位过高,清理怕出问题?,不知道清理什么?怕删错了?进入实践 第一步准备测试数据 创建 悬空的镜像(即REPOSITORY和TAG均为的镜像) docker pull busybox:musl docker tag busybox:musl b…

chatgpt赋能python:Python的更新:为什么你需要及时更新并如何更新

Python的更新:为什么你需要及时更新并如何更新 Python是一种强大的程序设计语言,它具有广泛的应用,从数据科学,机器学习到Web开发,都有着广泛的应用。不断更新的Python版本为开发者和用户提供了最新的功能和最佳实践。…

chatgpt赋能python:Python如何在同一行输出

Python如何在同一行输出 Python是一种高级编程语言,广泛应用于数据科学、Web开发、人工智能等领域。其中,输出内容是程序必不可少的一部分。本文将介绍在Python中如何在同一行输出多个内容。 一般输出 在Python中,使用print函数可以将内容…

Lecture 9 Lexical Semantics

目录 Introduction: sentiment analysis 引言:情感分析Word Semantics 单词语义Word meanings 单词含义WordNetSynsets 同义词集Noun Relations in WordNetHypernymy Chain 上位链Word SimilarityWord Similarity with PathsBeyond Path LengthAbstract NodesConcep…

GO 性能分析

GO 性能分析 简介 ​ go提供了内存分析工具,pprof利用它可以看cpu和内存的情况。 包含下面的几种类型: cpu内存阻塞锁 pprof分为大体分为两个部分 数据采集数据分析 数据采集有两种方式: 官方 官方提供了两种方式 runtime/pprof 这是用…

【AI】惠普暗夜精灵9安装Ubuntu20.04+nvidia驱动

1、关闭快速启动 NVIDIA驱动安装很是矫情,为了谨慎起见,还是禁用快速启动吧 在Win11下,进入控制面板–》硬件和声音–》电源选项–》更改电源按钮的功能 禁止“启用快速启动” 2、关闭设备加密 关闭设备加密,否则安装过程中会报:bitlocker加密需要解除 3、设置bios…

SpringMVC《学习笔记(21版尚硅谷)》

一、SpringMVC简介 1、什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean&#xff1…

Form表单(antd-design组件库)简单使用以及单一检查规则

1.Form表单 高性能表单控件,自带数据域管理。包含数据录入、校验以及对应样式。 2.何时使用 用于创建一个实体或收集信息。 需要对输入的数据类型进行校验时。 组件代码来自: 表单 Form - Ant Design 3.本地验证前的准备 参考文章【react项目antd组件-de…

chatgpt赋能python:Python如何变大字体的SEO技巧

Python如何变大字体的SEO技巧 在网页设计和优化中,使用合适的字体和字体大小是至关重要的。对于使用Python编程的开发人员和网站管理员来说,如何使Pyhton代码中的字体变大是一个非常有用的技巧。在本文中,我们将介绍几种方法来增大Python代码…

C语言7:输入若干个学生的成绩,统计出平均成绩

在程序编辑区编写程序,给定程序功能是: 从键盘上输入若干个学生的成绩,统计出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。 例如输入: 70 80 90 -1 输出: ave 80.00 --------OUTPUT----------- 70.0 程序有…

【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

💯 博客内容:【茶话数据结构】查找最短路径——Dijkstra算法详解 😀 作  者:陈大大陈 🦉所属专栏:数据结构笔记 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实…

软考A计划-电子商务设计师-模拟试题卷一

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

chatgpt赋能python:Python抢票的绝招

Python 抢票的绝招 随着互联网技术的不断发展,越来越多的人开始享受网购的便利。但是,随着一些热门事件的到来,如演唱会、体育比赛等,大家面临同一个问题:如何抢到热门事件的门票?这时,Python …

Win10利用剪贴板多次粘贴

工作中需要经常复制粘贴图片,每次ctrl C, ctrl V来回切换效率很低 网上有很多剪贴板增强工具,但win10本身有增强版的功能 多次复制后,在需要粘贴的地方按下,Windows徽标 V,就会出现所有复制过的内容 需要哪个直接点…

2023/06/05 PM Day4 软件项目生存期和生命周期

视频参考地址: B站闫波软件项目管理视频学习. 视频资源:video P4-P6 本篇重点:项目生存期 简书日更计划同步记录🏃… 项目生命周期 软件项目生命周期 *项目生命周期的阶段 C概念/启动阶段:确立项目需求和目标D开发/计…

chatgpt赋能python:Python如何把数据存到字典

Python如何把数据存到字典 字典是Python中非常有用的数据类型之一,它允许您将值与唯一的键相关联,从而快速地查找、插入和删除数据。在这篇文章中,我们将介绍如何使用Python将数据存储到字典中。 什么是字典? 字典是Python中的…

[开发板]001瑞芯微3588s开发记录--装一个仿真环境

文章目录 前言1. 构建python环境2 模型转换 前言 我是一个开发板的新手,刚买了一个瑞芯微3588s的板子,目标是要学习嵌入式的开发,也就是说把深度学习的框架,跑到板子上。万丈高楼平地起步。先把仿真环境搭建起来。 仿真环境可以跑…