🧩 一、RV32V 是什么?
| 名称 |
含义 |
| RV32V |
RISC-V 32 位向量指令集扩展 |
| 全称 |
RISC-V Vector Extension v1.0 (RVV) |
| 核心思想 |
一条指令可并行处理多个数据(SIMD / 数据并行) |
| 目标场景 |
AI 推理、DSP、图像处理、矩阵乘法、科学计算、视频编解码 |
⚙️ 二、RVV 的关键理念:可变长度向量(VLA — Vector Length Agnostic)
传统 SIMD(如 ARM NEON、AVX)固定向量长度(128 位、256 位…)。
而 RISC-V 采用 可变长度向量架构,用参数 VLEN 来定义实际硬件宽度。
| 概念 |
含义 |
| VLEN |
实际硬件向量寄存器宽度(如 128、256、512 位) |
| SEW |
元素宽度(Standard Element Width,8/16/32/64 bit) |
| VL |
当前向量长度(Vector Length,运行时可变) |
| LMUL |
向量寄存器倍宽系数(可合并多个寄存器) |
💡 举例:
如果 VLEN = 128bit,而 SEW = 32bit,
则一个向量寄存器可同时存放 4 个元素。
而在另一段代码中,SEW 可以变成 8bit,从而存放 16 个元素。
这让 RVV 程序可 自适应硬件,跨平台兼容。
🧮 三、向量寄存器结构
| 寄存器 |
数量 |
宽度 |
功能 |
| v0–v31 |
32 个 |
VLEN 位 |
向量通用寄存器 |
| vtype |
1 个 |
32 位 |
控制 SEW、LMUL、符号类型 |
| vl |
1 个 |
32 位 |
当前向量长度 |
| vstart |
1 个 |
32 位 |
指令起始索引(用于异常恢复) |
⚡ 四、向量指令结构
所有 RVV 指令都以 v 开头,例如:
| 指令类别 |
示例 |
功能 |
| 向量算术 |
vadd.vv v1, v2, v3 |
向量加法:v1[i] = v2[i] + v3[i] |
| 向量立即数 |
vadd.vi v1, v2, 5 |
向量 + 立即数 |
| 向量减法 |
vsub.vv v1, v2, v3 |
向量减法 |
| 向量乘法 |
vmul.vv v1, v2, v3 |
向量乘法 |
| 向量比较 |
vmax.vv, vmin.vv, vmseq.vv |
比较结果写布尔掩码 |
| 向量逻辑 |
vand.vv, vor.vv, vxor.vv |
位运算 |
| 向量装载 |
vle32.v v1, (a0) |
从内存加载 32 位元素到向量 |
| 向量存储 |
vse32.v v1, (a1) |
向量写回内存 |
| 向量缩放 |
vdiv.vv, vrem.vv |
除法、取余 |
| 向量归约 |
vredsum.vs, vredmax.vs |
所有元素求和/最大值 |
| 向量掩码 |
vmand.mm, vmxor.mm |
布尔掩码逻辑 |
| 向量设置 |
vsetvli a0, a1, e32, m1 |
设置当前向量配置(SEW/LMUL/VL) |
🧱 五、关键控制指令:vsetvli
| 参数 |
含义 |
t0 |
设置后的实际 VL |
a0 |
想要处理的元素数量 |
e32 |
元素宽度(SEW=32bit) |
m1 |
LMUL 倍宽系数(1 倍) |
👉 执行后,CPU 根据硬件 VLEN 自动确定每次能并行多少个元素,
VL 寄存器会记录本次循环实际可处理数量。
程序员不用关心具体寄存器宽度,代码可跨不同实现运行。
💡 六、向量加法示例
C 代码:
for (int i = 0; i < n; i++)
c[i] = a[i] + b[i];
对应 RISC-V 向量汇编:
loop:
vsetvli t0, a0, e32, m1 # 设置SEW=32位
vle32.v v1, (a1) # 加载 a[]
vle32.v v2, (a2) # 加载 b[]
vadd.vv v3, v1, v2 # 向量加法
vse32.v v3, (a3) # 存回 c[]
addi a1, a1, t0*4 # 移动指针
addi a2, a2, t0*4
addi a3, a3, t0*4
sub a0, a0, t0
bnez a0, loop
✅ 自动适配硬件:
如果是 128bit VLEN → 一次算 4 个;
如果是 512bit → 一次算 16 个;
同一段代码无需修改!
📊 七、RVV 性能特点
| 特性 |
RVV 设计 |
| 向量长度 |
可变(VLEN 自适应) |
| 可移植性 |
强(同一代码可在不同实现上运行) |
| 计算能力 |
一条指令可操作 2–64 个元素 |
| 典型用途 |
AI、信号处理、矩阵运算、图像滤波 |
| 常见组合 |
RV32IMFV(含整数 + 浮点 + 向量) |
🔍 八、RVV 的版本与支持
| 版本 |
状态 |
特点 |
| 0.7.1 |
实验阶段 |
早期版本 |
| 1.0(2021 年发布) |
✅ 正式标准 |
当前主流版本 |
| 实现芯片 |
阿里平头哥 C910、C908、SiFive V-series、StarFive JH7110、Andes AX45MP V 等 |
|
🧠 九、RVV + AI 实战应用
- 向量化卷积(Convolution)
- 向量化激活函数(ReLU、Sigmoid)
- 矩阵乘法(GEMM)
- FFT / DCT / DSP 运算
- 神经网络推理中 SIMD 加速
🧩 十、小结
| 项目 |
RV32V 特性 |
| 名称 |
向量扩展(Vector Extension) |
| 寄存器 |
v0–v31,每个宽 VLEN 位 |
| 指令风格 |
vxxx.vv / vxxx.vi / vxxx.vx |
| 向量控制 |
vsetvli 指令设置 SEW/LMUL/VL |
| 可移植性 |
运行时自适应 VLEN |
| 优势 |
高性能、可移植、通用 SIMD |
| 典型组合 |
RV32IMFV / RV64GCV |