riscv的A扩展之原子操作(amo)

文章详细介绍了AMO(AtomicMemoryOperation)指令在计算机系统中的应用,涉及从内存读取、计算和写回的过程,强调了原子性和一致性模型,以及不同AMO指令如AMOADD.W、AMOSWAP.W等的功能和特性。同时提到了AtomicLoad、AtomicSwap和AtomicStore事务的结构和工作原理。
摘要由CSDN通过智能技术生成

原子指令用于从存储器(地址为 rsl 寄存器的值指定 )中读出一个数据,存放至 rd 寄存器中,并且将读出的数据与 rs2 寄存器的值进行计算,再将计算后的结果写回存储器(存储器写地址与读出地址相同),对于amo的load和store都可视作为写操作,不过load需要返回源数据,store不需要

AMO 是一条强大的“读改写”指令,只需一条指令即可支持直接在 rs1 中指向的数据存储器上进行各种不同的二进制操作。参照下图,该操作加载 rs1 中数据存储器地址位置的内容,并将该值存储在寄存器 rd 中。然后用 rs2 中的值对 rd 值进行二进制运算,并将结果保存回 rd 中,保存回在 rs1 的数据存储器地址位置。

对于 32 位架构的 AMO 指令,访问存储器的地址必须与 32 位对齐,否则会产生地址非

对齐异常( AMO Misaligned Address Exception )。

AMOSWAP.W指令(amoswap.w rd,rs2,(rs1))
  • 原子字交换(Atomic Memory Operation: Swap Word),将内存中地址为x[rs1]的字记为t,把这个字变为x[rs2]的值,把x[rd]设为符号位扩展的t。
  • x[rd] = AMO32(M[x[rs1]] SWAP x[rs2])
AMOADD.W指令(amoadd.w rd,rs2,(rs1))
  • 原子加字(Atomic Memory Operation: Add Word),将内存中地址为x[rs1]中的字记为t,把这个字变为t+x[rs2],把x[rd]设为符号位扩展的t。
  • x[rd] = AMO32(M[x[rs1]] + x[rs2]

//amoadd
rd = *rs1
*rs1 = *rs1 + rs2

把rs1中的数据当成了内存地址,先把该地址上一个32位或者64位的数据,读到rd寄存器中。然后把rs2的数据与rs1指向的内存单元里的数据相加,结果写入到该地址的内存单元中,该地址仍需要32位或者64位对齐。这两步操作是不可分割的。

AMOXOR.W指令(amoxor.w rd,rs2,(rs1))
  • 把内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]按位异或的结果,把x[rd]设为符号位扩展的t。
  • x[rd] = AMO32(M[x[rs1]] ^ x[rs2])

//amoand
rd = *rs1
*rs1 = *rs1 & rs2
//amoor
rd = *rs1
*rs1 = *rs1 | rs2
//amoxor
rd = *rs1
*rs1 = *rs1 ^ rs2

AMOAND.W指令(amoand.w rd,rs2,(rs1)
  • 原子字与(Atomic Memory Operation: AND Word),将内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]按位与的结果,把x[rd]设为符号位扩展的t
  • x[rd] = AMO32(M[x[rs1]] & x[rs2])
AMOOR.W指令(amoor.w rd,rs2,(rs1))
  • 原子字或(Atomic Memory Operation: OR Word),将内存中地址为x[rs1]中的字记为t,把这个字变为t与x[rs2]按位或的结果,把x[rd]设为符号位扩展的t。
  • x[rd] = AMO32(M[x[rs1]] | x[rs2])
AMOMIN.W指令(amomin.w rd,rs2,(rs1))
  • 原子最小字(Atomic Memory Operation: Minimum Word),将内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]中的较小值(二进制补码比较),然后写入x[rd]。
  • x[rd] = AMO32(M[x[rs1]] MIN x[rs2])
AMOMAX.W指令(amomax.w rd,rs2,(rs1))
  • 原子最大字(Atomic Memory Operation: Maximum Word),将内存中地址为x[rs1]的字记为t,将这个字变为t和x[rs2]中较大的一个(用二进制补码表示),然后写入x[rd]。
  • x[rd] = AMO32(M[x[rs1]] MAX x[rs2])
AMOMINU.W指令(amominu.w rd,rs2,(rs1))
  • 将内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]中较小值(用无符号数比较),然后写入x[rd]。
  • x[rd] = AMO32(M[x[rs1]] MINU x[rs2])
AMOMAXU.W指令(amomaxu rd,rs2,(rs1))
  • 将内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]中的较大值(用无符号数比较),然后写入x[rd]
  • x[rd] = AMO32(M[x[rs1]] MAXU x[rs2])

max(a,b)
{
    if(a > b)
        return a;
    else
        return b;
}
min(a,b)
{
    if(a < b)
        return a;
    else
        return b;
}
exts(a)
{
    return 扩展符号(a)
}
//amomax
rd = *rs1
*rs1 = max(exts(*rs1),exts(rs2))
//amomaxu
rd = *rs1
*rs1 = *rs1 = max(*rs1,rs2)
//amomin
rd = *rs1
*rs1 = min(exts(*rs1),exts(rs2))
//amominu
rd = *rs1
*rs1 = *rs1 = min(*rs1,rs2)

观察上面的伪代码,我们可以看到max函数可以返回两数之间的大数、min函数可以返回两数之间的小数,exts函数负责处理数据的符号。

我们对比学习这几条指令,理解起来更容易。上面的amomax、amomaxu指令都是把rs1中数据当成地址,把该地址内存单元中的数据读取到rd中,然后与rs2进行比较。最后,把两者之间大的那个数值写入该地址的内存单元中,区别是比较时的数据有无符号。

而amomin、amominu指令则是把rs1中数据当成地址,把该地址内存单元中的数据读取到rd中,然后与rs2进行比较,最后把两者之间小的数值写入该地址的内存单元中。这两个指令的区别同样是比较时的数据有无符号。
                        
参考链接:https://blog.csdn.net/sucaiwa/article/details/129328891

AMO 指令要求整个“读出·计算“写回”过程必须为“ tomic (原子)”性质 所谓原子性质即整个“读出-计 写回”过程必须能够确切完成,在读出和写因之间的间隙,存储器地址不能够被其他的进程访 wen(通常会将总线锁定)。

AMO 令还支持释放一致性模型( Rele ase Consistency Model ), AMO 指令的编码中包含了 aq/rl 编码位,分别表示获取或者释放操作。通过设置不同的编码位,就可以赋予 AMO 指令获取或者释放操作属性。

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

amoswaq rd, rs2, (rsl )指令具有获取属性,能够屏障其之后的所有存储器访问操作

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

•amosw w.aqr rs2, (rs )指令同时具有获取和释放属性,能够屏障其之前和之后的所有存储器访问操作。

对于原子操作可参考AXI协议关于原子操作的解释

对于AtomicLoad,AtomicSwap和AtomicCompare事务,事务结构如下

  • request在AW通道发布
  • 相关事务数据在W通道发送
  • AWLEN决定要发送的写数据的数量
  • 未指定原子事务请求和原子事务数据之间的相对时间
  • 从机使用R通道返回源数据
  • 要读的数据数量由AWLEN和AWATOP信号决定

对于AtomicStore事务,事务结构如下

  • request由AW通道发布
  • 事务相关数据由W通道传输
  • AWLEN决定W通道上要传输的事务数据数量
  • 原子请求和原子数据之间的相对时间不做规定
  • 写响应通过B通道返回。只有在从机收到所有写数据和原子事务结果可观察后,从机才能给出写响应。
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值