先看 vl
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
将活动的 SEW 宽 vs2 浮点元素提升到 2*SEW,以宽 vs1[0] 为初值做无序归约求和;只有宽 vd[0] 承载归约结果,其余目标元素为 tail。
VFWREDUSUM.VS 是 RVV 的拓宽无序浮点归约求和。它将 vl 内活动的窄 vs2 元素提升到 2*SEW,并与宽 vs1[0] 放入 ISA 允许的确定性归约树;只有宽 vd[0] 承载归约结果,其他目标元素是按当前 tail policy 管理的 tail。vl=0 时不执行操作且不更新目标。该 ISA 不规定唯一树、每个节点的统一中间精度或唯一数值结果;需要按元素升序的语义时使用 VFWREDOSUM.VS。
可核验的 FP32 到 FP64 归约示例;不模拟 NaN、无穷或异常标志。
宽标量结果:任意 v0-v31 的元素 0
SEW 窄源;不能和宽 vs1 使用同一寄存器
宽初值:任意寄存器的元素 0;掩码时不能为 v0
有限 FP64 示例值
恰好 4 个可表示为有限 FP32 的值
恰好 4 个 0/1 位
0xc4861257活动且已提升的元素:1, 3, 4
归约过程:
写回
v4[0] = 9
这是一个合法示例树,不是 ISA 唯一规定的归约结果。
显示 OP-V 指令编码;非法输入不会产生编码。
VFWREDUSUM.VS 用一个合法的无序归约树,将提升后的活动 vs2 元素与宽 vs1[0] 合并;归约结果在宽 vd[0],其他目标元素为 tail,且树不是 ISA 唯一规定的形式。
阅读 VFWREDUSUM.VS 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。后缀和操作数形式决定源操作数来自向量、标量还是立即数。
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
当前 vtype 提供 SEW、LMUL、tail policy 和 mask policy;这些规则影响元素宽度、寄存器组大小以及非活动/尾部目标元素。
带 vm 的普通向量指令在 vm=0 时用 v0 作为执行掩码,vm=1 表示未掩码。VMERGE 等少数形式会把 v0 当作数据选择输入。
结合 «vsetvli t0, a0, e32, m1, ta, ma vfwredusum.vs v4, v8, v12, v0.t # only vd[0] receives a 2*SEW reduction result» 等实际代码理解该场景。
ISA 允许无序归约采用不同归约树;浮点舍入可能随实现或设置不同而变化。需要有序语义时使用 VFWREDOSUM.VS。
vm=0 时用 v0 选择活动源元素,vm=1 时所有 body 源元素都参与;掩码关闭源元素被排除,而 vd[0] 之外的目标元素是 tail,遵循 tail policy。