RISC-V中的acquire和release

2024-08-23 04:36
文章标签 risc release acquire

本文主要是介绍RISC-V中的acquire和release,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RISC-V中,有两类原子操作指令:

⚫ 内存原子操作(AMO)

⚫ 加载保留/条件存储(load reserved / store conditional)

此处我们先看下LR和SC指令;

引入的原因

       编程语言的开发者会假定体系结构提供了原子的比较-交换(compare-and-swap)操作:

       比较一个寄存器中的值和另一个寄存器中的内存地址指向的值,如果它们相等,将第三个寄 存器中的值和内存中的值进行交换。

       这是一条通用的同步原语,其它的同步操作可以以它为 基础来完成;

       LR/SC的引入,就是为了实现这个操作;

具体规格

部分内容转载自:RISC-V 原子指令介绍 - 泰晓科技 (tinylab.org)

lr.{w/d}.{aqrl} rd, (rs1)

r 指令是从内存地址 rs1 中加载内容到 rd 寄存器。然后在 rs1 对应地址上设置保留标记(reservation set)。其中 w/d 分别对应 32 位/64 位版本。

sc.{w/d}.{aqrl} rd, rs2, (rs1)

  • sc 指令在把 rs2 值写到 rs1 地址之前,会先判断 rs1 内存地址是否有设置保留标记
  • 如果设置了,则把 rs2 值正常写入到 rs1 内存地址里,并把 rd 寄存器设置成 0,表示保存成功。如果 rs1 内存地址没有设置保留标记,则不保存,并把 rd 寄存器设置成 1 表示保存失败。
  • 不管成功还是失败,sc 指令都会把当前 hart 保留的所有保留标记全部清除。其中 w/d 分别对应 32 位/64 位版本。

     

注意事项:

  • RISC-V 的 Spec 中只规定了 sc 指令如果失败了,会往 rd 寄存器中写入非零值,并不一定是 1;
  • 对于 lr/sc 指令,要求 rs1 寄存器中的地址是按宽度对齐的,比如 lr.w 要求 4 字节对齐,sc.d 要求 8 字节对齐。否则会触发非对齐异常。
  • RISC-V 对 LR 和 SC 之间的指令是有限制的:
    • LR 和 SC 之间最大只能包含 16 个指令;
    • 这些指令只能使用基础整数指令集(指令集 “I”,不包含内存访问指令,跳转指令,fence 和 system 指令;
    • 如果违反了这些限制,LR/SC 指令的效果是不受约束的,可能在一些芯片实现上能保证原子性,在另外一些芯片实现上不能保证。
  • SC指令不一定执行成功,只有满足后面这四个条件,它才能执行成功:
    • LR和SC指令成对地访问相同的地址。
    • LR和SC指令之间没有任何其它的写操作(来自任何一个hart)访问同样的地址。-
    • LR和SC指令之间没有任何中断与异常发生。-
    • LR和SC指令之间没有执行MRET指令。

Memory order

部分参考:RISC-V原子指令LR/SC_riscv lr sc-CSDN博客

  • RISC-V 和 ARM 类似,内存模型都是弱内存模型(relax memory model),这意味着,在不加额外限制的情况下,内存访问指令并不会完全按照指令顺序执行。
  • RISC-V 有一个 FENCE 指令,可以用来显式添加内存顺序限制。
  • 为了提高效率,RISC-V 为每个原子指令都预留 aq/rl 两个比特位,从而可以很方便在原子指令上施加额外的内存顺序限制。
  • 原子指令是用来在不同 hart 之间做同步用的,而内存访问顺序强调的是同一个 hart 内的执行顺序。
  • LR/SC 和 AMO 指令就是通过这两个后缀来添加额外的内存顺序限制
  • 每个指令的这两个bit的组合代表的含义如下:

     

这篇关于RISC-V中的acquire和release的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098369

相关文章

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

RISC-V (十二)系统调用

系统模式:用户态和内核态         当前的代码都是实现在machine模式下。 系统模式的切换         epc寄存器的值存放的是ecall指本身的地址 。 用ecall指令 系统调用的执行流程         mret这条指令会利用status的mpp值恢复到之前的特权级别。  蓝色的线表示涉及到权限切换。  系统调用的传参

RISC-V (十)任务同步和锁

并发与同步 并发:指多个控制流同时执行。         多处理器多任务。一般在多处理器架构下内存是共享的。           单处理器多任务,通过调度器,一会调度这个任务,一会调度下个任务。  共享一个处                                理器一个内存。                 单处理器任务+中断: 同步: 是为了保证在并发执行的环境中各个控制流可

Banana Pi BPI-F3 进迭时空RISC-V架构下,AI融合算力及其软件栈实践

RISC-V架构下,AI融合算力及其软件栈实践 面对未来大模型(LLM)、AIGC等智能化浪潮的挑战,进迭时空在RISC-V方向全面布局,通过精心设计的RISC-V DSA架构以及软硬一体的优化策略,将全力为未来打造高效且易用的AI算力解决方案。目前,进迭时空已经取得了显著的进展,成功推出了第一个版本的智算核(带AI融合算力的智算CPU)以及配套的AI软件栈。 软件栈简介 AI算法部署旨

Debug跟Release区别

Debug和Release区别 Debug和Release区别  2011年10月17日   Debug和Release区别VC下Debug和Release区别   最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初

VS中Debug模式和Release模式的区别

一、Debug 和 Release 编译方式的本质区别   Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。   Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/F

RISC-V (八)定时器中断

​​​​​​​riscv中断的分类 Core local INTerrupt: CLINT CLINT编程接口-寄存器         mtime寄存器,由中断触发的时钟,按照固定频率计数。

RISC-V汇编实现矩阵阶乘

1) 源代码  long long fact(long long n) {if (n < 1) return 1;else return (n*fact(n - 1));} 2) 汇编代码  fact:addi sp, sp, -16 // adjust stack for 2 itemssd x1, 8(sp) // save the return add

什么是baseline?release和build

软件研发和管理过程中会产生许许多多的工作成果,例如文档、程序和数据等,他们都应当妥善地保管起来,以便查阅和修改。如果把所有文件一股脑的塞进计算机里,那么使用起来很麻烦。 凡是纳入配置管理范畴的工作成果统称为配置项,配置项主要有两大类:一类是属于产品的组成部分,例如需求文档、设计文档、源代码、测试用例等等;另一类是在管理过程中产生的文档,例如各种计划、报告等。 每个配置项的主要属性有名称

ubuntu16.04 安装caffe时出现 .build_release/tools/caffe: error while loading shared libraries: libcudart

在Ubuntu上面搭建caffe环境,搭建完成之后运行sudo make runtest -j8失败,提示错误为:.build_release/tools/caffe: error while loading shared libraries: libcudart.so.10.0: cannot open shared object file: No such file or directory