| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(pooling): 补齐窗口重叠scatter累加的LocalMemBar,修复MaxPoolGradWithArgmax梯度丢失 Co-authored-by: SimonZzz<zhouquan79@huawei.com> # message auto-generated for no-merge-commit merge: !10557 merge fixMaxPoolGrad into master fix(pooling): 补齐窗口重叠scatter累加的LocalMemBar,修复MaxPoolGradWithArgmax梯度丢失 Created-by: SimonZzz Commit-by: SimonZzz Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> **问题现象**:MaxPoolGradWithArgmax(V1/V3) 在 Ascend950 上出现精度问题:kernel>stride(如 NCHW、fp32、k=2/s=1、int64 argmax)等窗口重叠场景梯度偶发丢失(y 偏小,时序相关、难复现);dilation>1 时为确定性丢梯度。 **根因**:scatter 方案(gather→add→scatter)的批处理只保证同一向量调用内各 lane 的窗口互不重叠;k>s 时相邻 GradientAcc 调用的窗口必然共享输入元素,argmax 同指共享区最大值时写读同址。该路径未插入 VEC_STORE→VEC_LOAD 内存屏障(裸指针 + RegTensor 索引,编译器无法自动分析依赖),gather 可能取到 scatter 尚未落地的旧值,丢失一个累加项。V2 max_pool_grad 的 singleLine/multipleLineHw 路径在 isOverlap 时已插入 LocalMemBar<VEC_STORE, VEC_LOAD>,avg_pool_v2_grad、max_pool3d_grad 等同类累加循环亦均有;V3 NCHW/NHWC 的 Do* 路径与 V2 multipleLineProcessVF2 缺失。另外 CalcProBatchSize 按 kernel 而非窗口实际跨度 (kernel-1)*dilation+1 计算批间隔,dilation>1 时同一 scatter 调用内窗口仍会重叠,DataCopyScatter 同址覆盖。 **修复方法**: 1. DoSingleNCNchw/DoMulNCNchw/DoSingleCNhwc/DoMulCNhwc 增加 IS_OVERLAP 模板参数(默认 false,不影响 avg_pool 等已自带屏障的调用方),为 true 时在 GradientAcc 前插入 Reg::LocalMemBar<VEC_STORE, VEC_LOAD>; 2. V3 NCHW(singleLineProcessVF/VF1/VF2/VF2Int64 模板化)、V2 backward、V3 NHWC(CRTP ConCProcVF)按运行时 isOverlap_ 分发 true/false 实例,isOverlap_ 判定含 dilation:(k-1)*d+1 > s; 3. V2 multipleLineProcessVF2 内 8 处漏传 IS_OVERLAP 的 DoMulNCNchw 调用补齐; 4. CalcProBatchSize 改按窗口实际跨度 (kernel-1)*dilation+1 取 CeilDiv(span, stride),保证同批窗口互不重叠;d=1 时与原逻辑完全等价。 受影响算子:max_pool_grad_with_argmax_v3、max_pool_grad(NCHW/NHWC 共享路径,仅 k>s 重叠场景生效,k==s 行为不变)。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/5910 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ophost UT:max_pool_grad_with_argmax_v3 全部 39 例(tiling/infershape)通过 宿主侧编译检查:21 个 tiling cpp(真实 CANN 头)+ 全部被改 kernel 头(stub + 显式实例化,覆盖新旧 IS_OVERLAP 全部模板实例)编译通过 clang-format / 120 列 / codespell / OAT 合规检查通过 d=1 时 CalcProBatchSize 与 isOverlap_ 判定与原逻辑数学等价,既有 k==s 用例 tiling 行为不变 真机 ST 待验证(本环境无 A5 硬件):原始失败用例(NCHW fp32 k=2/s=1 int64 argmax);确定性复现(输入奇数列放大值,k=2/s=1 下检查奇数列 y 恒为两个 grad 之和);dilation>1 用例(如 k=3/s=2/d=2) ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!10557 | 12 天前 | |
refactor(pooling):池化算子重复代码收编 Co-authored-by: ZhouChuping<24171214023@stu.xidian.edu.cn> # message auto-generated for no-merge-commit merge: !9305 merge 池化重构 into master refactor(pooling):池化算子重复代码收编 Created-by: qq_52056150 Commit-by: ZhouChuping Merged-by: cann-robot Description: ## 描述 降低池化类算子的代码重复率,抽取重复代码封装为函数,抽取基类。 1.抽取完全重复的函数到Pool_utils目录里 2.修改各处调用点,保证功能和重构前完全一致 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/5370 <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 本地验证通过,受影响算子门槛用例全部验证通过,无功能影响,线上David冒烟和OBP冒烟均通过 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 不涉及 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:降低代码重复率,重构池化类算子的代码 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!9305 | 29 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 12 天前 | ||
| 29 天前 |