前言
为什么需要向量(矢量)指令集?
一般的处理器都是单指令单数据(SISD),处理数据能力有限。在面向人工智能领域,需要进行大量的矩阵运算、向量运算,已经难以满足计算需求,因此需要提高指令处理效率,一条指令处理多个数据,即SIMD。
SIMD指令和RV扩展的向量指令的区别?
SIMD指令中向量为固定长度,RV-V中的向量长度可由CSR某些位设置,更灵活;
寄存器大小可以设置,固定的寄存器文件空间可由用户自己切割
CPU中SIMD的向量运算如何执行?
图中,v1/v2/v3表示不同的向量寄存器,可以看到,一个向量寄存器可以存放多个元素,同时进入多个ALU中进行运算。
一、概念
VLEN:向量寄存器位宽
ELEN:单个向量元素最大位宽
SEW:一个选定元素位宽
EEW:指令实际操作的有效元素位宽 一般情况SEW=EEW 或EEW=nSEW
LMUL:一个寄存器组中寄存器的个数(要求寄存器中每个元素位宽为SEW,可取分数值,LMUL=1/2,1/4,1/8,1,2,4,8等)
EMUL: 寄存器中元素位宽为EEW时寄存器组中寄存器个数 其中,LMUL/SEW=EMUL/EEW
SEWLMUL1min:LMUL=1时SEW能取得最小值
SEWLMUL1max: LMUL =1时SEW能取到得最大值 一般=VLEN
VLMAX:一条向量指令可以操作的元素最大个数 VLMAX=LMUL×(VLEN/SEW)
field: 由EMUL个寄存器组成的寄存器组
NFIELDS:一个segment的field数量
二、访存向量指令格式
Load:
Store:
均为三种指令格式,分别对应三种寻址方式。
其中,目标寄存器Vd一定是向量寄存器,基址(源寄存器rs1)一定是整型寄存器。
- load指令op为0000111;store指令op为0100111
- width: 数据位宽 与mew共同决定了EEW的大小
- mew:width的扩展字段
- mop:寻址方式 00:单元步幅 01:乱序index 10:恒定步幅 11:顺序index
- vm:是否使用掩码
- nf:用于segment模式下field大小
指令汇编形式:
- vle/vse+bit.v vd/vs3, (rs1) :单元步幅连续寻址 rs1内的地址每次按一个元素位宽(字节为单位)增加
- vlse/vsse+bit.v vd/vs3, (rs1), rs2, vm : 恒定步幅连续寻址 rs2中存储的是有符号步幅增量
- vluxei/vluxei+bit.v vd/vs3, (rs1), vs2, vm: 乱序index索引寻址 vs2中存储的是地址偏移量 vd/vs3中为参与访存的数据
三、寻址方式
- 单元步幅连续寻址
访存数据的地址每次顺序递增。扩展模式由lumop/sumop[4:0]决定。
lumop:
- 00000: 单元步幅Load
- 01000: 单元步幅,全寄存器load
- 01011: 单元步幅,掩码load,EEW=8
- 10000: 单元步幅,FOF 仅错误优先load
sumop:
- 00000: 单元步幅store
- 01000:单元步幅,全寄存器Store
- 01011: 单元步幅,掩码Store,EEW=8
1) 掩码load/store
将目标寄存器中数据作为掩码
EEW=8
2)FOF Load模式
若load元素为0,响应异常且vl不变
若load其他元素,不响应异常,vl更新为出现异常的元素的index
对于外部中断,响应中断,将vstart设置为中断位置元素的index值
3)全寄存器load/store
读写整个向量寄存器组。load指令EEW由mew+width决定;store指令EEW=8bit
该模式主要应用于对当前寄存器组内存储内容的格式或有效长度未知的场景,为防止遗漏或造成错误则对整个寄存器组进行访存操作;或者应用于想对寄存器组内更多的数据进行访存操作但vl和vtype不方便修改的场景,例如中断保存以及断点恢复等。
- 恒定步幅连续寻址
访问内存是无序的,可前进可后退。
*若rs2=x0,则访存操作次数可少于目标寄存器的有效元素个数
若rs2=0,则必须对目标寄存器组的每一个有效元素都执行一次访存操作,依旧是无序的
- index索引寻址
需要对vs2[i]进行位宽扩展或者位宽截取
四、Segment模式访存
将向量寄存器整合成一个向量寄存器组(segment),一个Segment里有n个field。也分为以上三种寻址方式
- 单元步幅连续寻址
vl/sseg(nf)e(eew).v vd/vs3, (rs1),vm
eg: vlseg4e16.v vd, (rs1),vm : 将mem[rs1]~mem[rs1+7]4个16bit的数据分别存储在vd~vd+3的元素0位置,依次类推;
vsseg5e8.v vs3, (rs1), vm: 将vs3~vs3+4中的元素0的5byte数据存储在内存中mem[rs1]~mem[rs1+4]的位置,以此类推。
- 恒定步幅连续寻址
- index索引寻址
思考:第一个例子中,地址为何不是+4?
五、向量指令相关CSR
共七个CSR,vstart、vxsat、vxrm、vcsr、vl、vtype、vlenb,宽度均为XLEN,与RISC-V其他指令集对应的CSR统一编址
- vtype
指示元素在向量寄存器中如何排布,以及向量寄存器组中寄存器的构成,只读(可用vset(i)vl(i)更新)
- vl
- 向量长度寄存器,表示寄存器中向量个数,只读。
- 若vl=0或vstart>=vl则没有元素参与指令执行或者说向量指令不执行。
- vl由指令vsetvl赋值,vl=min(AVL, VLMAX) VLMAX=vsew×vlmul AVL 为待处理的元素的个数
- vlenb
值固定为VLEN/8,只读
- vstart
- 指示源寄存器中第一个被执行的向量元素的index,可读可写。
- 任何向量指令及其相关指令执行完都会被清零
- 目标寄存器中index=vstart的元素会被指令更新
- 也可做中断断点状态记录,记录发生同步异常或者外部异常中断时正在执行元素的index
- vxrm
- 规定向量定点舍入模式,只有低2bit为有效位,有符号无符号均满足相同的舍入方式,可读可写
- 低d bit位为舍入位,则结果为:(v>>d)+r v>>d表示截掉d的部分
分别指四舍五入,向最近的偶数舍入,向下舍入,向奇数舍入
- vxsat
向量定点饱和标志,用来表示是否产生饱和结果,只有最低位有效,可读可写
- vcsr
可配置vxrm、vxsat
今天的文章RISC-V V向量指令集学习笔记——访存指令分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81796.html