| MaxPoolGrad proto & simt Co-authored-by: liuchuangdev<liuchuang51@huawei.com> # message auto-generated for no-merge-commit merge: !3783 merge max_pool_grad_proto into master MaxPoolGrad proto & simt Created-by: liuchuangdev Commit-by: liuchuangdev Merged-by: cann-robot Description: ## 描述 新增算子MaxPoolGrad ## 功能描述 计算最大池化的反向梯度。给定前向输入、前向输出和上游梯度,计算原始输入的梯度。 算子实现:基于SIMT kernel的高性能实现,支持NCHW和NHWC两种数据格式。 ## 输入说明 | 输入 | 类型 | 格式 | 说明 | |------|------|------|------| | x1 | float16/float32/bf16 | NCHW/NHWC | 前向输入张量(原始输入) | | x2 | float16/float32/bf16 | NCHW/NHWC | 前向输出张量(与grad形状相同) | | grad | float16/float32/bf16 | NCHW/NHWC | 上游梯度张量 | ## 输出说明 | 输出 | 类型 | 格式 | 说明 | |------|------|------|------| | y | float16/float32/bf16 | NCHW/NHWC | 输出梯度(与x1形状相同) | ## 属性说明 | 属性 | 类型 | 必需/可选 | 默认值 | 说明 | |------|------|----------|--------|------| | ksize | ListInt | 必需 | - | 池化窗口大小,长度为4 | | strides | ListInt | 必需 | - | 滑动窗口步长,长度为4 | | padding | String | 必需 | - | 填充模式:"VALID"或"SAME" | | data_format | String | 可选 | "NHWC" | 数据格式:"NCHW"或"NHWC" | ## 算子约束 1. **输入约束** - ksize和strides长度必须为4 - x1、x2、grad的数据类型必须相同 - x2和grad的形状必须完全相同 2. **格式约束** - NCHW格式:ksize[0]=1, ksize[1]=1(N和C维度不池化) - NHWC格式:ksize[0]=1, ksize[3]=1(N和C维度不池化) 3. **形状约束** - 输入维度必须为4(NCHW或NHWC) - 输出y的形状与x1相同 4. **padding约束** - padding值必须小于kernel size - VALID模式:padding=0 - SAME模式:自动计算padding使输出形状=input形状/stride ## 算子原理 MaxPoolGrad算子实现两阶段计算: 1. **前向重计算阶段(ComputePos)** - 对每个输出位置,在前向输入中重新计算argmax位置 - 将argmax索引写入workspace 2. **反向散射阶段(ComputeBack)** - 对每个输入位置,检查是否被某个输出的argmax指向 - 累加所有指向该位置的grad值 ## 关联的Issue [#2276](https://gitcode.com/cann/ops-nn/issues/2276) ## 测试 基本功能测试,通路测试,冒烟测试 ## 文档更新 新增pooling/max_pool_grad/op_graph/max_pool_grad_proto.h包含接口brief ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!3783 | 3 个月前 |