Pull Request已成功合入, 合并人@CANN-robot
(感谢 klein8793 的贡献)变更摘要
此 PR 旨在提升 avg_pool kernel 的数值精度,核心思路是将原先「先求倒数再相乘(Muls)」的取平均方式统一改为「直接除法(Div/Divs)」,并对 Fp32 路径引入高精度除法模式 divHighPrecisionMode(PRECISION_0ULP_FTZ_TRUE)。变更涉及 avg_pool_big_kernel.h、avg_pool_big_kernel_nhwc.h 和 avg_pool_common.h 三个文件,同时修复了若干边界条件(如除零保护、尾部数据处理掩码等)。
主要改动
-
mulsFactor_改为divisor_并调整计算逻辑:在avg_pool_big_kernel.h和avg_pool_big_kernel_nhwc.h中,将成员变量从存储倒数因子mulsFactor_改为直接存储除数divisor_,且当curkH * curkW == 0时将除数置为1.0f以避免除零异常。 -
big_kernel 模板用
Divs/Div替代Muls:在AvgPoolBigKernel::ComputeAvg()中,Fp32 路径以Divs直接除以divisor_,非 Fp32 路径也对中间 float 结果使用Divs;NHWC 版本则在ComputeAvg、ComputeSingleNorm、ComputeSingleNormForAvgNotFp32、ComputeSingleWithGatherForAvgNotFp32、ComputeSingleWithGather等多处将Muls/MicroAPI::Muls替换为Div/MicroAPI::Div。 -
引入高精度除法模式
divHighPrecisionMode:在avg_pool_common.h中定义常量divHighPrecisionMode(MaskMergeMode::ZEROING+PRECISION_0ULP_FTZ_TRUE),并在AvgPoolB32Impl、AvgPoolSingleChannelB32、AvgPoolDivNormChannel、AvgPoolDivNorm、AvgPoolDivBatchV1、AvgPoolDivBatchV2、DivCompute等所有 Fp32 除法调用处显式指定该高精度模式。 -
修复
AvgPoolDivNormChannel尾部偏移量错误:将尾部数据拷贝的DataCopyUnAlignPost参数从u0修正为u1,与主循环中的目的地址寄存器保持一致。 -
完善
AvgPoolDivBatchV2尾部处理:为尾部迭代引入独立的pTailMask(基于float32_t的掩码),并在CHANNEL_BROADACAST条件下补充尾部DataCopyGather操作,使尾部数据路径与主循环对齐。


代码审查
审查总结
本次审查覆盖了全部 3 个变更文件:
逐文件审查结果
| 文件 | 发现问题 |
|---|---|
pooling/avg_pool/op_kernel/arch35/avg_pool_big_kernel.h |
P3 ×1:ComputeAvg 使用 Divs 无法应用 divHighPrecisionMode 高精度模式 |
pooling/avg_pool/op_kernel/arch35/avg_pool_big_kernel_nhwc.h |
P3 ×1:fp32 路径 MicroAPI::Div 未使用 divHighPrecisionMode |
pooling/avg_pool/op_kernel/arch35/avg_pool_common.h |
P2 ×1:AvgPoolDivBatchV1 尾块 Div 掩码未同步修复(与 AvgPoolDivBatchV2 的修复不一致) |
按优先级统计
- P0:0
- P1:0
- P2:1(
AvgPoolDivBatchV1尾块掩码与已修复的AvgPoolDivBatchV2不一致,可能产生错误计算结果) - P3:2(高精度除法模式未全面覆盖到所有 fp32 路径,与 PR 目标不完全一致)
整体风险评估
该 PR 将 avg_pool 的乘法-倒数模式改为直接除法模式,并在 avg_pool_common.h 中为 fp32 路径添加高精度除法——核心语义转换正确,精度提升方向明确。AvgPoolDivNormChannel 的 DataCopyUnAlignPost 从 u0 修正为 u1 是一个正确的 bug 修复。主要风险在于:AvgPoolDivBatchV1 的尾块掩码问题在 AvgPoolDivBatchV2 中已修复但此处被遗漏,属于同一文件中兄弟函数的一侧修复遗漏;以及高精度模式在 NHWC/非 NHWC 大 kernel 的 fp32 路径上未完全覆盖,与 PR 声称的"对 Fp32 路径使用高精度除"目标存在差距。建议在合入前补充上述修复。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
For more, you also can visit HICANN.
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| pooling | ✅ 黄迪, 刘闯 (2/2) | ✅ 刘闯, 黄迪 (2/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
klein8793, thanks for your pull request. All authors of the commits have signed the CLA. 👍


/lgtm
/approve


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


描述
avg_pool kernel精度提升,使用了下面这些手段:
关联的Issue
关联Issue #4756
测试
白盒用例、atk用例、obp冒烟、david冒烟均已通过
文档更新
NA
类型标签
AI/Agent生成声明