Skip to content

[PTO v0.58][CUBE] CUBE PreQuant=None 舍入模式编码错误 #90

Description

@luguo23187

问题现象与根因

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 变体均已验证。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions