VREDSUM.VS 会把结果写到每个 vd 元素吗?
不会。有效归约结果只写入 vd[0],不是逐元素输出,也不是广播结果。
VREDSUM.VS 使用 vs1[0] 初值对活动 vs2 元素执行求和归约,结果只写入 vd[0]。
VREDSUM.VS 是 RISC-V V 扩展的单宽整数归约指令。语法为 `vredsum.vs vd, vs2, vs1, vm`;它以 vs1[0] 为初值,只让当前 vl 内且掩码选中的 vs2 元素参与求和归约,并把最终 SEW 宽结果写入 vd[0]。若 vl=0,不执行操作且不更新目标寄存器。整数溢出按 SEW 宽度回绕。
从 OP-V 编码字段开始,展示 VREDSUM 如何以 vs1[0] 为初值,只归约活动 vs2 元素,并把SEW 宽结果写入 vd[0]。
要求 V 1.0、已启用向量状态及合法受支持 vtype/SEW。固定 LMUL=m1、vstart=0、VLEN=4096,VLMAX=4096/16=256。归约指令的 vstart 非零会触发非法指令异常,因此不提供该值作为可执行输入。归约只写单个 vd 的元素0,其余元素是 tail,按 vta 处理;vd 可与源或 v0 重叠。vs2=vs1 时 seed 必须等于 vs2[0]。v0 提供 EEW=1 掩码时不可同时作 SEW 数据源。VL=0 不更新任何目标元素;这里只展示 body,不伪造 inactive/tail 的确定值。步骤是教学分解,不是处理器周期。
vredsum.vs 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 vs1 字段放在同一条编码带中。
动画展示 OP-V 字段解析、活动元素读取、以 vs1[0] 为初值的整数求和归约、mask 参与元素筛选和 vd[0] 写回。步骤是教学分解,不表示流水线、缓存或执行时延。
VREDSUM.VS 是单宽整数求和归约。它以 vs1[0] 作为标量初值,把 vs2 的活动元素累加进去,并把最终结果写入 vd[0];它不是把结果广播到整个向量。
语法:vredsum.vs vd, vs2, vs1[, v0.t];省略掩码为 vm=1,给出 v0.t 为 vm=0。32 位 OP-V:opcode=1010111、funct3=010(OPMVV)、funct6=000000。
vs2 是 SEW/LMUL 向量组;vs1[0] 是 SEW 初值,vd[0] 是 SEW 结果。两种标量各占单个向量寄存器,不随 LMUL 成组。
vl>0 时初值始终参与,仅活动 vs2 元素参与归约;全部掩码关闭仍写初值。vl=0 不更新目标;非零 vstart 引发非法指令异常。vd[0] 外均为 tail,按 vta 处理。
vd 可与源或 v0 重叠;同名 vs2/vs1 必须从同一寄存器读取一致的元素0。v0 不能同时提供 EEW=1 掩码和 SEW 数据。源组起点按 EMUL 对齐,EMUL≤8。
要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW。动画固定 m1、vstart=0、VLEN=4096;教学步骤不表示处理器周期。
假定 V/VS 已启用、合法 m1、支持 SEW、VLEN≥128、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, v4[0]=250, v12=[1,2,3,4] → v8[0]=4。初值与活动源共同归约;其余目标元素按 vta 作 tail 处理。vl=0 不更新目标。
假定 V/VS 已启用、合法 m1、支持 SEW、VLEN≥128、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, v4[0]=250, v12=[1,2,3,4] → v8[0]=4。初值与活动源共同归约;其余目标元素按 vta 作 tail 处理。vl=0 不更新目标。
不会。有效归约结果只写入 vd[0],不是逐元素输出,也不是广播结果。
vs1[0] 提供归约初值;整条 vs1 向量不是与 vs2 同 lane 配对的第二输入。
vl>0 且全部 vs2 元素被掩码关闭时,仍把 vs1[0] 初值写到 vd[0];vl=0 则完全不更新目标寄存器。