RISC-V "V"(向量)扩展规范v0.9+文档(1)
本帖最后由 sky 于 2020-9-28 16:09 编辑RISC-V "V"(向量)扩展规范v0.9+文档(1)RISC-V "V"(向量)扩展规范v0.9+文档(2)RISC-V "V"(向量)扩展规范v0.9+文档(3)RISC-V "V"(向量)扩展规范v0.9+文档(4)RISC-V "V"(向量)扩展规范v0.9+文档(5)
关于这篇文章:
本文主要翻译自 RISC-V "V"(向量)扩展的官方文档,翻译版本为目前最新版的 RISC-V "V"(向量)扩展规范文档,小部分地方有删减及排版调整。
由于译者水平有限,本文可能存在谬误或不当之处,欢迎指正。
以下为正文(连载中):
1 引言
本文档草案介绍了 RISC-V 基本向量扩展,以及一些对于基本向量扩展的初始扩展的草案,描述了基本向量扩展的所有特性。
本草案的目的在于描述如何将特定的向量功能实现为向量指令,但对于给定的平台配置文件,不会说强制执行哪些向量指令集。
基本向量扩展一词用来非正式地描述“V”扩展所需的向量ISA组件的标准集合,该扩展可以用于标准服务器和应用程序处理器平台配置文件。 其他平台,包括嵌入式平台,可以选择实现这些扩展的子集。基本向量扩展旨在用作各种领域(包括密码学和机器学习)中其他向量扩展的基础。
Note:基本“ V”扩展中要包含的指令集或者不包含的指令集尚未确定,所有向量指令子集及扩展的命名也尚未确定。
2 常量参数的定义
每个支持向量扩展的 hart 都有三个参数的定义:
1.单个向量元素的最大长度ELEN (以bit为单位,下同),要求 ELEN ≥ 8,并且必须为2的幂。
2.向量寄存器的位数VLEN,要求VLEN ≥ ELEN,并且必须是2的幂。
3.分段距离(The striping distance in bits)SLEN,要求必须为VLEN ≥ SLEN ≥ 32,并且必须为2的幂。
Note:可以在平台配置文件上给这些参数设置其他约束,例如,要求 ELEN ≥ max(XLEN,FLEN),或要求最小 VLEN 值,或设置 SLEN 值,或要求 SLEN = VLEN。
Note:有一种提议是允许 ELEN 随着 LMUL 变化,这样的话,会使得不一定满足 VLEN≥ELEN 。
ISA 支持编写二进制代码,在某些约束下,这些代码可以在具有这些不同参数值的 harts 上执行。
3 向量扩展的编程模型
在基本标量 RISC-V ISA 的基础上,向量扩展增加了32个向量寄存器,和7个非特权CSRs(vstart,vxsat,vxrm,vcsr, vtype,vl,vlenb)。
表1. 新增向量 CSRs
3.1 向量寄存器
在基本标量 RISC-V ISA 的基础上,向量扩展增加了32个向量寄存器,v0-v31 。每个向量寄存器的位宽都是固定的 VLEN 位。
Note: Zfinx(“ F in X”)选项正在考虑中,其中浮点指令从整数寄存器文件中获取其参数。 0.9版本向量扩展也与此选项兼容。
3.2 mstatus中的向量上下文状态
向量上下文状态字段 VS , 添加于 mstatus 字段并隐藏于 sstatus 字段中(这点不同于 v0.8 )。VS 的定义类似于浮点上下文状态字段的定义 FS 。
当 VS 字段被设置为 Off ,试图执行任何向量指令,或访问向量CSRs时,会引发非法指令异常。
当 VS字段被设置为 Initial 或 Clean ,执行更改向量状态的指令,包括向量 CSRs 指令,会使VS字段变为 Dirty 。
Note: 即使向量状态没有发生变化,我们也可以随时将 VS字段更改为 Dirty 。准确设置 VS 字段是一种优化。
3.3 向量类型寄存器,vtype
向量数据类型寄存器,vtype 是一个只读、位宽为XLEN 的 CSR 寄存器,vtype提供用于解释向量寄存器文件内容的默认类型,并且只能通过vsetvl{i}指令进行更新。向量类型还决定了每个向量寄存器中元素的排布,以及如何对多个向量寄存器进行分组。
Note: 较早的草案允许使用常规 CSR 写操作来写入vtype寄存器。只能通过vsetvl{i}指令进行更新可以简化对vtype寄存器状态的维护。
在基本向量扩展中,vtype寄存器具有5个字段,vill,vma, vta, vsew 和vlmul 。vtype-format详情
Note: 支持 ELEN = 32 的最小基本实现只要求在vtype中七位存储,其中 ma和ta需要两位,vsew 需要两位,vlmul 则需要三位。 可以使用vsew 中的非法64位组合对vill表示的非法值进行编码,这样就不需要额外的位置存储 vill。
Note: 基本向量扩展的进一步标准和自定义扩展将扩展这些字段以支持更多种数据类型。
Note: 预计扩展的64位指令编码可以在指令编码时静态指定这些字段。
3.3.1 向量标准元素宽度 vsew
变化的标准元素宽度(SEW, standard element width)值通过vsew中的值设置。默认情况下,向量寄存器被视为分成 VLEN / SEW 个标准宽度元素。
Note: 在基本向量“ V”扩展中,SEW 最大可达ELEN = max(XLEN,FLEN)。其他平台可能会对 ELEN 施加不同的约束。
表2. vsew (标准元素宽度)编码
表3. VLEN = 128位时的示例
3.3.2 向量寄存器分组 vlmul
多个向量寄存器可以分成一组,以便单个向量指令可以对多个向量寄存器进行操作。本文使用向量寄存器组来指代一个或多个向量寄存器,用作向量指令的单个操作数。在向量长度与标准宽度元素相同的情况下,使用向量寄存器组可以操作双倍宽度或更大的元素。向量寄存器组具有更高的执行效率。
向量长度乘数 LMUL 大于1时,代表向量寄存器的默认数量,这些向量寄存器组合在一起形成向量寄存器组。LMUL 的整数值可以为1,2,4,8。
LMUL 也可以是一个小数值,从而减少了向量寄存器中使用的位数。LMUL 的分数值可以为1 / 2、1 / 4、1 / 8。分数形式的 LMUL 因为不需要较大宽度的向量占用多个向量寄存器,用于操作混合宽度值时,可以增加可用的体系结构寄存器的数量。(较宽的值可以占用单个向量寄存器,较窄的值占用向量寄存器的一部分。)
考虑到 LMUL = 1 时的ELEN 值,以及LMUL≥SEW / ELEN,所以实现向量扩展必须支持LMUL 分数形式。当设置不合适的 SEW 和 LMUL 值时会同时设置vtype中的vill位。
Note: LMUL≥SEW / ELEN使得软件可以仅使用单个向量寄存器来保存最宽(ELEN)的元素,而分数形式的 LMUL 用于在混合宽度元素上运行时用于保存较窄的元素。如果LMUL <SEW / ELEN ,则因为VLEN = ELEN合法,于是不能保证在分数形式的向量寄存器中有足够的位来存储至少一个元素。
LMUL 由 vtype中的有符号vlmul字段设置,(LMUL = 2^(vlmul)。
VLMAX = LMUL * VLEN / SEW得出的值表示在给定当前 SEW 和 LMUL 设置的情况下,可以使用单个向量指令操作的最大元素数,如下表所示。
当LMUL = 2时,向量寄存器组包含向量寄存器 https://www.zhihu.com/equation?tex=v_%7Bn%7D 和向量寄存器 https://www.zhihu.com/equation?tex=v_%7Bn%2B1%7D ,支持向量长度(以位为单位)的两倍。指定向量寄存器组包含奇数个向量寄存器的话将引发非法指令异常。
当LMUL = 4时,向量寄存器组包含四个向量寄存器,并且向量寄存器组中向量寄存器的数量要为4的倍数,否则将引发非法指令异常。
当LMUL = 8时,向量寄存器组包含八个向量寄存器,并且向量寄存器组中向量寄存器的数量要为8的倍数,否则将引发非法指令异常。
掩码寄存器总是包含在单个向量寄存器中,与LMUL无关。
3.3.3 vta和vma(Vector Tail Agnostic and Vector Mask Agnostic)
这两位元素值在执行向量指令期间分别修改了目标尾部元素(Tail Elements)和非活跃的掩码元素(Inactive masked-off Elements)的行为。
所有系统都必须支持下面四个选项:
当将一个集合标记为undisturbed时,任何向量或掩码目标操作数中的相应目标元素集将保留其先前持有的值。
当一个集合被标记为agnostic时,任何向量或掩码目标操作数中的相应目标元素集可以保留其先前持有的值,或被1覆盖。在单个向量指令中,每个目标元素可以任意组合保持原状或以1覆盖,并且当使用相同的输入执行指令时,不需要确定undisturbed或以1覆盖的模式。
Note: agnostic策略被添加到具有向量寄存器重命名的机器中或具有深度时间向量寄存器的机器中。如果采用undisturbed策略,则必须从旧的物理目标向量寄存器中读取所有元素,然后将其复制到新的物理目标向量寄存器中。当这些无效值或尾部值不需要用于后续计算时,这种策略会导致效率低下。
Note: 这样做的目的是:在各个集合中的值无关紧要时,软件能通过选择agnostic策略来减少微体系结构工作。
Note: 全1作为覆盖值而不是全0作为覆盖值,是防止软件开发人员依赖于写入的值。
Note:一个简单的有序实现可以忽略这两位的设置,只需使用undisturbed策略执行所有矢量指令即可。处于兼容性及支持线程迁移考虑,vta和vma状态位仍然位在vtype中。
Note: 乱序实现可以选择使用tail-agnostic+mask-undisturbed来实现tail-agnostic+mask-agnostic以降低实现复杂性。
汇编语法向vsetvli指令添加了两个标志:
ta # Tail agnostic
tu # Tail undisturbed
ma # Mask agnostic
mu # Mask undisturbed
vsetvli t0, a0, e32,m4,ta,ma # Tail agnostic, mask agnostic
vsetvli t0, a0, e32,m4,tu,ma # Tail undisturbed, mask agnostic
vsetvli t0, a0, e32,m4,ta,mu # Tail agnostic, mask undisturbed
vsetvli t0, a0, e32,m4,tu,mu # Tail undisturbed, mask undisturbed
3.3.4 向量类型非法vill
vill位用于编码先前的vsetvl{i} 指令试图向vtype写入不支持的值。
Note: vill位保留在 CSR 的 XLEN-1 位中。
如果vill位置1,则执行依赖于vtype的指令会引发非法指令异常。
Note: vsetvl{i}以及整个寄存器的加载,存储和移动都不依赖vtype。
当vill位置1时,其他 XLEN-1 位的vtype值应为零。
3.4 向量长度寄存器vl
XLEN 位宽的只读 vl CSR 只能通过vsetvli和vsetvl指令进行更新。
vl寄存器保存一个无符号整数,即要通过向量指令更新的元素数。在执行向量指令期间,任何目标索引 ≥ vl的目标向量寄存器组中的元素都不会被修改。当vstart≥ vl,任何目标向量寄存器组中的元素都不会被修改。
Note:当vl= 0 时,无论vstart怎样,任何目标向量寄存器组中的元素都不会被修改。
Note: 即使当vstart≥ vl时,写标量整数或浮点寄存器的指令也可以执行。
Note: vl位数取决于最小支持类型的最大向量长度。最小的向量实现(RV32IV)至少需要六位vl才能容纳 0-31 的值(VLEN = 32,LMUL = 8和SEW = 8,因此VLMAX为32)。
3.5 向量长度寄存器vlen
XLEN 位宽的只读向量长度 CSR vlenb保存值 VLEN / 8,即向量寄存器长度(以字节为单位)。
Note:vlen的值是设计时常数。
Note: 如果没有vlenb,则需要好几条指令才能以字节为单位计算 VLEN,并且代码还必须牵扯到vl和vtype 的设置(需要保存和恢复它们)。
3.6 向量起始索引CSRvstart
vstart是一个可读可写的CSR寄存器,指定向量指令要执行的第一个元素的索引。
通常,vstart只有在向量指令陷入时被硬件写入,同时vstart值表示在其上执行陷入指令的元素(同步异常或异步中断),并且在处理可恢复陷入指令后,应恢复执行操作。
所有向量指令都定义为从vstartCSR 中给定的元素编号开始执行,并在执行结束时将vstart CSR重置为零。
Note: 所有向量指令(包括vsetvl{i})都可以将vstart CSR 重置为零。
vstart 不会被引发非法指令异常的向量指令修改。
对于通过vl设置元素数量的指令,如果vstart寄存器中的值大于或等于向量长度vl,则不执行任何元素操作,然后 vstart 寄存器被重置为零。
vstartCSR 被定义为仅有足够的可写位来保存最大元素索引( VLMAX-1 或 lg2(VLEN) bits ),
Note: 最大向量长度是通过最大LMUL(8)和最小SEW(8)得到的,因此VLMAX_max = 8 VLEN / 8 = VLEN。例如,对于 VLEN = 256,vstart有8位表示0到255之间的索引。
vstart CSR可由非特权代码写入,但非零的vstart值可能会导致向量指令在某些实现上运行速度大大减慢,因此vstart不应由应用程序员来使用。一些向量指令不能用非零的vstart值执行,不然会引发下面定义的非法指令异常。
当尝试执行一条向量指令,其vstart值是不可能产生的值(以相同vtype设置执行同一条指令时永远不会产生的值)时,可以引发非法指令异常。Note: 例如,某些实现在执行向量算术指令期间将永远不会执行中断,而是等到指令完成才执行中断。当尝试执行vstart非零向量算术指令时,可以引发非法指令异常。
3.7 向量定点舍入模式寄存器vxrm
向量定点舍入模式寄存器(The vector fixed-point rounding-mode register)包含一个两位的读写舍入模式字段。向量定点舍入模式分配了单独的 CSR 地址以允许独立访问,同时也表现在vcsr字段中。
定点舍入算法如下。假设预舍入结果为v,d位结果被舍入。然后,舍入结果为(v >> d) + r,其中r取决于下表中指定的舍入模式。
表4. vxrm编码
舍入功能函数:
roundoff_unsigned(v, d) = (unsigned(v) >> d) + r
roundoff_signed(v, d) = (signed(v) >> d) + r
位应写为零。
Note: 舍入模式可以用一条csrwi指令设置。
3.8 向量定点饱和标志vxsat
该vxsatCSR保存一个读写位,表示定点指令是否必须使输出值饱和,以此适应目标格式。
该vxsat位也表现在vcsr中。
3.9 向量控制和状态寄存器vcsr
vxrm和vxsat可以通过单独CSR来实现,也可以通过向量控制和状态寄存器CSRvcsr来访问。
表5. vcsr layout
3.10 复位时向量扩展的状态
向量扩展名在复位时必须具有一致的状态。特别地,vtype和vl的值,一定可以通过一条vsetvl指令读取以及恢复。
Note: 建议在复位时设置vtype.vill,vtype其余的位为零,vl也设置为零。
vstart,vxrm,vxsatCSRs可以在复位时具有任意值。
Note: 使用向量需要一个初始值vsetvl{i},这个值将复位vstart。使用之前vxrm,vxsat字段应在软件中重置。
向量寄存器在复位时可以具有任意值。
完
页:
[1]