计算机基础实战课
彭东
网名 LMOS,Intel 傲腾项目关键开发者
19719 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
计算机基础实战课
15
15
1.0x
00:00/00:00
登录|注册

20|RISC-V指令精讲(五):原子指令实现与调试

你好,我是 LMOS。
通过前面的课程,我们学过了 RISC-V 的各种跳转指令以及这些指令的各种变形,并且了解了它们的机器编码。
今天,我们开始学习 RISC-V 下的原子指令,原子指令是 RISC-V 的指令扩展,命名为 ‘A’。这个扩展指令中包含两部分,分别是 LR/SC 指令和 AMO 指令。
我们先搞明白为什么需要原子指令,什么情况用得上它们。再分别学习和对比 LR/SC 指令与 AMO 指令,另外,我还会让你知道这些指令各自的使用场景是什么。
课程代码你可以从这里下载。话不多说,让我们直接开始吧。

为什么需要原子指令

你对学生时代上的物理课还有什么印象么?那时候我们就接触过“原子”这个概念了。“原子”是物质的最小组成,即原子是不可分割的。虽然到现在科学家已经发现在原子内部有更小的成分,但是在广义上原子仍然保持“不可分割”的语义。
那么在芯片中的原子指令是什么呢?它延续了“不可分割”这个含义,表示该指令的执行是不可分割的,完成的操作不会被其它外部事件打断。
我们结合一段代码,来了解原子指令的具体作用和使用场景。
//全局变量A
int A = 0;
//线程A执行的函数
void thread_a()
{
A++;
printf("ThreadA A is:%d\n",A);
return;
}
//线程B执行的函数
void thread_b()
{
A++;
printf("ThreadB A is:%d\n",A);
return;
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

RISC-V架构下的原子指令LR/SC和AMO在多线程程序设计中扮演着重要角色。LR/SC指令通过配合实现原子操作,确保数据的一致性和不可分割性,适用于多线程共享变量和多程序访问同一文件的场景。文章深入介绍了LR/SC指令的重要性和实现方式,并通过代码示例和指令转换的方式说明了非原子操作可能导致数据不一致的情况,进而引出了原子指令的重要性。此外,文章还介绍了AMO指令,相比LR/SC指令,AMO指令更方便使用,因为每个指令完成的操作同样是不可分割,不能被外部事件打断的。AMO指令包括原子交换指令、原子加法指令、原子逻辑指令和原子取大小值指令,这些指令在保证原子性的同时,能直接对内存地址中的数据进行操作。LR/SC指令的原子性保证为系统中各种同步锁提供了基础设施,对于理解和设计多线程程序具有重要意义。总之,本文通过深入解析RISC-V架构下的原子指令LR/SC和AMO,为读者提供了重要参考,帮助他们更好地理解和应用这些原子指令。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 苏流郁宓
    原子指令模式(要么都执行,要么就只能返回到都不执行),随着cpu单核逼近物理极限,那么 相比于冯诺依曼结构 (原子模式随着核增多,维护数据一致浪费时间越多) 哈佛结构有没有它的优点?在多核模式下 部分领域优于冯诺依曼结构的?

    作者回复: 是的

    2022-09-09归属地:湖北
    2
  • Bean
    老师好,有个地方不是很明白 代码中: amoadd.w a0, a1, (a0) #原子相加a0=[a0] [a0]=[a0] + a1 翻译后的两条指令,执行过程是否有先后顺序? 如果有先后顺序,那么执行 a0=[a0] 时,是否a0的值已经更新,之后的 [a0]=[a0] + a1 是按照赋值(更新)后 a0 的值作为寻址地址,进行操作?
    2023-01-17归属地:陕西
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部