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

RISC-V VFREDUSUM.VS 指令详解

指令手册OP-V

将 vs1[0] 与 vs2 的活动浮点元素用实现选择的归约树求和,结果写入 vd[0];给定 vtype 和 vl 时树结构必须确定。

指令语法

vfredusum.vs vd, vs2, vs1, vm
操作数说明
32 位 OP-V 编码:funct6=000001、funct3=001、opcode=1010111。vs1 选择向量寄存器;.vs 归约只读取其元素 0,.vv 逐元素读取。
vs1[0] 始终参与;vs2 的活动元素参与归约。目标是单个向量寄存器的 vd[0],其余元素按 vta 作为尾部处理;vma 不控制标量结果。目标可与源及 v0 重叠;非零 vstart 触发非法指令异常。
可选 vm 操作数写作 v0.t,对应 vm=0;省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码启用。不能把同一源寄存器同时作为 EEW=1 的 mask 和 SEW 数据读取。
vl=0 不更新任何目标元素。vl>0 而无活动 vs2 元素时,NaN 初值允许原样传递,也允许规范化,并可对 sNaN 置 NV;有限初值按规范归约。
树结构对给定 vtype、vl 必须确定;各节点可使用至少 SEW 的范围及精度,按动态 frm 舍入,根节点再舍入到 SEW。不同实现不必给出相同数值结果。
V 1.0 适用于 RV32/RV64,包含 FP32/FP64 并依赖 F/D;SEW=16 算术需 Zvfh。要求合法 vtype、支持的宽度及 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。所有这些向量浮点指令都要求有效 frm,即使结果不依赖它或 vl=0;vxrm 不控制它们。
动画为教学步骤,不是处理器周期。固定 VLEN=4096、LMUL=m1、vstart=0、合法 vtype 与 VS/FS 已启用;具体输入格式、固定舍入及模型边界见动画说明。VF 标量按 FLEN=64 读取,SEW=32 时假定有效 NaN-boxed。
V向量归约浮点

指令行为说明

将 vs1[0] 与活动 vs2 浮点元素归约到 vd[0]。实现选择二叉树和中间精度;给定 vtype、vl 时树结构必须确定,最终按动态 frm 舍入到 SEW。

VFREDUSUM.VS 归约动画

固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、frm=RNE、合法 vtype 与 VS/FS 已启用。输入先表示为 FP32,每次加法再以 RNE 舍入到 FP32;有限结果之外及异常标志不计算。空元素列表明确表示 vl=0。目标允许与源及 v0 重叠。

步骤 1/5

OP-V 编码:funct6=000001,funct3=001,vm=0。

v0-v31

single-width source

scalar seed in element 0

finite FP32; RNE

finite FP32 values; empty = vl=0

one bit per value

funct6
000001
vm
0
vs2
01000
vs1
01100
funct3
001
vd
00100
opcode
1010111

hex: 04861257

写回

v4[0] = 8

快速理解与检索要点

VFREDUSUM.VS 是归约指令:多个活动元素合成为一个标量样结果,目标是向量寄存器的元素 0。

vs1[0] 始终参与;被掩码关闭和 vl 之外的 vs2 元素不参与有效求和。
二叉树各节点先精确求和,再按动态 frm 舍入到至少具有 SEW 浮点格式范围及精度的格式;根节点结果再舍入到 SEW 格式。
可额外加一个加法单位元:RDN 为 +0.0,其他舍入模式为 -0.0。
给定 vtype 和 vl 时归约树结构必须确定;不同实现的数值结果仍可能不同。
vl>0 且无活动 vs2 元素时,NaN 初值可以原样传递,也允许规范化 NaN 并对 sNaN 置 NV;vl=0 则不更新任何目标元素。

向量执行上下文

32 位 OP-V 编码:funct6=000001、funct3=001、opcode=1010111。vs1 选择向量寄存器;.vs 归约只读取其元素 0,.vv 逐元素读取。

vs1[0] 始终参与;vs2 的活动元素参与归约。目标是单个向量寄存器的 vd[0],其余元素按 vta 作为尾部处理;vma 不控制标量结果。目标可与源及 v0 重叠;非零 vstart 触发非法指令异常。

可选 vm 操作数写作 v0.t,对应 vm=0;省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码启用。不能把同一源寄存器同时作为 EEW=1 的 mask 和 SEW 数据读取。

vl=0 不更新任何目标元素。vl>0 而无活动 vs2 元素时,NaN 初值允许原样传递,也允许规范化,并可对 sNaN 置 NV;有限初值按规范归约。

树结构对给定 vtype、vl 必须确定;各节点可使用至少 SEW 的范围及精度,按动态 frm 舍入,根节点再舍入到 SEW。不同实现不必给出相同数值结果。

V 1.0 适用于 RV32/RV64,包含 FP32/FP64 并依赖 F/D;SEW=16 算术需 Zvfh。要求合法 vtype、支持的宽度及 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。所有这些向量浮点指令都要求有效 frm,即使结果不依赖它或 vl=0;vxrm 不控制它们。

动画为教学步骤,不是处理器周期。固定 VLEN=4096、LMUL=m1、vstart=0、合法 vtype 与 VS/FS 已启用;具体输入格式、固定舍入及模型边界见动画说明。VF 标量按 FLEN=64 读取,SEW=32 时假定有效 NaN-boxed。

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

常见使用场景

向量求和

假定 V/VS/FS 已启用、合法 vtype、有效 frm=RNE、e32,m1 可用、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。输入为 binary32;ft0 若使用则在 FLEN=64 下有效 NaN-boxed。省略 v0.t,未掩码:v3[0]=0, v2=[1,2,3,4] → v1[0]=10。尾部按 ta 处理,不假定清零。

高性能归约

假定 V/VS/FS 已启用、合法 vtype、有效 frm=RNE、e32,m1 可用、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。输入为 binary32;ft0 若使用则在 FLEN=64 下有效 NaN-boxed。省略 v0.t,未掩码:v3[0]=0, v2=[1,2,3,4] → v1[0]=10。尾部按 ta 处理,不假定清零。

使用前检查清单

语法检查
  • 32 位 OP-V 编码:funct6=000001、funct3=001、opcode=1010111。vs1 选择向量寄存器;.vs 归约只读取其元素 0,.vv 逐元素读取。
  • vs1[0] 始终参与;vs2 的活动元素参与归约。目标是单个向量寄存器的 vd[0],其余元素按 vta 作为尾部处理;vma 不控制标量结果。目标可与源及 v0 重叠;非零 vstart 触发非法指令异常。
语义检查
  • 可选 vm 操作数写作 v0.t,对应 vm=0;省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码启用。不能把同一源寄存器同时作为 EEW=1 的 mask 和 SEW 数据读取。
  • vl=0 不更新任何目标元素。vl>0 而无活动 vs2 元素时,NaN 初值允许原样传递,也允许规范化,并可对 sNaN 置 NV;有限初值按规范归约。
  • 树结构对给定 vtype、vl 必须确定;各节点可使用至少 SEW 的范围及精度,按动态 frm 舍入,根节点再舍入到 SEW。不同实现不必给出相同数值结果。
  • V 1.0 适用于 RV32/RV64,包含 FP32/FP64 并依赖 F/D;SEW=16 算术需 Zvfh。要求合法 vtype、支持的宽度及 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。所有这些向量浮点指令都要求有效 frm,即使结果不依赖它或 vl=0;vxrm 不控制它们。
  • 动画为教学步骤,不是处理器周期。固定 VLEN=4096、LMUL=m1、vstart=0、合法 vtype 与 VS/FS 已启用;具体输入格式、固定舍入及模型边界见动画说明。VF 标量按 FLEN=64 读取,SEW=32 时假定有效 NaN-boxed。

容易混淆 / 常见误区

不同实现可选择不同归约树和中间精度,但给定 vtype 和 vl 时树结构必须确定;不能描述成每次运行任意重排。
vfredosum.vs 按元素顺序逐次相加;它也是 vfredusum.vs 的一种合法实现。
vl=0 不更新目标;vl>0 时除 vd[0] 外的目标元素按 vta 作为尾部处理,vma 不控制归约标量结果。

常见问题

这些浮点指令使用 vxrm 吗?

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