已关闭
[Bug-Report] ffn_antiquant_msd.h: CopyOutFinalResult 冗余 Cast 覆盖 bf16 舍入语义 #2637
daishuangshuang创建于 5月25日关闭于 6月29日
leiqingji
5月25日 评论:
5月25日 评论:
/assign @yu-xinjie62


5月25日 将 yu-xinjie62 设为负责人
5月26日 issue类型由 任务 改变为 缺陷
huang-wei-chen
6月4日 评论:
6月4日 评论:
您好,非常感谢您的反馈,该问题我们将在近期修复,感谢您的耐心等待。


6月17日 关联了pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
6月17日 删除了关联的pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
6月17日 关联了pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
6月17日 删除了关联的pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
6月17日 关联了pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
6月17日 关联了pull request:FFN算子移除冗余的Cast操作
6月17日 关联了pull request:商分FFN算子移除冗余的Cast操作
6月29日 关闭了 issue
6月29日 添加了label:resolved
6月30日 issue状态由 待办的 改变为 已完成
6月30日 添加了label:Accepted
一、问题描述(必填)
ffn/ffn/op_kernel/ffn_antiquant_msd.h的CopyOutFinalResult函数中,行 975-980 存在冗余 Cast 调用,覆盖了 if-else 条件分支的舍入模式选择,导致 bf16 场景精度异常。代码片段(行 975-980):
if constexpr (IsSameType<xT, half>::value) { Cast(outputInUb, middleResult3, RoundMode::CAST_NONE, curV2BaseM * curBaseNAligned); // half 场景 } else { Cast(outputInUb, middleResult3, RoundMode::CAST_RINT, curV2BaseM * curBaseNAligned); // bf16 场景 } Cast(outputInUb, middleResult3, RoundMode::CAST_NONE, curV2BaseM * curBaseNAligned); // 无条件覆盖!问题分析:
行 980 无条件执行
Cast(..., CAST_NONE, ...),将 if-else 分支中 bf16 场景选择的CAST_RINT舍入语义覆盖为CAST_NONE。CAST_RINT采用四舍五入,而CAST_NONE直接截断,两者精度行为不同,影响 bf16 输出的数值正确性。该问题同时被代码检视中的 API-9(API 使用规范)和 GEN-1.3(通用编码规范)两个维度独立发现。
二、环境信息(必填)
ffn/ffn/op_kernel/ffn_antiquant_msd.h三、复现步骤(必填)
FFN 算子 MSD 伪量化路径,xT 为 bfloat16 时触发
CopyOutFinalResult,观察输出数值与预期精度的偏差。四、修复建议
删除行 980 的冗余 Cast 调用:
// 修复后 if constexpr (IsSameType<xT, half>::value) { Cast(outputInUb, middleResult3, RoundMode::CAST_NONE, curV2BaseM * curBaseNAligned); } else { Cast(outputInUb, middleResult3, RoundMode::CAST_RINT, curV2BaseM * curBaseNAligned); } // 删除此处冗余 Cast outQueueY_.EnQue(outputInUb);