首页/指令库/VFWREDOSUM-VS
VFWREDOSUM.VS

RISC-V VFWREDOSUM.VS 指令详解

指令手册OPFVV

按活动元素的升序将 SEW 宽 vs2 元素提升为 2*SEW 后求和;宽 vs1[0] 是初值,只有宽 vd[0] 承载归约结果,其余目标元素为 tail。

指令语法

vfwredosum.vs vd, vs2, vs1, vm
操作数说明
vd[0]:目标单向量寄存器的元素 0,接收 2*SEW 宽归约结果;其他目标元素是 tail。
vs2:被归约的 SEW 宽源向量寄存器组;活动元素先提升到 2*SEW。
vs1[0]:单向量寄存器的元素 0,提供 2*SEW 宽归约初值,不是逐元素第二向量源。
vm:vm=0 使用 v0 选择参与归约的 vs2 元素,vm=1 为未掩码;vstart 必须为 0。
V向量归约浮点

指令行为说明

VFWREDOSUM.VS 是 RVV 的拓宽有序浮点归约求和。它把 vl 内活动的 vs2 浮点元素从 SEW 提升到 2*SEW,并从宽 vs1[0] 开始按元素编号升序相加;只有宽 vd[0] 承载归约结果,其他目标元素是按当前 tail policy 管理的 tail。掩码关闭的元素不影响结果或浮点异常标志。vl=0 时不执行操作且不更新目标;vl 非零而没有活动源元素时不做加法,初值写入 vd[0]。

VFWREDOSUM.VS 指令解析与执行动画

可核验的 FP32 到 FP64 归约示例;不模拟 NaN、无穷或异常标志。

输入的指令

宽标量结果:任意 v0-v31 的元素 0

SEW 窄源;不能和宽 vs1 使用同一寄存器

宽初值:任意寄存器的元素 0;掩码时不能为 v0

执行环境
SEW
32 (FP32)
reduction EEW
64 (FP64)
frm
RNE demo
LMUL
m1
VLEN
4096
vstart
0

有限 FP64 示例值

恰好 4 个可表示为有限 FP32 的值

恰好 4 个 0/1 位

active lanes
3
编码字段
0xcc861257
funct6
110011
vm
0
vs2
01000
vs1
01100
funct3
001
vd
00100
opcode
1010111
数据路径与结果

活动且已提升的元素:1, 3, 4

归约过程:

  1. 1 + 1 = 2
  2. 2 + 3 = 5
  3. 5 + 4 = 9

写回

v4[0] = 9

按活动元素的升序执行此演示。

步骤 1/5

显示 OP-V 指令编码;非法输入不会产生编码。

快速理解与检索要点

VFWREDOSUM.VS 把窄 vs2 元素提升后,按活动元素的升序从宽 vs1[0] 开始求和;归约结果在宽 vd[0],其他目标元素为 tail。

vs1[0] 是归约初始值,不是整条向量都参与同等输入。
有序求和强调规定的归约顺序。
源向量中掩码关闭或 vl 外的元素被排除;目标寄存器中 vd[0] 之外的元素是 tail,只遵循当前 tail policy。
除专用掩码指令外,vm=0 使用 v0 作为执行掩码,vm=1 表示不使用掩码。
vl=0 时目标寄存器不更新;reduction 的 vstart 非零会触发非法指令。
浮点运算遵循向量浮点章节:普通浮点运算使用 frm 舍入并设置浮点异常标志;定点 vxrm 不控制这些指令。

向量执行上下文

阅读 VFWREDOSUM.VS 时,不要只看助记符。官方 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 vfwredosum.vs v4, v8, v12, v0.t # vd[0] = (((vs1[0] + vs2[0]) + ...) + vs2[vl-1])» 等实际代码理解该场景。

点积

结合 «vsetvli t0, a0, e32, m1, ta, ma vfwredosum.vs v4, v8, v12, v0.t # vd[0] = (((vs1[0] + vs2[0]) + ...) + vs2[vl-1])» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

有序形式按 vs1[0]、随后活动 vs2[0] 到 vs2[vl-1] 相加;不要把它表示成实现可任意重排的树。
vs2 是 SEW 宽,vs1[0]、vd[0] 和每次累加均为 2*SEW 宽;仅 vd[0] 承载归约结果。
vm=0 时掩码关闭元素既不参与求和,也不设置浮点异常标志。

常见问题

这些浮点指令使用 vxrm 吗?

不使用。普通 RVV 浮点运算和浮点转换使用浮点舍入模式 frm 或指令指定的固定舍入;vxrm 用于定点舍入指令。