RV32A指令集

RV32A指令包括两类:AMO(atomic memory operation)指令,Load-Reserved/Store-Conditional指令

Category Fmt RV32I base machine code(bin) comment AMO(atomic memory-operation指令 从地址rs1指定的存储器中读出一个数据,存放到rd寄存器中,并且将读出的数据和rs2寄存器中的值进行计算,再将结果写回rs1指定的存储器中。 R amoswap.w rd, rs2,(rs1) 00001[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行互换。 R amoadd.w  rd, rs2,(rs1) 00000[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行加法操作。 R amoand.w  rd, rs2,(rs1) 01100[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行与运算。 R amoor.w  rd, rs2,(rs1) 01000[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行或操作。 R amoxor.w, rd, rs2,(rs1) 00100[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行异或操作。 R amomax.w, rd, rs2,(rs1) 10100[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行(当作有符号数)取最大值操作。 R amomaxu.w  rd, rs2,(rs1) 11100[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行(当作无符号数)取最大值操作。 R amomin.w  rd, rs2,(rs1) 10000[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行(当作有符号数)取最小值操作。 R amominu.w  rd, rs2,(rs1) 11000[26,aq][25,rl]00000[19-15,rs1]010[11-7,rd] 0101111 将读出的数据与rs2寄存器的值进行(当作无符号数)取最小值操作。 Load_Reserved/store-conditional指令   R lr.w rd, (rs1) 00001[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 从rs1指定的存储器地址中读出一个32位数据,结果放入rd中。   R lsc.w rd, rs2,(rs1) 00010[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd] 0101111 向rs1指定存储器地址中写入一个32位数据,数据来自于rs2寄存器。Sc指令不一定能够执行成功,只有满足一下条件,才能执行成功。
1.LR和SC指定成对的访问相同的地址。
2.LR和SC指令之间没有任何其他的写操作(来自任何一个hart)访问过相同的地址。
3.LR和SC指令之间没有任何中断与异常发生。
4.LR和SC指令之间没有任何的MRET指令。
如果执行成功,则向rd寄存器中写回数值0,如果失败,则向rd寄存器中写回一个非0值。如果执行失败,意味着没有真正写入存储器。

image

计算机体系结构中的存储器模型(或者说存储器一致性模型)主要分为三类:按序一致性模型,松散一致性模型,释放一致性模型。

更详细存储器一致性介绍请看:https://blog.csdn.net/jfengamarsoft/article/details/70923658?utm_source=blogxgwz2


按序一致性模型就是严格按序模型,如果处理器指令集架构符合按序一致性模型,那么多个处理器核上执行的程序就好像一个单核处理器上顺序执行一样。例如两个处理器核core0,core1,core0上执行了A,B,C,D四条存储器访问指令,core1 上执行了a,b,c,d四条访存指令。按序一致性模型系统上执行这8条指令的效果就好像在一个core上顺序执行了A a B b C c D d的指令流,或者A B a b C c D d,或者其他顺序,总之,只要符合core0和core1程序顺序,即从core0看,是A,B,C,D,从core1看是a,b,c,d的任意顺序都是合法的。

按序一致性模型的两条规则:

1.各个处理器核安装其程序顺序来执行,执行完一条厚启动执行下一条指令,不能改变存储器访问指令的顺序(即便访问的是不同的存储器地址)。

2.从全局看,每一个存储器写指令的操作都需要能够被系统中的所有处理器核同时观测到。就好像处理器系统(包括所有的处理器核)和存储系统之间有一个开关,一次只会连接一个处理器核和存储系统,因此对存储器的访问都是原子的,串行化的。

松散一致性模型:对于不同存储器访问指令,就单核而言,理论上是可以改变其执行顺序的。松散一致性模型允许多核系统中,每个单核改变其存储器访问指令(比如是访问不同的地址)的执行顺序。

松散一致性模型可以通过fence指令,来同步多核之间的存储器访问。在fence之前的所有存储器访问指令,必须比该fence指令之后的所有存储器访问指令先执行。

释放一致性模型进一步支持获取(acquire)释放(release)机制:

定义一种获取acquire指令,它仅屏障其之前的所有存储器访问操作。

定义一种释放release指令,它仅屏障其之后的所有存储器访问。


AMO指令要求整个读出,计算,写回必须为原子性质,就是读出和写回之间,该存储器地址不能被其它进程访问,通常总线会锁定。

image

AMO指令也可以支持释放一致性模型,可以通过指令中的aq/rl位,来设置获取或释放属性。

amoswap.w rd, rs2,(rs1) 指令不具有获取和释放属性,不具备屏障功能。

amoswap.w.aq rd, rs2,(rs1) 指令具有获取属性,能够屏蔽其之后的所有存储器访问操作。

amoswap.w.rl rd, rs2,(rs1)指令具有释放属性,能够屏蔽其之前的所有存储器访问操作。

amoswap.w.aqrl rd, rs2,(rs1)指令具有获取释放属性,能够屏蔽其之前之后的所有存储器访问操作。

AMO指令实现上锁操作例子:

li t0, 1 #t0寄存器初始值为1

again:

amoswap.w.aq t0, t0, (a0)

bnez t0, again #如果锁中的值非0,意味着当前的锁仍然被其它进程占用,因此从新读取该锁的值。

critical section

amoswap.w.rl x0, x0,(a0) #写操作完成,向锁中写0


对于RV32A,LR/SC指令访问的地址,必须32位对齐,否则会产生异常,LR/SC指令也支持释放一致性模型,和AMO指令类似。

LR/SC 能够实现lock-free 数据结构.

下面是一个inline的比较交换函数,仅需要3条指令。


# a0 holds address of memory location
# a1 holds expected value
# a2 holds desired value
# a0 holds return value, 0 if successful, !0 otherwise
cas:

lr.w t0, (a0) # Load original value.

bne t0, a1, fail # Doesn’t match, so fail.

sc.w a0, a2, (a0) # Try to update.

jr ra # Return.

fail:
li a0, 1 # Set return to failure.

jr ra # Return.










  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值