首页/指令库/VFWMACCBF16-VF
VFWMACCBF16.VF

RISC-V VFWMACCBF16.VF 指令详解

指令手册OP-V

BF16 向量-标量拓宽融合乘加,累加到 FP32 vd。

指令语法

vfwmaccbf16.vf vd, rs1, vs2, vm
操作数说明
vd 为 FP32 累加输入与结果,EEW=32、EMUL=2×LMUL;BF16 向量源 EEW=16、EMUL=LMUL。组起点按 EMUL 对齐;累加源不能与 BF16 源以不同 EEW 读取同一寄存器。
rs1 选择浮点 f0–f31 的 BF16 标量;须有效 NaN-box,否则按 canonical QNaN 消费。
SEW 必须为 16;vm 表示可选 v0.t,省略为未掩码。只对掩码允许的 vstart≤i<vl 执行;vstart≥vl(含 vl=0)不更新任何目标元素。
Zvfbfwma向量运算

指令行为说明

VFWMACCBF16.VF 在 SEW=16 下读取 f[rs1] 中的标量 BF16、vs2 的 BF16 元素以及 vd 中的 FP32 累加值,将 BF16 源相乘,未舍入乘积加到对应 FP32 累加值,再按 frm 舍入写回 FP32 vd;属于 Zvfbfwma。

VFWMACCBF16.VF 指令解析与执行动画

从 OP-V 编码解码到 BF16 拓宽融合乘加:每个活动元素把 f[rs1] 与 vs2[i] 的 BF16 源相乘并累加到 FP32 vd[i]。

输入的指令
vfwmaccbf16.vf
执行环境
LMULm1本动画固定的寄存器组倍数
VLEN4096固定向量寄存器长度(bits)
VLMAX256m1 下的最大元素数
vstart0本动画不展示 prestart 元素
FP stateFS enabledFS=Off 会触发非法指令;本动画固定展示 FS 已启用的架构路径
acc EEW32vd 累加器为 FP32
vta/vmata, ma尾部/非活动元素策略
opcode1010111OP-V 主操作码
编码字段
0xec855257
31..26
25
24..20
19..15
14..12
11..7
6..0
111011
funct6
0
vm
01000
vs2
01010
rs1
101
funct3
00100
vd
1010111
OP-V
执行数据路径

lane 0: fma_rne(1.5, 1.5, 0.5) -> 2.75 / 0x40300000

显示的 lane 与当前步骤高亮同步;其余逐元素结果位于下方。

步骤 1 / 15
读取 OP-V 编码字段

V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
fma_rne(1.5, 1.5, 0.5)
2.75 / 0x40300000
i=1活动
fma_rne(-2.25, 1.5, -1)
-4.375 / 0xc08c0000
i=2跳过
v0.t=0,不执行
--
i=3活动
fma_rne(-6, 1.5, -2.5)
-11.5 / 0xc1380000
i=4活动
fma_rne(8, 1.5, 4)
16 / 0x41800000
i=5活动
fma_rne(-10, 1.5, -4.5)
-19.5 / 0xc19c0000
i=6跳过
v0.t=0,不执行
--
i=7活动
fma_rne(-20, 1.5, -8.5)
-38.5 / 0xc21a0000

教学环境固定 SEW=16、LMUL=m1、VLEN=4096、VLMAX=256、vstart=0、合法 vtype、VS/FS 已启用与 ta/ma。BF16 源占单寄存器,FP32 累加器占偶数 vd..vd+1;累加器也是源,不能与 BF16 源重叠读取不同 EEW。同名 BF16 源须提供相同位模式。数值先表示为 FP32,再以 RNE 表示为 BF16;原始位模式直接提供 BF16 输入。乘积与 FP32 累加值精确相加后只按所选 frm 舍入一次;标量假定有效 NaN-box。VL=0 不更新任何目标元素;非活动/尾元素不显示确定值。NaN、无穷和 fflags 不在有限样例模型范围;超出模型范围不表示非法指令。

SEW=16,BF16 源来自 vs2 和 vs1/rs1,vd 是 FP32 累加输入和 FP32 结果。动画先精确加宽 BF16 源,再演示等价的 FP32 fused multiply-accumulate 路径;异常标志以官方 BF16 规则为准。

快速理解与检索要点

这是 BF16 向量-标量 widening FMA:语法为 vd、rs1、vs2、vm;rs1 是浮点寄存器中的 BF16 标量,vd 是 FP32 累加器和结果。

OP-V 编码:funct6=111011,funct3=101(OPFVF),opcode=1010111;rs1 字段选择浮点寄存器中的 BF16 标量源。
官方保留编码:SEW 为任何非 16 值时保留。
rs1/vs2 源 EEW=16 BF16,vd 输入和输出 EEW=32 FP32。
官方等价序列为先把 BF16 标量和向量源加宽到 FP32,再执行 vfmacc.vf。
只对 vl 范围内的活动元素执行;vm=0 时 v0.t 控制活动元素。
FP32 vd 也是读取的累加源;它不能与 BF16 源以不同 EEW 重叠读取同一向量寄存器。

向量执行上下文

SEW=16;活动元素满足 vstart≤i<vl 且掩码允许。vstart≥vl(含 vl=0)不更新任何目标元素;prestart 保持,inactive/tail 按 vma/vta。BF16 源 EMUL=LMUL,FP32 累加器/结果 EMUL=2×LMUL≤8。要求受支持的合法 vtype、所需扩展与已启用向量/浮点状态;每个活动元素按 frm 做一次融合舍入。

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

常见使用场景

向量运算

结合 «vfwmaccbf16.vf v4, f0, v8 # v4[fp32] += bf16(f0) * bf16(v8[i])» 等实际代码理解该场景。

机器学习

结合 «vfwmaccbf16.vf v4, f0, v8 # v4[fp32] += bf16(f0) * bf16(v8[i])» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

SEW 必须为 16;其他 SEW 编码为保留编码。
rs1 是浮点寄存器中的标量 BF16 源,不是整数寄存器源。
vs2 是 BF16 向量源,vd 同时是 FP32 累加输入和 FP32 输出。
Zvfbfwma 依赖 Zvfbfmin 和 Zfbfmin。
不要把该指令理解成单独 BF16 乘法再 BF16 加法;官方语义是拓宽融合乘加。
标量 BF16 必须有效 NaN-box;否则按 canonical QNaN 消费。动画假定有效 NaN-box。

常见问题

这些向量 BF16 指令是否支持任意 SEW?

不支持。官方 BF16 向量指令在 SEW 不是 16 时为保留编码;本页动画固定 SEW=16。

BF16 是否等同于 IEEE binary16?

不是。BF16 是 1 位符号、8 位指数、7 位 fraction;它与半精度 binary16 的指数和 fraction 位宽不同。

VFWMACCBF16 是否等同于普通 vfmacc?

不完全相同。官方说明可用先把 BF16 源加宽到 FP32 再执行 vfmacc 的序列理解,但源格式、SEW=16 限制和 Zvfbfwma 扩展要求不同。