已合并
avg_pool kernel精度提升 #8595
klein8793创建于 8月12日
avg_pool kernel精度提升 #8595
已合并
klein8793创建于 8月12日
klein8793
klein8793成员
8月12日

描述

avg_pool kernel精度提升,使用了下面这些手段:

  • avg_pool big_kernel模板,将先求倒数再相乘逻辑,改为直接除
  • 对Fp32路径使用高精度除

关联的Issue

关联Issue #4756

测试

白盒用例、atk用例、obp冒烟、david冒烟均已通过

文档更新

NA

类型标签

AI/Agent生成声明

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 klein8793 的贡献)
klein8793klein8793成员
8月12日 创建了 pull request,commit a5fc5c69
atomgit-bot
atomgit-bot
8月12日 评论:

变更摘要

此 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 操作,使尾部数据路径与主循环对齐。

likedislike
不准确?
atomgit-bot
atomgit-bot
8月12日 评论:

代码审查

审查总结

本次审查覆盖了全部 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

💬 仅评论

likedislike
不准确?
CANN-robotCANN-robot成员
8月12日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
8月12日 评论:

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 /approve or /lgtm
  • Commenting /approve implies 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. 👍

likedislike
此处折叠了99条消息 查看更多
kevin_huang1234成员
8月18日 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
8月18日 添加了label:lgtm
CANN-robotCANN-robot成员
8月18日 关闭了关联的issue
CANN-robotCANN-robot成员
8月18日 合入了pull request
CANN-robot
CANN-robot成员
8月18日 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike