首页/指令库/VFNCVTBF16-F-F-W
VFNCVTBF16.F.F.W

RISC-V VFNCVTBF16.F.F.W 指令详解

指令手册OPFVV

将 FP32 向量源窄化为 BF16,按 frm 舍入。

指令语法

vfncvtbf16.f.f.w vd, vs2, vm

语法为 vfncvtbf16.f.f.w vd, vs2[, v0.t];vd、vs2 选择 v0–v31 向量组的最低编号寄存器;没有浮点标量源或立即数。

32 位 OP-V:funct6=010010、bits19:15=11101(固定 VFUNARY0 选择子)、funct3=001、opcode=1010111;vm=0 使用 v0.t,省略掩码为 vm=1。

需 Zvfbfmin(依赖 Zve32f)、启用向量/浮点状态和合法 vtype;仅 SEW=16 合法。vs2 是 EEW=32、EMUL=2*LMUL 的 FP32 源;vd 是 EEW=16、EMUL=LMUL 的 BF16 目标,按 frm 舍入。

组起点按 EMUL 对齐,最大 EMUL≤8;窄化重叠须同最低寄存器,加宽重叠须源 EMUL≥1 且同最高寄存器。masked vd 不含 v0,v0 不可同时供 mask 和数据;不同 EEW 的合法源/目标重叠强制 mask/tail agnostic。

只执行掩码允许的 vstart≤i<vl 元素;非活动/尾部按策略处理,不保证清零。vstart≥vl(含 vl=0)不更新任何目标元素。无效 frm 的使用始终保留,即使转换精确或没有活动元素。

Zvfbfmin向量运算

指令行为说明

VFNCVTBF16.F.F.W 在 SEW=16 下把 vs2 中 32 位 FP32 源元素窄化为 16 位 BF16 结果并写入 vd。转换按 frm 舍入,可能产生 Overflow、Underflow、Inexact 或 Invalid 异常标志;属于 Zvfbfmin。

VFNCVTBF16.F.F.W 指令解析与执行动画

从 OP-V 编码解码到向量 BF16 窄化转换:每个活动元素把 FP32 源值按 frm 舍入为 BF16。

输入的指令
vfncvtbf16.f.f.w
执行环境
LMULm1本动画固定的寄存器组倍数
VLEN4096固定向量寄存器长度(bits)
VLMAX256m1 下的最大元素数
vstart0本动画不展示 prestart 元素
FP stateFS enabledFS=Off 会触发非法指令;本动画固定展示 FS 已启用的架构路径
source EEW32源元素宽度
vta/vmata, ma尾部/非活动元素策略
opcode1010111OP-V 主操作码
vs111101VFUNARY0 转换选择字段
编码字段
0x488e9257
31..26
25
24..20
19..15
14..12
11..7
6..0
010010
funct6
0
vm
01000
vs2
11101
vs1/sel
001
funct3
00100
vd
1010111
OP-V
执行数据路径

lane 0: bf16_rne(1.5) -> 0x3fc0 (1.5)

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

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

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

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
bf16_rne(1.5)
0x3fc0 (1.5)
i=1活动
bf16_rne(-2.25)
0xc010 (-2.25)
i=2跳过
v0.t=0,不执行
--
i=3活动
bf16_rne(-4.5)
0xc090 (-4.5)
i=4活动
bf16_rne(7.75)
0x40f8 (7.75)
i=5活动
bf16_rne(-8.25)
0xc104 (-8.25)
i=6跳过
v0.t=0,不执行
--
i=7活动
bf16_rne(-31.25)
0xc1fa (-31.25)

教学环境固定 SEW=16、LMUL=m1、VLEN=4096、VLMAX=256、vstart=0、合法 vtype、VS/FS 已启用及有效 frm。FP32 源占偶数 vs2..vs2+1,BF16 目标占单寄存器;合法重叠须从源组最低寄存器开始。数值输入先表示为 FP32,再按所选 frm 窄化。不同 EEW 的合法重叠强制 mask/tail agnostic。非活动及尾元素不显示确定值;VL=0 不更新任何目标元素。NaN、无穷、fflags 和处理器周期不在模型范围。超出有限结果范围只表示演示限制,不表示非法指令。

SEW=16,source EEW=32 / FP32 -> destination EEW=16 / BF16。动画按所选 frm 演示有限结果的 BF16 舍入;官方规则中该指令按 frm 舍入,并可能设置 Overflow、Underflow、Inexact、Invalid。

快速理解与检索要点

这是 RVV BF16 的 FP32 -> BF16 窄化转换:语法只有 vd、vs2、vm;SEW 固定为 16,vs1[19:15]=11101 是 VFUNARY0 selector,不是源寄存器。

OP-V 编码:funct6=010010,vs1/selector=11101,funct3=001(OPFVV),opcode=1010111。
官方保留编码:SEW 为任何非 16 值时保留。
源元素 EEW=32 FP32,目标元素 EEW=16 BF16;活动元素受 vl 和 v0.t 掩码控制。
结果按 frm 舍入,异常包括 Overflow、Underflow、Inexact、Invalid。
页面动画以有限 FP32 示例展示所选 frm 舍入;NaN、无穷和 fflags 不在演示计算范围内。
vm=0 时仅 v0.t 为 1 的 body 元素执行;省略掩码操作数表示 vm=1。vl=0 不更新任何目标元素。

向量执行上下文

body 元素满足 vstart≤i<vl;其中掩码允许的元素才执行转换。vstart≥vl(含 vl=0)时所有目标元素不变。SEW 固定为 16,LMUL 决定寄存器组大小,vta/vma 决定 tail/inactive 策略。

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

常见使用场景

向量运算

启用 Zvfbfmin 与向量/浮点状态,SEW=16、LMUL=m1、VLEN=128、vl=1、vstart=0、frm=RNE,无掩码:v8[0]=1.5 (FP32 0x3FC00000) → v4[0]=BF16 0x3FC0;其余目标元素按 tail policy 处理。

机器学习

启用 Zvfbfmin 与向量/浮点状态,SEW=16、LMUL=m1、VLEN=128、vl=1、vstart=0、frm=RNE,无掩码:v8[0]=1.5 (FP32 0x3FC00000) → v4[0]=BF16 0x3FC0;其余目标元素按 tail policy 处理。

使用前检查清单

语法检查
  • 语法为 vfncvtbf16.f.f.w vd, vs2[, v0.t];vd、vs2 选择 v0–v31 向量组的最低编号寄存器;没有浮点标量源或立即数。
  • 32 位 OP-V:funct6=010010、bits19:15=11101(固定 VFUNARY0 选择子)、funct3=001、opcode=1010111;vm=0 使用 v0.t,省略掩码为 vm=1。
语义检查
  • 需 Zvfbfmin(依赖 Zve32f)、启用向量/浮点状态和合法 vtype;仅 SEW=16 合法。vs2 是 EEW=32、EMUL=2*LMUL 的 FP32 源;vd 是 EEW=16、EMUL=LMUL 的 BF16 目标,按 frm 舍入。
  • 组起点按 EMUL 对齐,最大 EMUL≤8;窄化重叠须同最低寄存器,加宽重叠须源 EMUL≥1 且同最高寄存器。masked vd 不含 v0,v0 不可同时供 mask 和数据;不同 EEW 的合法源/目标重叠强制 mask/tail agnostic。
  • 只执行掩码允许的 vstart≤i<vl 元素;非活动/尾部按策略处理,不保证清零。vstart≥vl(含 vl=0)不更新任何目标元素。无效 frm 的使用始终保留,即使转换精确或没有活动元素。

容易混淆 / 常见误区

SEW 必须为 16;其他 SEW 编码为保留编码。
源 vs2 元素 EEW 为 32 位 FP32,目标 vd 元素 EEW 为 16 位 BF16。
窄化到 BF16 按 frm 舍入,不是简单截取 FP32 高 16 位。
BF16 只有 7 位 fraction,结果精度明显低于 FP32。
NaN、无穷、溢出、下溢和异常标志按官方 BF16/浮点转换规则处理。

常见问题

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

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

BF16 是否等同于 IEEE binary16?

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

VFNCVTBF16.F.F.W 是否只是截断 FP32?

不是。官方语义是 FP32 到 BF16 的窄化转换并按 frm 舍入;简单截断会误导舍入和异常边界。