VID.V

RISC-V VID.V 指令详解

指令手册R-type

把每个活动元素的元素索引 i 写入目标整数向量 vd;索引值按当前 SEW 宽度写入。

指令语法

vid.v vd, vm
操作数说明
vd:目标向量寄存器组。
vs2/vs1 或标量源:按指令后缀 .vv/.vx/.vi/.vf 决定来源。
vm:若语法包含 vm,vm=0 使用 v0 作为执行掩码,vm=1 为未掩码。
V向量重排/索引置换

指令行为说明

VID.V 是 RISC-V V 扩展的元素索引生成指令。对每个活动 body 元素 i,它把无符号元素编号 i 写入 vd[i];vm=0 时只更新 v0.t 选中的元素,vm=1 时更新 vl 范围内的所有 body 元素。该指令不读取内存,也不读取普通源向量。

VID.V 指令解析与执行动画

从 OP-V 编码字段开始,展示 VID.V 如何不读取源向量,直接把 active lane 的元素编号写入整数向量。

输入的指令
vid.v
reserved
vs2=00000
语法无源向量
source
不读取源向量
VID.V 只使用 lane 编号
OP-V encodingfunct6 | vm | vs2=00000 | vs1=10001 | funct3 | vd | opcode
funct6
010100
vm
0
vs2(res)
00000
vs1
10001
funct3
010
vd
01100
opcode
1010111
lane
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
v0.t
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
scan
0
off
2
3
4
5
off
7
8
9
10
off
12
13
14
15
v12
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
当前步骤

显示 OP-V 32 位编码字段

vid.v 使用 OP-V 编码;vs1 字段固定为 10001,vs2 字段也固定为保留值 00000。

动画只展示官方 V 扩展定义的 ISA 可见关系:OP-V 字段解析、vl 内 active mask bit 扫描、目标整数向量写回;不模拟流水线、缓存或执行时延。

快速理解与检索要点

VID.V 是“按 lane 号填充”的向量索引生成器:活动 lane i 写入 i,关闭的 lane 不产生确定写回。

官方语法为 `vid.v vd, vm`;OP-V VMUNARY0 编码使用 `funct6=010100`、`funct3=010`、`vs1=10001`,并要求保留的 `vs2` 字段为 `00000`。
对每个 active body 元素 i,结果为元素编号 i;结果按当前 SEW 宽度写入目标整数向量元素。
vm=0 时使用 v0.t 作为执行掩码;v0.t=0 的元素不参与写回,不能把它理解为写入 0。
该指令不读取普通源向量或内存,常用于为 gather、scatter、compress 或条件选择构造元素索引。

向量执行上下文

阅读 VID.V 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。后缀和操作数形式决定源操作数来自向量、标量还是立即数。

先看 vl

当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。

再看 vtype

当前 vtype 提供 SEW、LMUL、tail policy 和 mask policy;这些规则影响元素宽度、寄存器组大小以及非活动/尾部目标元素。

最后看 vm/v0

带 vm 的普通向量指令在 vm=0 时用 v0 作为执行掩码,vm=1 表示未掩码。VMERGE 等少数形式会把 v0 当作数据选择输入。

官方来源:RISC-V V Standard Extension for Vector Operations

常见使用场景

序列生成

结合 «vsetvli t0, a0, e32, m1, ta, ma vid.v v1, v0.t # active vd[i] = i» 等实际代码理解该场景。

循环计数器

结合 «vsetvli t0, a0, e32, m1, ta, ma vid.v v1, v0.t # active vd[i] = i» 等实际代码理解该场景。

用作gather索引

结合 «vsetvli t0, a0, e32, m1, ta, ma vid.v v1, v0.t # active vd[i] = i» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 R-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

VID.V 生成的是元素编号 0,1,2,...,不是字节偏移、内存地址或寄存器组内的字节位置。
语法只有 vd 和可选 vm;编码中的 vs2 字段为保留字段,不是可编辑源向量操作数。
vm=0 时 v0.t=0 的 body 元素不执行写回;这些元素按当前 mask policy 处理,尾部元素按 tail policy 处理。
如果索引值不能用当前 SEW 表示,结果按低 SEW 位写入;普通学习示例通常选择能容纳 vl-1 的 SEW。

常见问题

VID.V 的索引是字节偏移吗?

不是。VID.V 写入的是元素编号 i,从 0 开始;如果后续要形成字节地址,还需要结合元素宽度或显式缩放。

VID.V 会读取 vs2 吗?

不会。规范把 VID.V 归在同一类 OP-V 编码中,但它的保留源字段必须为 00000,语法中没有 vs2 源操作数。

掩码关闭的 VID.V 元素会写入 0 吗?

不会按确定的 0 解释。vm=0 且 v0.t=0 的元素不执行写回,目标元素遵循当前 mask policy;尾部元素遵循 tail policy。