dispinterface v_RISC-V "V"(向量)扩展规范v0.9+文档(4)

关于这篇文章:

本文主要翻译自 RISC-V "V"(向量)扩展的官方文档,翻译版本为目前最新版的 RISC-V "V"(向量)扩展规范文档,小部分地方有删减及排版调整。

由于译者水平有限,本文可能存在谬误或不当之处,欢迎指正。

以下为正文(连载中):

8 向量 AMO 操作(Zvamo)

Note: 是否支持向量 AMO 操作在配置文件里说明。预期用于 Unix 的配置文件的基本“ V”扩展需要支持向量 AMO 操作。

如果要支持向量 AMO 指令,则必须存在标量 Zaamo 指令(标准 “A” 扩展的原子操作指令,atomic operations from the standard A extension)。

向量 AMO 指令编码使用标准 AMO 主操作码下未使用的编码。每个活跃元素可以对单个内存位置执行原子性的读、修改、写操作。

vamo-format.adoc

vs2[4:0] specifies v register holding address
vs3/vd[4:0] specifies v register holding source operand and destination
​
vm specifies vector mask
width[2:0] specifies size of index elements, and distinguishes from scalar AMO
amoop[4:0] specifies the AMO operation
wd specifies whether the original memory value is written to vd (1=yes, 0=no)

vs2 向量寄存器保存每个元素的字节偏移量,vs3 向量寄存器为原子操作提供源数据。

除了没有 mew位(假定为零)外,AMO 与索引操作具有相同的索引 EEW 机制,因此偏移量只能有 EEW = 8、16、32、64。vs2 寄存器中字节偏移量的向量添加到 rs1 的基本标量寄存器中,从而得出 AMO 操作的地址。

数据寄存器 vs3 使用动态的 SEW 和 MUL 设置值。

如果 wd 位置1,则用内存元素的初始值写入 vd 寄存器。如果 wd 位清零,则不写入 vd 寄存器。

Note: 如果 wd 值明确的话,内存系统并不需要返回原来的内存值,vd 中的原始值将被保留。

Note: AMOs 可以部分覆盖源数据,从而对于实现寄存器重命名,可以减少总的内存管道读取端口数。同时也是为了支持与向量索引操作相同的寻址模式,并且也是由于主要用途是并行内存减少,向量 AMO 不太需要结果。

相对于同一 hart 中其他指令的排序,向量 AMO 操作就好像每个元素的 aqrl 位均为零。

在同一向量 AMO 指令中的元素操作之间,向量 AMO 不提供任何顺序保证。

0f965dd6215aa51cee264581ad7ac8bc.png
表11. 向量 AMO 宽度编码

注:

索引位(index bits)是指偏移量的 EEW 。

内存位(Mem bits)是指在内存中访问元素的大小。

寄存器位(Reg bits)是指在寄存器中访问的元素的大小。

如果 EEW 小于 XLEN ,则 vs2 中的地址将加零扩展到 XLEN 。如果 EEW 大于 XLEN ,则会引发非法指令异常。

只有 AMO 支持的内存数据元素宽度才支持向量 AMO 指令。其他元素宽度会引发非法指令异常。

向量 amoop[4:0] 字段使用与标量5位 AMO 指令字段相同的编码,只是不支持 LR 和 SC 。

d9ae330571073a0162976bb2d106716f.png
表12. amoop

汇编语法中,目标寄存器位置使用 x0 ,表示不需要返回值( wd=0 )。

# Vector AMOs for index EEW=32
vamoswapei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamoswapei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

vamoaddei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamoaddei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

vamoxorei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamoxorei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

vamoandei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamoandei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

vamoorei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamoorei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

vamominei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamominei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

vamomaxei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamomaxei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

vamominuei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamominuei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

vamomaxuei32.v vd, (rs1), v2, vd,  v0.t # Write original value to register, wd=1
vamomaxuei32.v x0, (rs1), v2, vs3, v0.t # Do not write original value to register, wd=0

9 向量内存对齐约束

如果通过向量内存指令访问的元素没有自然地与内存元素大小对齐,则该元素上会出现地址未对齐异常,或者该元素成功传输。

向量内存访问满足与标量内存访问相同的原子性规则。

10 向量内存一致性模型

向量内存指令似乎按程序顺序在本地HART上执行。向量内存指令在指令级别满足 RVWMO ,并且在指令内对元素操作进行排序,就像由句法独立的标量指令的元素排序序列执行一样。向量索引排序存储将元素按元素顺序写入内存。向量索引无序存储不保留单个向量存储指令中写入的元素顺序。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值