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

RISC-V VFWREDUSUM.VS 指令详解

指令手册OPFVV

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

指令语法

vfwredusum.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向量归约浮点

指令行为说明

VFWREDUSUM.VS 是 RVV 的拓宽无序浮点归约求和。它将 vl 内活动的窄 vs2 元素提升到 2*SEW,并与宽 vs1[0] 放入 ISA 允许的确定性归约树;只有宽 vd[0] 承载归约结果,其他目标元素是按当前 tail policy 管理的 tail。vl=0 时不执行操作且不更新目标。该 ISA 不规定唯一树、每个节点的统一中间精度或唯一数值结果;需要按元素升序的语义时使用 VFWREDOSUM.VS。

VFWREDUSUM.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
编码字段
0xc4861257
funct6
110001
vm
0
vs2
01000
vs1
01100
funct3
001
vd
00100
opcode
1010111
数据路径与结果

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

归约过程:

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

写回

v4[0] = 9

这是一个合法示例树,不是 ISA 唯一规定的归约结果。

步骤 1/5

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

快速理解与检索要点

VFWREDUSUM.VS 用一个合法的无序归约树,将提升后的活动 vs2 元素与宽 vs1[0] 合并;归约结果在宽 vd[0],其他目标元素为 tail,且树不是 ISA 唯一规定的形式。

vs2 是 SEW 宽度浮点输入;vs1[0]、vd[0] 和归约计算使用 2*SEW 宽度,且 vs1/vd 都是单个向量寄存器的元素 0。
只归约 vl 范围内被掩码选中的源元素;vd[0] 之外的目标元素是 tail,并遵循 tail policy。
浮点舍入和异常标志遵循 RVV 浮点规则;定点 vxrm 不控制该指令。
vm=0 使用 v0 作为执行掩码,vm=1 表示不使用掩码;掩码关闭源元素被排除,vd[0] 之外的目标元素是 tail 并遵循 tail policy;vstart 非零为非法。

向量执行上下文

阅读 VFWREDUSUM.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 vfwredusum.vs v4, v8, v12, v0.t # only vd[0] receives a 2*SEW reduction result» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

无序归约允许不同的确定性归约树;不要把页面示例树或数值结果说成 ISA 唯一规定的结果。
vs2 是 SEW 宽,vs1[0]、vd[0] 和归约结果为 2*SEW 宽;只有 vd[0] 接收结果。
需要按活动元素升序相加时使用 VFWREDOSUM.VS,而不是依赖无序归约的表面相似结果。

常见问题

VFWREDUSUM.VS 的结果是否可重复?

ISA 允许无序归约采用不同归约树;浮点舍入可能随实现或设置不同而变化。需要有序语义时使用 VFWREDOSUM.VS。

VFWREDUSUM.VS 如何处理掩码?

vm=0 时用 v0 选择活动源元素,vm=1 时所有 body 源元素都参与;掩码关闭源元素被排除,而 vd[0] 之外的目标元素是 tail,遵循 tail policy。