| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
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 个月前 | |
fix: standardize error messages for MaxPoolGrad and AdaptiveAvgPool3dGrad Co-authored-by: qq_52056150<wangshuo179@huawei.com> # message auto-generated for no-merge-commit merge: !5681 merge err_msg_fix into master fix: standardize error messages for MaxPoolGrad and AdaptiveAvgPool3dGrad Created-by: qq_52056150 Commit-by: qq_52056150 Merged-by: cann-robot Description: ## 描述 errMsg整改:对算子MaxPoolGrad and AdaptiveAvgPool3dGrad做整改,使用ez错误码明确报错信息 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/3209 ## 测试 本地自测已经通过 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5681 | 1 个月前 | |
maxpoograd网络用例性能优化 Co-authored-by: CANN Developer<developer@cann.com> # message auto-generated for no-merge-commit merge: !4469 merge opt_perf into master maxpoograd网络用例性能优化 Created-by: liuchuangdev Commit-by: CANN Developer Merged-by: cann-robot Description: ## 描述 # max_pool_grad 算子性能优化 ## 概述 本 PR 针对 max_pool_grad 算子进行性能优化,主要包括: 1. 使用 FastDiv(magic number division)替代 Div 指令,提升除法运算性能 2. 添加 identity 优化路径(ksize=1 && stride=1 时直接拷贝) 3. 优化部分冗余计算逻辑 ## 修改详情 ### 1. 新增 FastDiv 函数 在 pool_grad_common/op_kernel/arch35/max_pool_grad_nchw_scatter_common.h 新增以下函数: | 函数名 | 说明 | |-------|------| | IndexConvNchwFastDiv | 使用 FastDiv 进行索引转换 | | DoSingleNCNchwFastDiv | 单行处理 FastDiv 版本(int32 only) | | DoMulNCNchwFastDiv | 多行处理 FastDiv 版本(int32 only) | | ConvertIndexInt32FastDiv | 索引转换 FastDiv 版本(int32 only) | | ConvertIndexNcInt32FastDiv | NC 维度索引转换 FastDiv 版本(int32 only) | **说明**:新增函数仅支持 int32 类型,模板参数简化为 <T1, IS_CHECK_RANGE>。 ### 2. Identity 优化路径 修改 max_pool_grad_nchw_small_kernel.h: - 新增 IdentityCopyGradToOutput() 函数 - Process() 中判断 ksize==1 && stride==1 时跳过 Forward/Backward 计算,直接拷贝 cpp if (isIdentity) { Base::CopyInGrad(); IdentityCopyGradToOutput(); // 直接拷贝 Base::CopyOut(); } else { // 原有流程 } ## 性能收益 - FastDiv 替代 Div:除法运算性能提升约 2-3 倍 - Identity 优化:ksize=1 && stride=1 场景跳过 max 计算,性能显著提升 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> [#2684](https://gitcode.com/cann/ops-nn/issues/2684) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 基本功能回归、性能测试、门槛测试、冒烟测试 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> NA ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [x] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!4469 | 2 个月前 | |
增加部分index、pooling类算子op_host ut Co-authored-by: SimonZzz<zhouquan79@huawei.com> # message auto-generated for no-merge-commit merge: !5389 merge fixpoolingut into master 增加部分index、pooling类算子op_host ut Created-by: SimonZzz Commit-by: SimonZzz Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 增加部分index、pooling类算子op_host ut ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/2929 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ut测试通过 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5389 | 2 个月前 | |
maxPoolGrad simd模板 Co-authored-by: liuchuangdev<liuchuang51@huawei.com> Co-authored-by: qq_52056150<wangshuo179@huawei.com> Co-authored-by: oah28<wujiahao37@huawei.com> # message auto-generated for no-merge-commit merge: !4252 merge max_pool_grad_merge into master maxPoolGrad simd模板 Created-by: liuchuangdev Commit-by: qq_52056150;oah28;liuchuangdev Merged-by: cann-robot Description: ## 描述 ## 一、功能概述 ### 1.1 背景 MaxPoolGrad算子是深度学习中常用的反向传播算子,用于计算池化操作的梯度。针对不同的kernel大小和输入shape,需要不同的计算策略以实现最优性能: - **小kernel场景**:需要高向量化利用率,批量处理减少循环开销 - **大kernel场景**:需要支持kernel分割,避免UB溢出 - **通用场景**:需要支持多种数据格式(NCHW/NHWC)和索引类型(int32/int64) 传统单模式实现难以兼顾所有场景的性能需求,因此设计了**SIMD多模式模板系统**。 ### 1.2 核心特性 本PR实现了完整的SIMD模板系统,包含以下核心特性: | 特性 | 描述 | 技术优势 | |------|------|---------| | **三种Kernel模式** | SmallKernel、BigKernel、SIMT | 自动适配不同场景,性能最优 | | **编译期模板选择** | ASCENDC_TPL机制 | 零运行时开销,编译期确定实现路径 | | **多数据格式支持** | NCHW/NHWC双格式 | 覆盖主流框架需求(PyTorch/TensorFlow) | | **多索引类型支持** | int32/int64双类型 | 兼容不同argmax精度需求 | | **边界检查控制** | IS_CHECK_RANGE开关 | 针对不同场景优化性能 | | **向量API优化** | MicroAPI批量处理 | 高向量化利用率,减少指令数 | ## 二、代码结构 ### 2.1 文件组织 pooling/max_pool_grad/ ├── op_kernel/ │ ├── max_pool_grad.cpp # 主Kernel模板入口 │ ├── arch35/ │ │ ├── max_pool_grad_struct.h # 模板参数定义(ASCENDC_TPL) │ │ ├── max_pool_grad_simt.h # SIMT模式实现 │ │ ├── max_pool_grad_nchw_small_kernel.h # SmallKernel模式实现 │ │ ├── max_pool_grad_nchw_big_kernel.h # BigKernel模式实现 │ │ ├── max_pool_grad_nchw_backward_base.h # Backward公共基类 │ │ └── max_pool_grad_simt.h # SIMT通用实现 │ └── pool_grad_common/ │ └── arch35/ │ ├── max_pool_grad_with_argmax_base_common.h # 公共函数(Gather/Scatter) │ └── max_pool_grad_nchw_scatter_common.h # Scatter处理实现 ├── op_host/ │ └── arch35/ │ ├── max_pool_grad_tiling.cpp # Tiling实现(选择Kernel模式) │ └── max_pool_grad_tiling_simt.cpp # SIMT专用Tiling ├── tests/ │ ├── ut/ │ │ └ op_host/ │ │ └── test_max_pool_grad_tiling.cpp # Tiling UT测试 │ └── st/ │ └── test_max_pool_grad_st.py # ST性能测试 └── docs/ ├── max_pool_grad_doc.md # 算子文档 └── max_pool_grad_simd_template_pr.md # 本PR文档 ### 2.2 关键类关系图 ┌────────────────────────────────────────────┐ │ max_pool_grad<模板参数> │ │ - KERNEL_MODE │ │ - FORMAT │ │ - INDICES_DTYPE │ │ - IS_CHECK_RANGE │ └────────────────────────────────────────────┘ ↓ if constexpr ┌───────────────┼───────────────┐ ↓ ↓ ↓ ┌─────────┐ ┌─────────┐ ┌─────────┐ │SmallKernel│ │BigKernel │ │ SIMT │ │ Mode │ │ Mode │ │ Mode │ └─────────┘ └─────────┘ └─────────┘ ↓ ↓ ↓ ┌─────────────────────────────────────────────┐ │ MaxPoolGradNCHWBackwardBase(公共基类) │ │ - BackwardCompute(Scatter处理) │ │ - CopyInGrad / CopyOut │ │ - ScalarCompute(Tiling计算) │ └─────────────────────────────────────────────┘ --- ## 关联的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!4252 | 3 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 3 个月前 |