| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
docs目录基本概念md中文名改为英文名 Co-authored-by: chenjiao<chenjiao31@huawei.com> # message auto-generated for no-merge-commit merge: !7857 merge master into master docs目录基本概念md中文名改为英文名 Created-by: gitcode-chenjiao Commit-by: gitcode-chenjiao;chenjiao Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> docs目录基本概念md文件名改为英文: 避免link中的中文字符引发的跳转异常,例如两段式接口.md变成%E4%B8%A4%E6%AE%B5%E5%BC%8F%E6%8E%A5%E5%8F%A3.md,不易于维护,可能导致其他平台跳转有问题。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> [#4260](https://gitcode.com/cann/ops-nn/issues/4260) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ok ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> docs/zh/context所有md和对应的link ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7857 | 4 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 21 天前 | |
【社区任务】AscendC实现IndexFillD算子贡献 Co-authored-by: StarLightOn<594406837@qq.com> # message auto-generated for no-merge-commit merge: !4146 merge submit-index_fill_d into master 【社区任务】AscendC实现IndexFillD算子贡献 Created-by: StarLightOn Commit-by: StarLightOn Merged-by: cann-robot Description: ## 描述 ### 背景信息 基于IndexFillD算子历史TBE版本使用Ascend C编程语言进行优化。 ### TBE源码分析 IndexFillD算子(TBE)实现路径和相关API路径 IndexFillD算子实现路径为:${INSTALL_PATH}/opp/built-in/op_impl/ai_core/tbe/impl/ops_legacy/dynamic/index_fill_d.py IndexFillD算子信息库路径:${INSTALL_PATH}/opp/built-in/op_impl/ai_core/tbe/config/ascend910b/aic-ascend910b-ops-info-legacy.json 通过对IndexFillD算子TBE版本的功能分析,当前支持的能力如下: ① 算子支持float32、float16、bfloat16、int32、bool、int64格式的输入输出。(ascendC无需支持int64,且将bool视为int8即可) ② 对于浮点类型(float32, float16),底层逻辑使用 vcmpsel 结合 assist1 构成的掩码和 assist2 进行选择;针对 bfloat16 类型,先强制转换提升精度到 fp32 进行计算,最后通过 round 转回原来的数据进行输出。 ③ 对于整型和布尔类型,底层逻辑为 $x \times assist_1 + assist_2$。当输入为 int8 或 bool 时,先转换至 int32 防溢出计算,结果再转换回原类型。 - 接口功能:结合前端框架(如 PyTorch)的逻辑,在适配层构造出辅助张量 assist1 与 assist2 后,完成对输入张量 x 的特定位置替换填充。 - 计算公式: 浮点型逻辑: $$ y = \begin{cases} x & \text{if } assist_1 > 0 \\ assist_2 & \text{otherwise} \end{cases} $$ 整型逻辑: $$ y = x \times assist_1 + assist_2 $$ > 适配层保证了不考虑广播场景,故所有输入张量(x, assist1, assist2)shape 均一致。 IndexFillD算子TBE版本的整体流程图如下图所示:  ## 需求分析 ### 外部组件依赖 不涉及 ### 内部适配模块 适配aclnn接口调用 ### 算子原型 | 名称 | 类别 | 数据类型 | format | shape | |--|--|--|--|--| | x | 输入 | float、float16、bfloat16、int32、int8 | ND | all | | assist1 | 输入 | float、float16、bfloat16、int32、int8 | ND | all | | assist2 | 输入 | float、float16、bfloat16、int32、int8 | ND | all | | y | 输出 | float、float16、bfloat16、int32、int8 | ND | all | | dim | 属性 | int | - | - | *(注:由于底层实现中针对int8类型处理逻辑可覆盖bool类型,实际支持数据类型与TBE版本对齐)* ### 算子支持型号 Atlas A2 训练系列产品/Atlas 800I A2推理产品 ## 需求详细设计 ### 使能方式 | 上层框架 |涉及的框架勾选 | |--|--| | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅| | OPAT调优 | | | SGAT子图切分 | | ## 需求总体设计 ### host侧设计方案 算子计算过程不涉及数据的维度信息,故在host侧将数据视为一维向量,仅考虑数据个数,不考虑数据维度信息。 任务均分:根据输入长度 inputNum 和预设的 TILE_SPLIT_NUM 动态调整 coreNum,通过 CalculateCoreBlockNums 确保每个核心处理的数据块数均匀。 批量搬运:根据不同数据类型的空间占用(如 fp32为5倍,bfloat16为7倍,int32为4倍,int8为7倍)计算UB空间复用情况,推导 tileBlockNum 和 tileDataNum。通过 finalSmallTileNum 和 finalBigTileNum 确定大小核的循环次数,并针对尾块(Tail Data)进行了专门处理以避免数据碎片。 #### 1) 分核策略 优先使用满核的原则。 如果核间能均分,可视作无大小核区分,大核小核数据块一致; 如果核间不能均分,利用 tailBlockNum = (inputLengthAlgin / BLOCK_SIZE) % coreNum 将余出的数据块优先分配到前几个大核上,确保硬件利用率最大化。 #### 2) 数据分块和内存优化策略 充分使用UB空间的原则。 在 GetShapeAttrsInfo 阶段,针对不同数据类型定义了 ubDataNumber 权重(例如,bfloat16因为涉及类型转换和mask保存,需要较大的UB空间配额)。 动态判定 Buffer 策略:计算单流水总内存占用,若 singleBufferNeedSize <= coreNum * ubSize,则使用 SINGLE_BUFFER_NUM 提升单核性能上限;若空间紧张则评估双缓冲 DOUBLE_BUFFER_NUM(代码中目前出于最优性能测试考虑,默认锁定单流水,实际调优可放开)。 最终的 tileBlockNum 将据此规划出单次 Process 中运算的精确数据切片大小。 #### 3) tilingkey规划策略 基于 Buffer 策略划分 TilingKey:双缓冲为 ELEMENTWISE_TPL_SCH_MODE_0,单缓冲为 ELEMENTWISE_TPL_SCH_MODE_1。Kernel 侧主要依靠 C++ if constexpr 的模板元编程能力在编译期根据数据类型展开分支。 ### kernel侧设计方案 进行 Init 和 Process 两个阶段,其中 Process 包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。 由于涉及3个输入向量和大量中间结果(Mask生成,Cast提精度转换),本算子广泛应用了 **UB 空间复用**。比如计算掩码和精度强转时,不同变量内存通过模板和 ReinterpretCast 分时重用,降低 UB 并发压力。 针对常数判断使用 CompareScalar 替代 Tensor 比较,针对 Tensor 和 Scalar 混合场景选择合适的 SELMODE,从而减少辅助内存占用。 依据TBE实现平移逻辑: - 16位(bfloat16)时,由 castBuf 做桥梁,转换为 float 进行掩码和 Select 运算,再转回原类型。 - int8_t 小数据量类型时,转为 int16_t 处理乘加操作,防止计算中途溢出。 Ascend C的IndexFillD算子流程见下图。  ### 算子约束限制 - 暂不考虑广播,三个输入(x, assist1, assist2)需要严格相同的shape。 - 输入和输出的dtype保持强一致性。 ## 特性交叉分析可维可测分析 ### 精度标准/性能标准 | 验收标准 | 描述 | 来源 | |--|--|--| |精度标准 | 不低于tbe版本 | 历史tbe对标 | | 性能标准 | 不低于tbe版本 | 历史tbe对标 | ### 兼容性分析 新Ascend C算子替代原TBE算子,对外接口保持一致,不涉及兼容性中断。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2267 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 包含ut测试 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 包含IndexFillD算子docs ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:社区任务贡献 See merge request: cann/ops-nn!4146 | 1 个月前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 21 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 21 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 21 天前 | |
【社区任务】AscendC实现IndexFillD算子贡献 Co-authored-by: StarLightOn<594406837@qq.com> # message auto-generated for no-merge-commit merge: !4146 merge submit-index_fill_d into master 【社区任务】AscendC实现IndexFillD算子贡献 Created-by: StarLightOn Commit-by: StarLightOn Merged-by: cann-robot Description: ## 描述 ### 背景信息 基于IndexFillD算子历史TBE版本使用Ascend C编程语言进行优化。 ### TBE源码分析 IndexFillD算子(TBE)实现路径和相关API路径 IndexFillD算子实现路径为:${INSTALL_PATH}/opp/built-in/op_impl/ai_core/tbe/impl/ops_legacy/dynamic/index_fill_d.py IndexFillD算子信息库路径:${INSTALL_PATH}/opp/built-in/op_impl/ai_core/tbe/config/ascend910b/aic-ascend910b-ops-info-legacy.json 通过对IndexFillD算子TBE版本的功能分析,当前支持的能力如下: ① 算子支持float32、float16、bfloat16、int32、bool、int64格式的输入输出。(ascendC无需支持int64,且将bool视为int8即可) ② 对于浮点类型(float32, float16),底层逻辑使用 vcmpsel 结合 assist1 构成的掩码和 assist2 进行选择;针对 bfloat16 类型,先强制转换提升精度到 fp32 进行计算,最后通过 round 转回原来的数据进行输出。 ③ 对于整型和布尔类型,底层逻辑为 $x \times assist_1 + assist_2$。当输入为 int8 或 bool 时,先转换至 int32 防溢出计算,结果再转换回原类型。 - 接口功能:结合前端框架(如 PyTorch)的逻辑,在适配层构造出辅助张量 assist1 与 assist2 后,完成对输入张量 x 的特定位置替换填充。 - 计算公式: 浮点型逻辑: $$ y = \begin{cases} x & \text{if } assist_1 > 0 \\ assist_2 & \text{otherwise} \end{cases} $$ 整型逻辑: $$ y = x \times assist_1 + assist_2 $$ > 适配层保证了不考虑广播场景,故所有输入张量(x, assist1, assist2)shape 均一致。 IndexFillD算子TBE版本的整体流程图如下图所示:  ## 需求分析 ### 外部组件依赖 不涉及 ### 内部适配模块 适配aclnn接口调用 ### 算子原型 | 名称 | 类别 | 数据类型 | format | shape | |--|--|--|--|--| | x | 输入 | float、float16、bfloat16、int32、int8 | ND | all | | assist1 | 输入 | float、float16、bfloat16、int32、int8 | ND | all | | assist2 | 输入 | float、float16、bfloat16、int32、int8 | ND | all | | y | 输出 | float、float16、bfloat16、int32、int8 | ND | all | | dim | 属性 | int | - | - | *(注:由于底层实现中针对int8类型处理逻辑可覆盖bool类型,实际支持数据类型与TBE版本对齐)* ### 算子支持型号 Atlas A2 训练系列产品/Atlas 800I A2推理产品 ## 需求详细设计 ### 使能方式 | 上层框架 |涉及的框架勾选 | |--|--| | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅| | OPAT调优 | | | SGAT子图切分 | | ## 需求总体设计 ### host侧设计方案 算子计算过程不涉及数据的维度信息,故在host侧将数据视为一维向量,仅考虑数据个数,不考虑数据维度信息。 任务均分:根据输入长度 inputNum 和预设的 TILE_SPLIT_NUM 动态调整 coreNum,通过 CalculateCoreBlockNums 确保每个核心处理的数据块数均匀。 批量搬运:根据不同数据类型的空间占用(如 fp32为5倍,bfloat16为7倍,int32为4倍,int8为7倍)计算UB空间复用情况,推导 tileBlockNum 和 tileDataNum。通过 finalSmallTileNum 和 finalBigTileNum 确定大小核的循环次数,并针对尾块(Tail Data)进行了专门处理以避免数据碎片。 #### 1) 分核策略 优先使用满核的原则。 如果核间能均分,可视作无大小核区分,大核小核数据块一致; 如果核间不能均分,利用 tailBlockNum = (inputLengthAlgin / BLOCK_SIZE) % coreNum 将余出的数据块优先分配到前几个大核上,确保硬件利用率最大化。 #### 2) 数据分块和内存优化策略 充分使用UB空间的原则。 在 GetShapeAttrsInfo 阶段,针对不同数据类型定义了 ubDataNumber 权重(例如,bfloat16因为涉及类型转换和mask保存,需要较大的UB空间配额)。 动态判定 Buffer 策略:计算单流水总内存占用,若 singleBufferNeedSize <= coreNum * ubSize,则使用 SINGLE_BUFFER_NUM 提升单核性能上限;若空间紧张则评估双缓冲 DOUBLE_BUFFER_NUM(代码中目前出于最优性能测试考虑,默认锁定单流水,实际调优可放开)。 最终的 tileBlockNum 将据此规划出单次 Process 中运算的精确数据切片大小。 #### 3) tilingkey规划策略 基于 Buffer 策略划分 TilingKey:双缓冲为 ELEMENTWISE_TPL_SCH_MODE_0,单缓冲为 ELEMENTWISE_TPL_SCH_MODE_1。Kernel 侧主要依靠 C++ if constexpr 的模板元编程能力在编译期根据数据类型展开分支。 ### kernel侧设计方案 进行 Init 和 Process 两个阶段,其中 Process 包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。 由于涉及3个输入向量和大量中间结果(Mask生成,Cast提精度转换),本算子广泛应用了 **UB 空间复用**。比如计算掩码和精度强转时,不同变量内存通过模板和 ReinterpretCast 分时重用,降低 UB 并发压力。 针对常数判断使用 CompareScalar 替代 Tensor 比较,针对 Tensor 和 Scalar 混合场景选择合适的 SELMODE,从而减少辅助内存占用。 依据TBE实现平移逻辑: - 16位(bfloat16)时,由 castBuf 做桥梁,转换为 float 进行掩码和 Select 运算,再转回原类型。 - int8_t 小数据量类型时,转为 int16_t 处理乘加操作,防止计算中途溢出。 Ascend C的IndexFillD算子流程见下图。  ### 算子约束限制 - 暂不考虑广播,三个输入(x, assist1, assist2)需要严格相同的shape。 - 输入和输出的dtype保持强一致性。 ## 特性交叉分析可维可测分析 ### 精度标准/性能标准 | 验收标准 | 描述 | 来源 | |--|--|--| |精度标准 | 不低于tbe版本 | 历史tbe对标 | | 性能标准 | 不低于tbe版本 | 历史tbe对标 | ### 兼容性分析 新Ascend C算子替代原TBE算子,对外接口保持一致,不涉及兼容性中断。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2267 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 包含ut测试 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 包含IndexFillD算子docs ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:社区任务贡献 See merge request: cann/ops-nn!4146 | 1 个月前 | |
README文档+aclnn文档问题修改 Co-authored-by: weike<weike13@huawei.com> # message auto-generated for no-merge-commit merge: !6982 merge master into master README文档+aclnn文档问题修改 Created-by: m0_55003149 Commit-by: weike Merged-by: cann-robot Description: ## 描述 README文档+aclnn文档问题修改 ## 关联的Issue #3800 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 rnn/thnn_fused_lstm_cell_grad/README.md rnn/thnn_fused_lstm_cell/README.md rnn/single_layer_lstm_grad/README.md rnn/gru/README.md pooling/max_pool_v2/README.md pooling/max_pool_grad_with_argmax/README.md pooling/avg_pool_v2_grad/README.md pooling/avg_pool/README.md pooling/adaptive_avg_pool2d_grad/README.md index/unsorted_segment_max/README.md index/top_k_top_p_sample_v2/README.md index/top_k_top_p_sample/README.md index/index_check/README.md index/index/README.md index/bucketize_v2/README.md rnn/single_layer_lstm_grad/docs/aclnnLstmBackward.md rnn/gru/docs/aclnnGRU.md index/top_k_top_p_sample_v2/docs/aclnnTopKTopPSampleV2.md index/top_k_top_p_sample/docs/aclnnTopKTopPSample.md index/scatter_elements_v2/docs/aclnnScatterValue&aclnnInplaceScatterValue.md index/scatter_elements_v2/docs/aclnnScatterReduce&aclnnInplaceScatterReduce.md index/scatter_elements_v2/docs/aclnnScatter&aclnnInplaceScatter.md index/scatter_add/docs/aclnnScatterAdd.md index/index/docs/aclnnIndex.md index/bucketize_v2/docs/aclnnBucketize.md experimental/index/index_fill_d/README.md experimental/control/sleep/README.md experimental/control/sleep/docs/aclnnSleep.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6982 | 21 天前 |
IndexFillD
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
功能说明
-
接口功能:沿输入self的给定轴dim,将index指定位置的值使用value进行替换。
-
示例: 输入self为:
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
若dim = 0,index = [0, 2],value = 0时,算子的计算结果为:
[[0, 0, 0],
[4, 5, 6],
[0, 0, 0]]
若dim = 1,index = [0, 2],value = 0时,算子的计算结果为:
[[0, 2, 0],
[0, 5, 0],
[0, 8, 0]]
参数说明
| 参数名 | 输入/输出 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| self | 输入 | 功能示例中的self,即待被在指定位置的值用value替换的张量。 | FLOAT16、FLOAT、INT32、INT64、BOOL、BFLOAT16 | ND |
| dim | 输入 | 指定了self将要填充的维度。当self为1-8维时,dim的取值范围在[-self.dim(), self.dim()),当self为0维时,dim的取值范围在[-1, 1)。 | int64 | - |
| index | 输入 | 指定self在dim维度将要填充的下标。其中的元素值小于self对应dim的维度大小。 | - | - |
| value | 输入 | 指定填充的数据值。需要可转化为self的数据类型。 | 与self一致 | - |
| out | 输出 | 指定的输出张量。 | 与self一致 | ND |
约束说明
无
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| aclnn调用 | test_aclnn_index_fill_tensor | 通过aclnnIndexFillTensor接口方式调用IndexFillD算子。 |
贡献说明
| 贡献者 | 贡献方 | 贡献算子 | 贡献时间 | 贡献内容 |
|---|---|---|---|---|
| Nice_try | 个人开发者 | IndexFillD | 2026/4/23 | IndexFillD算子适配开源仓 |