网站服务器计算机安全的措施,做论坛app网站,网络推广话术开场白,秦皇岛网站搜索排名1. 引言
以下是《riscv-v-spec-1.0.pdf》文档的关键内容#xff1a; 这是一份关于向量扩展的详细技术文档#xff0c;内容覆盖了向量指令集的多个关键方面#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量… 1. 引言
以下是《riscv-v-spec-1.0.pdf》文档的关键内容 这是一份关于向量扩展的详细技术文档内容覆盖了向量指令集的多个关键方面如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量算术指令格式、向量整数和浮点算术指令、向量归约操作、向量掩码指令、向量置换指令、异常处理以及标准向量扩展等。 首先文档定义了向量元素和向量寄存器状态之间的映射关系并阐述了向量指令的格式。在此基础上提出了配置设置指令如vsetvl、ivsetiv和vlsetvl用于设定向量长度VL和向量对齐长度AVL。 接着文档详细说明了向量加载和存储操作以及向量内存对齐和一致性模型。这些模型确保了向量操作的高效性和准确性。 然后文档介绍了向量算术指令格式包括向量整数、固定点和浮点算术指令。这些指令支持广泛的数学运算为高性能计算提供了强大的支持。 此外文档还涉及向量归约操作、掩码指令和置换指令这些指令增强了向量操作的灵活性和功能性。 最后文档讨论了异常处理机制并列举了标准向量扩展指令列表。这些扩展指令为向量处理器提供了丰富的功能集使其能够适应不同的应用场景和性能需求。 综上所述这份文档为向量指令集的设计和实现提供了全面的指导和参考有助于开发者更好地理解和利用向量处理器的能力。
【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型-CSDN博客
【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(二)-向量元素到向量寄存器状态的映射-CSDN博客【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(三)-向量指令格式-CSDN博客 6 配置和设置指令(vsetvli/vsetivli/vsetvl)
处理大量元素的一种常见方法是“stripmining”在这种方法中每次循环迭代都会处理一定数量的元素迭代会一直持续到所有元素都被处理完毕。RISC-V向量规范为这种方法提供了直接、可移植的支持。应用程序将待处理的元素总数应用程序向量长度或AVL指定为vl的候选值硬件则通过一个通用寄存器响应根据微架构实现和vtype设置提供每次迭代中硬件将处理的通常更小的元素数量存储在vl中。一个简单的循环结构如stripmining示例和SEW的更改所示描绘了代码如何轻松地跟踪剩余的元素数量和硬件每次迭代处理的数量。
提供了一组指令以便根据应用程序需要快速配置vl和vtype中的值。vset{i}vl{i}指令根据其参数设置vtype和vl CSR并将vl的新值写入rd。 vsetvli rd, rs1, vtypei # rd new vl, rs1 AVL, vtypei new vtype setting
vsetivli rd, uimm, vtypei # rd new vl, uimm AVL, vtypei new vtype setting
vsetvl rd, rs1, rs2 # rd new vl, rs1 AVL, rs2 new vtype valueFormats for Vector Coniguration Instructions under OP-V major opcode
6.1 vtype 编码
Table 7. vtype register layout Bits Name Description XLEN-1 vill Illegal value if set XLEN-2:8 0 Reserved if non-zero 7 vma Vector mask agnostic 6 vta Vector tail agnostic 5:3 vsew[2:0] Selected element width (SEW) setting 2:0 vlmul[2:0] Vector register group multiplier (LMUL) setting 新的vtype设置被编码在vsetvli和vsetivli的立即字段中以及vsetvl的rs2寄存器中。 Suggested assembler names used for vset{i}vli vtypei immediate
e8 # SEW8b
e16 # SEW16b
e32 # SEW32b
e64 # SEW64b
mf8 # LMUL1/8
mf4 # LMUL1/4
mf2 # LMUL1/2
m1 # LMUL1, assumed if m setting absent
m2 # LMUL2
m4 # LMUL4
m8 # LMUL8
Examples:
vsetvli t0, a0, e8 # SEW 8, LMUL1
vsetvli t0, a0, e8, m2 # SEW 8, LMUL2
vsetvli t0, a0, e32, mf2 # SEW32, LMUL1/2vsetvl变体的工作方式与vsetvli类似只不过它从rs2中获取vtype值并可用于上下文恢复。 如果实现不支持vtype设置则在vtype中设置vill位vtype中的其余位设置为零vl寄存器也设置为零。 早期的草案要求在设置vtype为非法值时产生陷阱。但是这会在ISA的CSR写入上增加第一个数据相关的陷阱。实现可以选择在将非法值写入vtype时设置陷阱而不是设置vill以允许仿真支持新的配置以实现向前兼容性。当前方案支持通过检查给定设置是否清除了vill对支持的向量单元配置进行轻量级运行时查询。 6.2 AVL 编码
新的向量长度设置基于AVL对于vsetvli和vsetvlAVL在rs1和rd字段中的编码如下
Table 8. AVL used in vsetvli and vsetvl instructions rd rs1 AVL value Effect on vl - !x0 Value in x[rs1] Normal stripmining !x0 x0 ~0 Set vl to VLMAX x0 x0 Value in vl register Keep existing vl (of course, vtype may change)
当rs1不是x0时AVL是存储在由rs1指定的x寄存器中的无符号整数新的vl值也将写入由rd指定的x寄存器。
当rs1x0但rd!x0时使用最大的无符号整数值(~0)作为AVL并将结果VLMAX写入vl以及由rd指定的x寄存器。
当rs1x0且rdx0时指令的操作就像是将vl中的当前向量长度用作AVL并将结果值写入vl但不写入目标寄存器。这种形式只能在VLMAX因此vl实际上没有因新的SEW/LMUL比率而改变时使用。如果使用新的SEW/LMUL比率会导致VLMAX发生变化则保留该指令的使用。在这种情况下实现可能会设置vill。
这种指令的最后一种形式允许在保持当前vl的同时更改vtype寄存器前提是VLMAX没有减少。这种设计是为了确保vl始终为当前的vtype设置持有合法值。当前的vl值可以从vl CSR中读取。如果新的SEW/LMUL比率导致VLMAX缩小则此指令可能会减少vl值因此这种情况已被保留因为这并不清楚这是一个普遍有用的操作而且实现可以假设此指令不会更改vl以优化其微架构。
对于vsetiv li指令AVL在rs1字段中编码为5位零扩展立即数0-31。
请注意vsetiv li的AVL编码与常规CSR立即数值的编码相同。
当向量寄存器内部向量的维度较小且已知时vsetiv li指令可以提供更紧凑的代码在这种情况下没有stripmining开销。
6.3 设置vl的约束
The vset{i}vl{i} instructions irst set VLMAX according to their vtype argument, then set vl obeying the following constraints:
1. vl AVL if AVL ≤ VLMAX
2. ceil(AVL / 2) ≤ vl ≤ VLMAX if AVL (2 * VLMAX)
3. vl VLMAX if AVL ≥ (2 * VLMAX)
4. Deterministic on any given implementation for same input AVL and VLMAX values
5. These speciic properties follow from the prior rules:
a. vl 0 if AVL 0
b. vl 0 if AVL 0
c. vl ≤ VLMAX
d. vl ≤ AVL
e. a value read from vl when used as the AVL argument to vset{i}vl{i} results in the same value in vl, provided the resultant VLMAX equals the value of VLMAX at the time that vl was read
vl的设置规则被设计为足够严格以保持vl在寄存器溢出和上下文交换时的行为当AVL VLMAX时同时又足够灵活使实现能够提高向量通道利用率当AVL VLMAX时。
例如这允许实现在VLMAX AVL 2 * VLMAX时设置vl ceil(AVL / 2)以便在stripmine循环的最后两次迭代中均匀分配工作。要求2确保即使在AVL 2 * VLMAX的情况下归约循环的第一次stripmine迭代也使用所有迭代中的最大向量长度。这使得软件无需显式计算在stripmined循环期间观察到的向量长度的运行最大值。要求2还允许实现在VLMAX AVL 2 * VLMAX时将vl设置为VLMAX。
6.4 举例 SEW和LMUL设置可以动态更改以在单个循环中的混合宽度操作上提供高吞吐量。 # Example: Load 16-bit values, widen multiply to 32b,shift 32b result
# right by 3, store 32b values.
# On entry:
# a0 holds the total number of elements to process
# a1 holds the address of the source array
# a2 holds the address of the destination array
loop:
vsetvli a3, a0, e16, m4, ta, ma # vtype 16-bit integer vectors;# also update a3 with vl (# of elements this iteration)vle16.v v4, (a1) # Get 16b vector
slli t1, a3, 1 # Multiply # elements this iteration by 2 bytes/source element
add a1, a1, t1 # Bump pointer
vwmul.vx v8, v4, x10 # Widening multiply into 32b in v8--v15
vsetvli x0, x0, e32, m8, ta, ma # Operate on 32b values
vs rl.vi v8, v8, 3
vse32.v v8, (a2) # Store vector of 32b elements
slli t1, a3, 2 # Multiply # elements this iteration by 4 bytes/destination element
add a2, a2, t1 # Bump pointer
sub a0, a0, a3 # Dec rement count by vl
bnez a0, loop # Any more?