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

RISC-V VFWREDUSUM.VS 指令详解

指令手册OPFVV

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

指令语法

vfwredusum.vs vd, vs2, vs1[, v0.t]
操作数说明
语法 vfwredusum.vs vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111, funct3=001, funct6=110001。
vs2 的 EEW=SEW、EMUL=LMUL;vs1[0] 和 vd[0] 为 2×SEW 宽,分别是任意单个向量寄存器的元素 0(EMUL=1),不要求偶数起点。目标可以与源和 v0 重叠;源不能以不同 EEW 读取同一寄存器。
将宽 vs1[0] 与已提升的活动源放入归约树;节点精度/范围至少为 2×SEW 格式,按动态 frm 舍入,最终舍入到 2×SEW。树对给定 vtype/vl 必须确定,但跨实现不保证相同结果;允许附加加法单位元(RDN 为 +0,其余为 -0)。无活动源时允许传播或 canonicalize NaN,并可对 sNaN 置 NV。
省略 v0.t 为 vm=1,写出为 vm=0;掩码关闭源不产生浮点异常,活动异常累积到 fflags。同一寄存器不能同时作为 EEW=1 掩码与不同 EEW 数据源。初值始终参与,不受掩码位0控制;非零 vstart 为非法指令。vl=0 不更新目标,也不复制初值;其余目标元素为 tail,仅由 vta 处理。ta/ma 不保证清零;成功执行复位 vstart=0。
V 1.0 适用于 RV32/RV64,依赖 F/D;要求受支持的格式、合法 vtype、VS/FS 已启用。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留(包括 vl=0),vxrm 不参与。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、RNE 和有限输入,不完整模拟 NaN、无穷或 fflags。
V向量归约浮点

扩展条件:V 1.0,RV32/RV64;要求受支持的浮点格式、合法 vtype、VS/FS 已启用。标准 V 支持 SEW=32 到 FP64;不保证 SEW=64 到 FP128。

指令行为说明

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

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

可核验的 FP32 到 FP64 归约示例;固定合法 vtype、VS/FS 已启用、有效 frm=RNE、ta,输入先表示为 FP32、宽初值为 FP64,每次加法按 RNE 舍入为 FP64。非有限输入/结果和异常标志不在模型内;教学步骤不是处理器周期。

输入的指令

宽标量结果:任意 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 passes through
  3. 4 passes through
  4. 2 + 3 = 5
  5. 4 passes through
  6. 5 + 4 = 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 宽单寄存器标量(EMUL=1),可用任意寄存器,不要求偶数起点。目标可与源及 v0 重叠。
同一寄存器不能以不同源 EEW 读取,掩码源 EEW=1;因此宽初值与窄源不能共用寄存器,使用 v0.t 时两种数据源都不能为 v0。
32 位 OP-V:opcode=1010111、funct3=001、funct6=110001;语法为 vd, vs2, vs1[, v0.t]。
仅活动 vs2 元素参与,宽初值始终参与;其余目标元素为 tail,仅按 vta 处理。vl=0 不更新目标,不复制初值;非零 vstart 为非法指令。
每次宽加法使用动态 frm,活动异常累积到 fflags;无效 frm 的使用保留(包括 vl=0),vxrm 不参与。
树对给定 vtype/vl 必须确定;节点范围和精度至少为 2*SEW 格式,最终舍入到 2*SEW。允许附加单位元(RDN 为 +0,其余为 -0);无活动源时 NaN 可传播或 canonicalize,sNaN 可置 NV。

向量执行上下文

语法 vfwredusum.vs vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111, funct3=001, funct6=110001。

vs2 的 EEW=SEW、EMUL=LMUL;vs1[0] 和 vd[0] 为 2×SEW 宽,分别是任意单个向量寄存器的元素 0(EMUL=1),不要求偶数起点。目标可以与源和 v0 重叠;源不能以不同 EEW 读取同一寄存器。

将宽 vs1[0] 与已提升的活动源放入归约树;节点精度/范围至少为 2×SEW 格式,按动态 frm 舍入,最终舍入到 2×SEW。树对给定 vtype/vl 必须确定,但跨实现不保证相同结果;允许附加加法单位元(RDN 为 +0,其余为 -0)。无活动源时允许传播或 canonicalize NaN,并可对 sNaN 置 NV。

省略 v0.t 为 vm=1,写出为 vm=0;掩码关闭源不产生浮点异常,活动异常累积到 fflags。同一寄存器不能同时作为 EEW=1 掩码与不同 EEW 数据源。初值始终参与,不受掩码位0控制;非零 vstart 为非法指令。vl=0 不更新目标,也不复制初值;其余目标元素为 tail,仅由 vta 处理。ta/ma 不保证清零;成功执行复位 vstart=0。

V 1.0 适用于 RV32/RV64,依赖 F/D;要求受支持的格式、合法 vtype、VS/FS 已启用。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留(包括 vl=0),vxrm 不参与。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、RNE 和有限输入,不完整模拟 NaN、无穷或 fflags。

The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture — Version 20260120, Chapter 31

常见使用场景

拓宽无序浮点求和

假定 V/VS/FS 已启用、合法 e32,m1、所需格式受支持、frm=RNE、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。v0.t 选择 lane 0、2、3,初值始终参与;v12[0](binary64)=1, v8(binary32)=[1,2,3,4], v0 mask=1011 → v4[0](binary64)=9。此处输入加法精确,示例树给出该值,不宣称一般无序求和有唯一结果。tail 按 ta 处理,不保证清零。

使用前检查清单

语法检查
  • 语法 vfwredusum.vs vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111, funct3=001, funct6=110001。
  • vs2 的 EEW=SEW、EMUL=LMUL;vs1[0] 和 vd[0] 为 2×SEW 宽,分别是任意单个向量寄存器的元素 0(EMUL=1),不要求偶数起点。目标可以与源和 v0 重叠;源不能以不同 EEW 读取同一寄存器。
语义检查
  • 将宽 vs1[0] 与已提升的活动源放入归约树;节点精度/范围至少为 2×SEW 格式,按动态 frm 舍入,最终舍入到 2×SEW。树对给定 vtype/vl 必须确定,但跨实现不保证相同结果;允许附加加法单位元(RDN 为 +0,其余为 -0)。无活动源时允许传播或 canonicalize NaN,并可对 sNaN 置 NV。
  • 省略 v0.t 为 vm=1,写出为 vm=0;掩码关闭源不产生浮点异常,活动异常累积到 fflags。同一寄存器不能同时作为 EEW=1 掩码与不同 EEW 数据源。初值始终参与,不受掩码位0控制;非零 vstart 为非法指令。vl=0 不更新目标,也不复制初值;其余目标元素为 tail,仅由 vta 处理。ta/ma 不保证清零;成功执行复位 vstart=0。
  • V 1.0 适用于 RV32/RV64,依赖 F/D;要求受支持的格式、合法 vtype、VS/FS 已启用。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留(包括 vl=0),vxrm 不参与。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、RNE 和有限输入,不完整模拟 NaN、无穷或 fflags。

容易混淆 / 常见误区

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

常见问题

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

给定 vtype 和 vl,树结构必须确定;但 ISA 允许不同实现选择不同树和中间精度,结果不保证跨实现一致。有序语义用 VFWREDOSUM.VS。

VFWREDUSUM.VS 如何处理掩码?

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