问题现象与根因
QSMLA 的 QK 使用保留 FP32 累加结果的模式:
TMATMUL(tScoreCube, tQShared, tKShared,
fixp::keep_acc().transpose_b());
TMATMUL_ACC(tScoreCube, tScoreCube, tQShared, tKShared,
fixp::keep_acc().transpose_b());
keep_acc() 选择 PreQuant=0(None)。原公共宏却不区分 PreQuant,
始终发射:
"B.DATR %D[DataTypeB], byte0, Zero, RNE, NOSAT\n" EXTRA_ATTRS
结果是同一 CUBE block 中出现:
B.DATR HiF8/FP16, byte0, Zero, RNE, nosat
B.FPATR 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
上述 B.FPATR 表示 PreQuant=None、TransB=1。
DataType 以实际 HIF8/FP16 ELF 为准;冲突点是 None 与 RNE 的组合,
不是 TransB。P@V 使用 keep_acc() 而不转置 B,同样经过该公共宏。
固定版本 Model 在
emulator/engine/AccumulateBlockInfo.cpp:1109
执行以下约束检查:
ASSERT((currentBlock->preQuantMode != 0 ||
(currentBlock->blockAttr->rMode == FRMMode::FRM_NONE &&
!currentBlock->blockAttr->saturation)) &&
"B.FPATR None requires B.DATR RMode=NONE and Sat=0");
实际 gfrun 因该断言退出,exit 1,尚未执行到 softmax,也没有有效输出可供精度比较。
这是 API 已经生成非法属性组合,不能靠删除 Model 断言来修复。
报告的规范归属锚为 B.FPATR.asl;本地证据是错误模板、ELF 编码、
上述检查以及条件补丁后错误消失,四者相互对应。
本地最小修复及原因
在 PTO_MATMUL_HEADER 中,只替换原固定 B.DATR 那一行,
插入以下内联汇编字符串;各行仍保留宏续行反斜杠:
".if %c[PreQuant] == 0\n"
"B.DATR %D[DataTypeB], byte0, Zero, RNONE, NOSAT\n"
".else\n"
"B.DATR %D[DataTypeB], byte0, Zero, RNE, NOSAT\n"
".endif\n" EXTRA_ATTRS
- PreQuant=None:使用 RNONE/NOSAT,满足现有合法性约束。
- 其他 PreQuant:保持原 RNE/NOSAT,不在本轮改变其他转换模式的行为。
- 这是汇编期条件选择,不增加 kernel 运行期分支。
- 不更改累加数据类型、TransA/TransB、Shared 加载或矩阵形状。
为何不全局将 RNE 替换为 RNONE:不同后处理模式有自己的舍入语义;
本轮只确认并修复 None,不能由此宣称其他模式的原编码均正确。
例如 Model 对 shift 模式也有独立约束,需另行审计,不包含在本轮验证结论中。
共享宏的其他调用方可能受同类问题影响,建议统一检查;
本轮完整 QSMLA 运行验证不等于所有 TMATMUL/TGEMV 变体均已验证。
问题现象与根因
QSMLA 的 QK 使用保留 FP32 累加结果的模式:
keep_acc()选择PreQuant=0(None)。原公共宏却不区分 PreQuant,始终发射:
结果是同一 CUBE block 中出现:
上述 B.FPATR 表示 PreQuant=None、TransB=1。
DataType 以实际 HIF8/FP16 ELF 为准;冲突点是 None 与 RNE 的组合,
不是 TransB。P@V 使用
keep_acc()而不转置 B,同样经过该公共宏。固定版本 Model 在
emulator/engine/AccumulateBlockInfo.cpp:1109执行以下约束检查:
实际 gfrun 因该断言退出,exit 1,尚未执行到 softmax,也没有有效输出可供精度比较。
这是 API 已经生成非法属性组合,不能靠删除 Model 断言来修复。
报告的规范归属锚为
B.FPATR.asl;本地证据是错误模板、ELF 编码、上述检查以及条件补丁后错误消失,四者相互对应。
本地最小修复及原因
在
PTO_MATMUL_HEADER中,只替换原固定 B.DATR 那一行,插入以下内联汇编字符串;各行仍保留宏续行反斜杠:
为何不全局将 RNE 替换为 RNONE:不同后处理模式有自己的舍入语义;
本轮只确认并修复 None,不能由此宣称其他模式的原编码均正确。
例如 Model 对 shift 模式也有独立约束,需另行审计,不包含在本轮验证结论中。
共享宏的其他调用方可能受同类问题影响,建议统一检查;
本轮完整 QSMLA 运行验证不等于所有 TMATMUL/TGEMV 变体均已验证。