| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
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 | 3 个月前 | |
【社区任务】ForeachExp支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5454 merge submit-ForeachExp into master 【社区任务】ForeachExp支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、基本信息 ### 1.1 需求来源 ForeachExp 算子是深度学习框架对应的昇腾算子实现,核心语义为:对输入张量列表(Tensor List)中的每个张量逐元素执行 $y = e^x$ 运算,返回结果张量列表。 当前 aclnnForeachExp 算子开源仓(ops-nn)仅支持浮点数据类型。为满足更广泛的端侧推理及量化场景需求,本方案在现有代码基础上再开发,新增 INT16(int16_t)、INT8(int8_t)、UINT8(uint8_t)三种整数数据类型的支持,完成算子泛化适配,并最终合入昇腾算子开源仓。 ### 1.2 背景介绍 #### 1.2.1 现有 ForeachExp 算子实现分析 现有 ForeachExp 算子的核心底层逻辑复用了 foreach_utils 目录下的 ForeachImplictOutput 模板。 现有实现路径:[https://gitcode.com/cann/ops-nn/tree/master/foreach/foreach_exp](https://gitcode.com/cann/ops-nn/tree/master/foreach/foreach_exp) #### 1.2.2 现有版本支持能力 | 参数 | 参数含义 | 数据类型支持 | 数据类型约束 | 形状 | | :--- | :--- | :--- | :--- | :--- | | x | 输入张量列表 | FLOAT32, FLOAT16, BFLOAT16 | 列表中所有 Tensor 数据类型一致 | 0-8 维 ND | | y | 输出张量列表 | 与 x 一致 | shape size $\ge$ x 的 shape size | 0-8 维 ND | #### 1.2.3 核心计算逻辑 计算公式: $x = [x_0, x_1, ... x_{n-1}]$ $y = [y_0, y_1, ... y_{n-1}]$ $y_i = e^{x_i} \quad (i=0,1,...n-1)$ **Kernel 侧计算特性:** 当前底层通过传入 Exp 操作符给 ForeachImplictOutput 模板进行实例化。对于 half 和 float,直接在 V 单元执行 Exp 指令;对于 bfloat16_t,框架内部已经通过 InnerComputer 特化实现了 Cast (提升至 float32) $\rightarrow$ Exp $\rightarrow$ Cast (还原回 bfloat16_t) 的流程。新增的整数类型也将完全复用这一 Cast 特化机制。 --- ## 二、需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供 $int8_t \leftrightarrow float$、$uint8_t \leftrightarrow float$、$int16_t \leftrightarrow float$ 的类型转换及饱和截断支持。 * 依赖 foreach_utils 中的 ForeachImplictOutput 模板类及 ForeachCommonTiling 分核策略。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | :--- | :--- | :--- | | op_host | foreach_exp_def.cpp | 扩展 tensor_dtype_list,新增 DT_INT16 / DT_INT8 / DT_UINT8 | | op_host | foreach_exp_binary.json | 在对应架构下新增三种整数类型的 JSON 配置条目 | | op_kernel | foreach_exp.cpp | 新增 TILING_KEY_INT16(5) / INT8(7) / UINT8(8) 分支 | | op_kernel | foreach_implict_output.h | 扩展 InnerComputer 对 int16_t, int8_t, uint8_t 转换 float 的模板特化 | | docs/README | 文档与 README | 更新支持的数据类型列表和数值截断说明 | | tests/examples | 测试框架 | 新增泛化场景的整数类型单元测试与 API 测试 | --- ## 三、需求模块设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | :--- | :--- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | | OPAT调优 | | | SGAT子图切分 | | ### 3.2 算子原型定义(变更后) 原型注册文件中,新增对目标数据类型的支持: cpp std::vector<ge::DataType> tensor_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_BF16, ge::DT_INT16, ge::DT_INT8, ge::DT_UINT8 }; std::vector<ge::Format> format_list(tensor_dtype_list.size(), ge::FORMAT_ND); this->Input("x") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Output("y") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->AICore().AddConfig("ascend910_93"); this->AICore().AddConfig("ascend910b"); ### 3.3 详细设计 #### 3.3.1 Host 侧设计 * **分核策略**:继续沿用 ForeachCommonTiling,根据 Tensor 数量及总元素个数进行 usedCoreNum 计算与负载均衡切分,无需做逻辑改动。 * **UB 内存分布与 TilingKey**:框架已在 common_dtype.h 中预定义了枚举,新增类型映射为:TILING_KEY_INT16=5,TILING_KEY_INT8=7,TILING_KEY_UINT8=8。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_exp.cpp 主干中补充路由分支: cpp // ... 前置的 FLOAT16, FLOAT32, BFLOAT16 分支 ... } else if (TILING_KEY_IS(5)) { ForeachImplictOutput<int16_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { ForeachImplictOutput<int8_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { ForeachImplictOutput<uint8_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } **3.3.2.2 扩展 InnerComputer 模板特化** 在 foreach_implict_output.h 中,为了让整数类型能够调用浮点 Exp 算子,需仿照 bfloat16_t 补充三组特化。以下以 int16_t 为例: cpp #if __CCE_AICORE__ >= 220 template <ImplictOutputOp<float>* op, uint8_t paramsCount> class InnerComputer<int16_t, float, op, paramsCount> { public: __aicore__ inline void Compute( LocalTensor<int16_t>& dataLocal, LocalTensor<float>& float32Tensor, uint32_t maxCastDataCount, int64_t dataCount) { uint32_t castTimes = dataCount / maxCastDataCount; uint32_t castTimesRemainder = dataCount % maxCastDataCount; for (uint32_t i = 0; i < castTimes; i++) { ComputePerCast(dataLocal, float32Tensor, maxCastDataCount, i, maxCastDataCount); } if (castTimesRemainder > 0) { ComputePerCast(dataLocal, float32Tensor, maxCastDataCount, castTimes, castTimesRemainder); } } private: __aicore__ inline void ComputePerCast( LocalTensor<int16_t>& dataLocal, LocalTensor<float>& float32Tensor, uint32_t maxCastDataCount, uint32_t index, int64_t dataCount) { PipeBarrier<PIPE_V>(); Cast(float32Tensor, dataLocal[index * maxCastDataCount], RoundMode::CAST_NONE, dataCount); PipeBarrier<PIPE_V>(); uint32_t offset = (paramsCount == 1) ? 0 : maxCastDataCount; op(float32Tensor[offset], float32Tensor, dataCount); // 核心计算:Exp PipeBarrier<PIPE_V>(); // 注意:此处转回整型使用 CAST_RINT(四舍五入)或依赖默认的饱和截断行为 Cast(dataLocal[index * maxCastDataCount], float32Tensor[offset], RoundMode::CAST_RINT, dataCount); PipeBarrier<PIPE_V>(); } }; #endif // 同理,补充 <int8_t, float, ...> 和 <uint8_t, float, ...> 的特化 **3.3.2.3 数值溢出与截断行为** 由于 $e^x$ 增长极快(例如 $x=10$ 时,结果约为 $22026.46$),该数值已远超 INT8 和 UINT8 的表示范围。在最终执行 Cast(float32 -> int) 时,硬件底层触发饱和截断:超出数据类型最大值的结果将饱和为该类型的最大值(如 INT8 饱和为 127,UINT8 饱和为 255)。 **3.3.2.4 Ascend C 实现流程图 (PlantUML)**  ### 3.4 支持硬件 * Atlas A2 训练系列产品 / Atlas 800I A2 推理产品 * Atlas A3 系列产品 ### 3.5 算子约束限制 1. **数据类型对齐强制性约束**:需要特别注意的是,在算子构建阶段,如果遇到未注册的数据类型(如框架侧下发了未支持的 dtype),CANN 软件栈的预期行为是直接构建报错并停止运行,而不会触发回退机制将算子标记为 CPU 执行。因此,Host 侧的原型注册必须与 Kernel 侧的类型分发(TilingKey 分支及 Template 特化)严格对齐,不可遗漏。 2. **输入输出类型一致性**:输入 x 张量列表内所有元素的数据类型必须完全一致,且与输出 y 张量列表的数据类型保持绝对一致。 --- ## 四、验收标准 | 验收标准 | 描述 | | :--- | :--- | | **功能标准** | 算子能够正确处理 INT16、INT8、UINT8 输入的 Exp 运算,能够正常处理多 Tensor 列表输入输出。 | | **精度标准** | 严格符合 AscendOpTest 默认阈值。由于是整数运算,基准测试逻辑需设定为:输入转换为 float64 -> 计算 np.exp -> np.round -> 转换为对应整数类型(并验证溢出时的饱和截断行为是否与 CPU 侧对齐)。 | | **泛化标准** | 支撑 0-8 维、不同 Tensor 大小组合及空张量的合法输入场景。 | --- ## 五、可维可测分析 ### 5.1 精度/性能标准 * **精度**:按照 4.0 验收标准执行,重点通过 UT 验证 $x \le 0$ 时是否下溢截断正确,以及 $x$ 较大时饱和为该类型最大正数是否正确。 * **性能**:新增分支性能须对齐已有的 BFLOAT16 逻辑,确保流水线中 MTE2 -> V -> V -> V -> MTE3 的并行度未被破坏,打满系统带宽或 V 单元算力极限。 ### 5.2 兼容性分析 该开发任务为纯粹的类型扩展,向后兼容原有框架的所有特性,不改变现有浮点类型的计算逻辑与 Tiling 策略,对存量业务零影响。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2867 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachExp.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5454 | 3 个月前 | |
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 | 3 个月前 | |
foreachaddlistV2算子 tiling bug 修复 Co-authored-by: zhaozhongyao<zhaozhongyao2@huawei.com> # message auto-generated for no-merge-commit merge: !7408 merge master into master foreachaddlistV2算子 tiling bug 修复 Created-by: zhaozhongyao Commit-by: zhaozhongyao Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> foreach_add_listV2算子tiling bug导致kernel侧重复计算,出现精度问题 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/4046 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 已验证精度pass ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7408 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !6980 merge feat/foreach-non-contiguous into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 描述 foreach系列算子支持非连续输入和输出,涉及7个接口: - aclnnForeachSqrt - aclnnForeachDivScalar - aclnnForeachDivList - aclnnForeachMulList - aclnnForeachAddList - aclnnForeachAddcdivScalar - aclnnForeachLerpList 实现方式: - 非连续输入通过l0op::Contiguous转换为连续 - 非连续输出通过l0op::ViewCopy回写 - 新增foreach_utils共享helper(ForeachMakeContiguousTensorList/ForeachViewCopyToOutputTensorList,含空tensor跳过) - 修复CMakeLists.txt中foreach_utils头文件包含路径 ## 关联的Issue 暂无 ## 测试 - 在Ascend环境上通过ATK pyaclnn backend进行非连续精度测试,7个接口共1150用例全部通过 ## 文档更新 更新7个算子README约束说明为支持非连续Tensor ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 关联的Issue:#3994 See merge request: cann/ops-nn!6980 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
foreach_asin arch35 tiling 添加 GetPlatformInfoFallback逻辑,解决 GetCompileInfo 返回空指针导致 PTA 调用失败问题 Co-authored-by: surezz<zhangyuwei31@huawei.com> # message auto-generated for no-merge-commit merge: !7339 merge foreachAsin_modify into master foreach_asin arch35 tiling 添加 GetPlatformInfoFallback逻辑,解决 GetCompileInfo 返回空指针导致 PTA 调用失败问题 Created-by: surezz Commit-by: surezz Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> foreach_asin arch35 tiling 添加 GetPlatformInfoFallback逻辑,解决 GetCompileInfo 返回空指针导致 PTA 调用失败问题 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/4023 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> temu脚本调用成功,相关ut脚本调用成功,二级冒烟,david冒烟 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7339 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
修复ForeachCopy算子 Co-authored-by: u010470851<shangguanqinnan@huawei.com> # message auto-generated for no-merge-commit merge: !7146 merge fix_foreachcopy into master 修复ForeachCopy算子 Created-by: u010470851 Commit-by: u010470851 Merged-by: cann-robot Description: ## 描述 修复ForeachCopy性能问题 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联的Issue https://gitcode.com/cann/ops-nn/issues/3934 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 测试性能正常 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7146 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !6980 merge feat/foreach-non-contiguous into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 描述 foreach系列算子支持非连续输入和输出,涉及7个接口: - aclnnForeachSqrt - aclnnForeachDivScalar - aclnnForeachDivList - aclnnForeachMulList - aclnnForeachAddList - aclnnForeachAddcdivScalar - aclnnForeachLerpList 实现方式: - 非连续输入通过l0op::Contiguous转换为连续 - 非连续输出通过l0op::ViewCopy回写 - 新增foreach_utils共享helper(ForeachMakeContiguousTensorList/ForeachViewCopyToOutputTensorList,含空tensor跳过) - 修复CMakeLists.txt中foreach_utils头文件包含路径 ## 关联的Issue 暂无 ## 测试 - 在Ascend环境上通过ATK pyaclnn backend进行非连续精度测试,7个接口共1150用例全部通过 ## 文档更新 更新7个算子README约束说明为支持非连续Tensor ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 关联的Issue:#3994 See merge request: cann/ops-nn!6980 | 3 个月前 | |
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 | 3 个月前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !6980 merge feat/foreach-non-contiguous into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 描述 foreach系列算子支持非连续输入和输出,涉及7个接口: - aclnnForeachSqrt - aclnnForeachDivScalar - aclnnForeachDivList - aclnnForeachMulList - aclnnForeachAddList - aclnnForeachAddcdivScalar - aclnnForeachLerpList 实现方式: - 非连续输入通过l0op::Contiguous转换为连续 - 非连续输出通过l0op::ViewCopy回写 - 新增foreach_utils共享helper(ForeachMakeContiguousTensorList/ForeachViewCopyToOutputTensorList,含空tensor跳过) - 修复CMakeLists.txt中foreach_utils头文件包含路径 ## 关联的Issue 暂无 ## 测试 - 在Ascend环境上通过ATK pyaclnn backend进行非连续精度测试,7个接口共1150用例全部通过 ## 文档更新 更新7个算子README约束说明为支持非连续Tensor ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 关联的Issue:#3994 See merge request: cann/ops-nn!6980 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
【社区任务】ForeachExp支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5454 merge submit-ForeachExp into master 【社区任务】ForeachExp支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、基本信息 ### 1.1 需求来源 ForeachExp 算子是深度学习框架对应的昇腾算子实现,核心语义为:对输入张量列表(Tensor List)中的每个张量逐元素执行 $y = e^x$ 运算,返回结果张量列表。 当前 aclnnForeachExp 算子开源仓(ops-nn)仅支持浮点数据类型。为满足更广泛的端侧推理及量化场景需求,本方案在现有代码基础上再开发,新增 INT16(int16_t)、INT8(int8_t)、UINT8(uint8_t)三种整数数据类型的支持,完成算子泛化适配,并最终合入昇腾算子开源仓。 ### 1.2 背景介绍 #### 1.2.1 现有 ForeachExp 算子实现分析 现有 ForeachExp 算子的核心底层逻辑复用了 foreach_utils 目录下的 ForeachImplictOutput 模板。 现有实现路径:[https://gitcode.com/cann/ops-nn/tree/master/foreach/foreach_exp](https://gitcode.com/cann/ops-nn/tree/master/foreach/foreach_exp) #### 1.2.2 现有版本支持能力 | 参数 | 参数含义 | 数据类型支持 | 数据类型约束 | 形状 | | :--- | :--- | :--- | :--- | :--- | | x | 输入张量列表 | FLOAT32, FLOAT16, BFLOAT16 | 列表中所有 Tensor 数据类型一致 | 0-8 维 ND | | y | 输出张量列表 | 与 x 一致 | shape size $\ge$ x 的 shape size | 0-8 维 ND | #### 1.2.3 核心计算逻辑 计算公式: $x = [x_0, x_1, ... x_{n-1}]$ $y = [y_0, y_1, ... y_{n-1}]$ $y_i = e^{x_i} \quad (i=0,1,...n-1)$ **Kernel 侧计算特性:** 当前底层通过传入 Exp 操作符给 ForeachImplictOutput 模板进行实例化。对于 half 和 float,直接在 V 单元执行 Exp 指令;对于 bfloat16_t,框架内部已经通过 InnerComputer 特化实现了 Cast (提升至 float32) $\rightarrow$ Exp $\rightarrow$ Cast (还原回 bfloat16_t) 的流程。新增的整数类型也将完全复用这一 Cast 特化机制。 --- ## 二、需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供 $int8_t \leftrightarrow float$、$uint8_t \leftrightarrow float$、$int16_t \leftrightarrow float$ 的类型转换及饱和截断支持。 * 依赖 foreach_utils 中的 ForeachImplictOutput 模板类及 ForeachCommonTiling 分核策略。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | :--- | :--- | :--- | | op_host | foreach_exp_def.cpp | 扩展 tensor_dtype_list,新增 DT_INT16 / DT_INT8 / DT_UINT8 | | op_host | foreach_exp_binary.json | 在对应架构下新增三种整数类型的 JSON 配置条目 | | op_kernel | foreach_exp.cpp | 新增 TILING_KEY_INT16(5) / INT8(7) / UINT8(8) 分支 | | op_kernel | foreach_implict_output.h | 扩展 InnerComputer 对 int16_t, int8_t, uint8_t 转换 float 的模板特化 | | docs/README | 文档与 README | 更新支持的数据类型列表和数值截断说明 | | tests/examples | 测试框架 | 新增泛化场景的整数类型单元测试与 API 测试 | --- ## 三、需求模块设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | :--- | :--- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | | OPAT调优 | | | SGAT子图切分 | | ### 3.2 算子原型定义(变更后) 原型注册文件中,新增对目标数据类型的支持: cpp std::vector<ge::DataType> tensor_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_BF16, ge::DT_INT16, ge::DT_INT8, ge::DT_UINT8 }; std::vector<ge::Format> format_list(tensor_dtype_list.size(), ge::FORMAT_ND); this->Input("x") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Output("y") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->AICore().AddConfig("ascend910_93"); this->AICore().AddConfig("ascend910b"); ### 3.3 详细设计 #### 3.3.1 Host 侧设计 * **分核策略**:继续沿用 ForeachCommonTiling,根据 Tensor 数量及总元素个数进行 usedCoreNum 计算与负载均衡切分,无需做逻辑改动。 * **UB 内存分布与 TilingKey**:框架已在 common_dtype.h 中预定义了枚举,新增类型映射为:TILING_KEY_INT16=5,TILING_KEY_INT8=7,TILING_KEY_UINT8=8。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_exp.cpp 主干中补充路由分支: cpp // ... 前置的 FLOAT16, FLOAT32, BFLOAT16 分支 ... } else if (TILING_KEY_IS(5)) { ForeachImplictOutput<int16_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { ForeachImplictOutput<int8_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { ForeachImplictOutput<uint8_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } **3.3.2.2 扩展 InnerComputer 模板特化** 在 foreach_implict_output.h 中,为了让整数类型能够调用浮点 Exp 算子,需仿照 bfloat16_t 补充三组特化。以下以 int16_t 为例: cpp #if __CCE_AICORE__ >= 220 template <ImplictOutputOp<float>* op, uint8_t paramsCount> class InnerComputer<int16_t, float, op, paramsCount> { public: __aicore__ inline void Compute( LocalTensor<int16_t>& dataLocal, LocalTensor<float>& float32Tensor, uint32_t maxCastDataCount, int64_t dataCount) { uint32_t castTimes = dataCount / maxCastDataCount; uint32_t castTimesRemainder = dataCount % maxCastDataCount; for (uint32_t i = 0; i < castTimes; i++) { ComputePerCast(dataLocal, float32Tensor, maxCastDataCount, i, maxCastDataCount); } if (castTimesRemainder > 0) { ComputePerCast(dataLocal, float32Tensor, maxCastDataCount, castTimes, castTimesRemainder); } } private: __aicore__ inline void ComputePerCast( LocalTensor<int16_t>& dataLocal, LocalTensor<float>& float32Tensor, uint32_t maxCastDataCount, uint32_t index, int64_t dataCount) { PipeBarrier<PIPE_V>(); Cast(float32Tensor, dataLocal[index * maxCastDataCount], RoundMode::CAST_NONE, dataCount); PipeBarrier<PIPE_V>(); uint32_t offset = (paramsCount == 1) ? 0 : maxCastDataCount; op(float32Tensor[offset], float32Tensor, dataCount); // 核心计算:Exp PipeBarrier<PIPE_V>(); // 注意:此处转回整型使用 CAST_RINT(四舍五入)或依赖默认的饱和截断行为 Cast(dataLocal[index * maxCastDataCount], float32Tensor[offset], RoundMode::CAST_RINT, dataCount); PipeBarrier<PIPE_V>(); } }; #endif // 同理,补充 <int8_t, float, ...> 和 <uint8_t, float, ...> 的特化 **3.3.2.3 数值溢出与截断行为** 由于 $e^x$ 增长极快(例如 $x=10$ 时,结果约为 $22026.46$),该数值已远超 INT8 和 UINT8 的表示范围。在最终执行 Cast(float32 -> int) 时,硬件底层触发饱和截断:超出数据类型最大值的结果将饱和为该类型的最大值(如 INT8 饱和为 127,UINT8 饱和为 255)。 **3.3.2.4 Ascend C 实现流程图 (PlantUML)**  ### 3.4 支持硬件 * Atlas A2 训练系列产品 / Atlas 800I A2 推理产品 * Atlas A3 系列产品 ### 3.5 算子约束限制 1. **数据类型对齐强制性约束**:需要特别注意的是,在算子构建阶段,如果遇到未注册的数据类型(如框架侧下发了未支持的 dtype),CANN 软件栈的预期行为是直接构建报错并停止运行,而不会触发回退机制将算子标记为 CPU 执行。因此,Host 侧的原型注册必须与 Kernel 侧的类型分发(TilingKey 分支及 Template 特化)严格对齐,不可遗漏。 2. **输入输出类型一致性**:输入 x 张量列表内所有元素的数据类型必须完全一致,且与输出 y 张量列表的数据类型保持绝对一致。 --- ## 四、验收标准 | 验收标准 | 描述 | | :--- | :--- | | **功能标准** | 算子能够正确处理 INT16、INT8、UINT8 输入的 Exp 运算,能够正常处理多 Tensor 列表输入输出。 | | **精度标准** | 严格符合 AscendOpTest 默认阈值。由于是整数运算,基准测试逻辑需设定为:输入转换为 float64 -> 计算 np.exp -> np.round -> 转换为对应整数类型(并验证溢出时的饱和截断行为是否与 CPU 侧对齐)。 | | **泛化标准** | 支撑 0-8 维、不同 Tensor 大小组合及空张量的合法输入场景。 | --- ## 五、可维可测分析 ### 5.1 精度/性能标准 * **精度**:按照 4.0 验收标准执行,重点通过 UT 验证 $x \le 0$ 时是否下溢截断正确,以及 $x$ 较大时饱和为该类型最大正数是否正确。 * **性能**:新增分支性能须对齐已有的 BFLOAT16 逻辑,确保流水线中 MTE2 -> V -> V -> V -> MTE3 的并行度未被破坏,打满系统带宽或 V 单元算力极限。 ### 5.2 兼容性分析 该开发任务为纯粹的类型扩展,向后兼容原有框架的所有特性,不改变现有浮点类型的计算逻辑与 Tiling 策略,对存量业务零影响。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2867 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachExp.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5454 | 3 个月前 | |
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 | 3 个月前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !6980 merge feat/foreach-non-contiguous into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 描述 foreach系列算子支持非连续输入和输出,涉及7个接口: - aclnnForeachSqrt - aclnnForeachDivScalar - aclnnForeachDivList - aclnnForeachMulList - aclnnForeachAddList - aclnnForeachAddcdivScalar - aclnnForeachLerpList 实现方式: - 非连续输入通过l0op::Contiguous转换为连续 - 非连续输出通过l0op::ViewCopy回写 - 新增foreach_utils共享helper(ForeachMakeContiguousTensorList/ForeachViewCopyToOutputTensorList,含空tensor跳过) - 修复CMakeLists.txt中foreach_utils头文件包含路径 ## 关联的Issue 暂无 ## 测试 - 在Ascend环境上通过ATK pyaclnn backend进行非连续精度测试,7个接口共1150用例全部通过 ## 文档更新 更新7个算子README约束说明为支持非连续Tensor ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 关联的Issue:#3994 See merge request: cann/ops-nn!6980 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !6980 merge feat/foreach-non-contiguous into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 描述 foreach系列算子支持非连续输入和输出,涉及7个接口: - aclnnForeachSqrt - aclnnForeachDivScalar - aclnnForeachDivList - aclnnForeachMulList - aclnnForeachAddList - aclnnForeachAddcdivScalar - aclnnForeachLerpList 实现方式: - 非连续输入通过l0op::Contiguous转换为连续 - 非连续输出通过l0op::ViewCopy回写 - 新增foreach_utils共享helper(ForeachMakeContiguousTensorList/ForeachViewCopyToOutputTensorList,含空tensor跳过) - 修复CMakeLists.txt中foreach_utils头文件包含路径 ## 关联的Issue 暂无 ## 测试 - 在Ascend环境上通过ATK pyaclnn backend进行非连续精度测试,7个接口共1150用例全部通过 ## 文档更新 更新7个算子README约束说明为支持非连续Tensor ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 关联的Issue:#3994 See merge request: cann/ops-nn!6980 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
【社区任务】aclnnForeachRoundOffNumberV2 增加对 DT_INT16 数据类型的支持 Co-authored-by: Nice_try<nicetryzzw@163.com> # message auto-generated for no-merge-commit merge: !5446 merge dev-ForeachRoundOffNumberV2 into master 【社区任务】aclnnForeachRoundOffNumberV2 增加对 DT_INT16 数据类型的支持 Created-by: Nice_try Commit-by: Nice_try Merged-by: cann-robot Description: ## 描述 ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。为现有的 aclnnForeachRoundOffNumberV2 算子增加对 DT_INT16 数据类型的支持,以满足网络量化及端侧推理场景对底层核心算子的完备性要求。 ### 1.2 背景介绍 ForeachRoundOffNumberV2 算子用于对张量列表(Tensor List)执行逐元素的舍入操作(如向上取整、向下取整、四舍五入、截断等)。 根据最新算子原型定义,当前算子已支持 FLOAT16, FLOAT32, BFLOAT16。本项目要求在现有代码架构下,新增对 INT16 数据的支持。 > **核心设计洞察(语义优化)**: > 对于浮点数,Round 语义需要通过特定的硬件指令截取整数部分;但**对于整型(如 int16_t),其本身已是整数,不包含小数部分。** 因此: > 1. 在 CAST_FLOOR, CAST_CEIL, CAST_ROUND, CAST_TRUNC, CAST_RINT 语义下,**结果等于自身**。 > 2. 在 CAST_FRAC(取小数部分)语义下,**结果恒为 0**。 > > > 基于上述数学特性,针对 INT16 输入,我们**完全可以免除 V 单元昂贵的 Cast -> Convert -> Cast 数学计算过程,只进行纯粹的 DataCopy 搬运(或 Duplicate 清零)**。这将带来极大的性能收益。 ## 二、 需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 DataCopy 与 Duplicate API,用于整型的极速搬运与清零。 * 依赖原有的 ForeachRoundOffNumberND 隐式输出框架。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | --- | --- | --- | | op_host | foreach_round_off_number_def.cpp | 扩展原型 tensor_dtype_list,新增 DT_INT16。更新硬件配置,仅保留 ascend910_93 和 ascend910b。 | | op_host | foreach_tiling_func.cpp | **修改 UB 切分策略**:由于无需转为 float 计算,int16_t 仅需基于自身(2 Bytes)预留内存,无需 COPY_SPACE_MULTIPLE 放大。 | | op_kernel | foreach_round_off_number.cpp | 新增 TILING_KEY_IS(5) 路由分支,指向 int16_t 特化处理。 | | op_kernel | foreach_round_off_number.h | 扩展 InnerComputer 模板特化,新增 int16_t 的“零计算”搬运流水线。 | ## 三、 需求详细设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | --- | --- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | ### 3.2 算子原型设计 修改 op_host/foreach_round_off_number_def.cpp,同步更新数据类型并严格限制硬件架构: cpp explicit ForeachRoundOffNumber(const char* name) : OpDef(name) { // 输入/输出张量支持的 dtype 列表新增整型 std::vector<ge::DataType> tensor_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_BF16, ge::DT_INT16 // 新增 }; std::vector<ge::Format> format_list(tensor_dtype_list.size(), ge::FORMAT_ND); // RoundMode 的标量输入,需要和 tensor 列表数量对齐 std::vector<ge::DataType> scalarDtypeList(tensor_dtype_list.size(), ge::DT_INT8); this->Input("x") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Input("roundMode") .ParamType(REQUIRED) .DataType(scalarDtypeList) .Format(format_list) .UnknownShapeFormat(format_list); this->Output("y") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); // 仅保留 A2/A3 对应的系列 this->AICore().AddConfig("ascend910_93"); this->AICore().AddConfig("ascend910b"); } ### 3.3 详细设计 #### 3.3.1 Host 侧设计:UB 切分策略优化 在 foreach_tiling_func.cpp 中: * **浮点数 (bfloat16, half)**:计算时需转化为 float32,占据 4 Bytes,因此需要开启 COPY_SPACE_MULTIPLE(预留多倍转换缓冲)。 * **整型 (int16_t)**:采用**免计算只搬运**策略,无需任何中间转换缓存。Host 侧计算 ub_size 和 tileDataNum 时,直接按照 2 Bytes 满额切分。这使得 int16_t 的单次搬运数据量 (DataNum) 大幅增加,进一步提升性能。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 与 Init 拦截** 在 foreach_round_off_number.cpp 中新增入口: cpp #if __CCE_AICORE__ >= 220 else if (TILING_KEY_IS(5)) { ForeachRoundOffNumberND<int16_t> op; op.Init(x, roundMode, y, userWS, &tilingData); op.Process(); } #endif 在 foreach_round_off_number.h 的 Init 流程中,补充 int16_t 的纯净 Buffer 初始化: cpp } else if (std::is_same<T, int16_t>::value) { // 无需预留 COPY_SPACE_MULTIPLE,无需 float32Queue pipe.InitBuffer(dataQueue, BUFFER_NUM, inputsTensorUbSize); pipe.InitBuffer(outQueue, BUFFER_NUM, inputsTensorUbSize); maxDataCount = inputsTensorUbSize / sizeof(T); } **3.3.2.2 扩展 InnerComputer 模板特化(免计算策略)** 在 foreach_round_off_number.h 中,针对 int16_t 补充特化。对于整型,所有的标准舍入都是恒等映射。 cpp template <> class InnerComputer<int16_t> { public: __aicore__ inline void Compute( LocalTensor<int16_t>& dataLocal, LocalTensor<int16_t>& outLocal, LocalTensor<float>& float32Tensor, int8_t roundModeValue, uint32_t maxCastDataCount, int64_t dataCount) { if (roundModeValue == CAST_FRAC) { // 整型没有小数部分,直接输出全 0 Duplicate(outLocal, static_cast<int16_t>(0), dataCount); } else { // CEIL, FLOOR, ROUND, TRUNC, RINT, NONE // 结果等于自身,完全规避 V 单元算数计算,直接 UB-UB 搬运 DataCopy(outLocal, dataLocal, dataCount); } } }; #### 3.3.3 Ascend C 侧运行流程图  ### 3.4 支持硬件 * **Atlas A2 训练系列产品 / Atlas A3 系列产品** (对应 ascend910_93 及 ascend910b)。 ### 3.5 算子约束与异常拦截机制 1. **构建阻断拦截**:编译期与运行期如果遇到未注册的 dtype,将直接构建报错并失败,**不会触发向 CPU 执行的回退机制**。 2. **泛化要求**:对于 INT16 输入,y 的输出也必须为 INT16,尺寸保持一致,能正常处理多 Tensor 列表输入。 ## 四、 验收及可维可测标准 ### 4.1 精度与性能标准 * **精度标准**: * roundMode != CAST_FRAC:输出需完全等于输入,0 误差。 * roundMode == CAST_FRAC:输出需全为 0。 * **性能标准**:无。 ## 五、 变更文件清单 | 文件路径 | 变更类型 | 变更说明 | | --- | --- | --- | | op_host/foreach_round_off_number_def.cpp | 修改 | 原型扩展新增 INT16,自动对齐 scalar 类型;明确硬件配置仅含 ascend910_93 和 ascend910b。 | | op_host/config/.../foreach_round_off_number_binary.json | 修改 | 为对应硬件架构补充 INT16 的编译条目。 | | op_kernel/foreach_round_off_number.cpp | 修改 | 引入针对 TILING_KEY_IS(5) 的专属入口分发。 | | op_kernel/foreach_round_off_number.h | 修改 | 1. Init / Process 中对 int16_t 免除 float32Queue 内存分配。2. 补充 InnerComputer<int16_t> 模板特化计算流,实现纯搬运/清零策略。 | | op_host/op_api/aclnn_foreach_round_off_number_v2.cpp | 修改 | 新增支持数据类型 | | ../foreach_utils/op_host/foreach_tiling_class.h | 修改 | 调整 UB 切分策略:对于 INT16 放弃使用 COPY_SPACE_MULTIPLE,直接满额利用 UB。 | ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2979 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachRoundOffNumber.md、aclnnForeachRoundOffNumberV2.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5446 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !6980 merge feat/foreach-non-contiguous into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 描述 foreach系列算子支持非连续输入和输出,涉及7个接口: - aclnnForeachSqrt - aclnnForeachDivScalar - aclnnForeachDivList - aclnnForeachMulList - aclnnForeachAddList - aclnnForeachAddcdivScalar - aclnnForeachLerpList 实现方式: - 非连续输入通过l0op::Contiguous转换为连续 - 非连续输出通过l0op::ViewCopy回写 - 新增foreach_utils共享helper(ForeachMakeContiguousTensorList/ForeachViewCopyToOutputTensorList,含空tensor跳过) - 修复CMakeLists.txt中foreach_utils头文件包含路径 ## 关联的Issue 暂无 ## 测试 - 在Ascend环境上通过ATK pyaclnn backend进行非连续精度测试,7个接口共1150用例全部通过 ## 文档更新 更新7个算子README约束说明为支持非连续Tensor ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 关联的Issue:#3994 See merge request: cann/ops-nn!6980 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
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 | 3 个月前 | |
【社区任务】ForeachExp支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5454 merge submit-ForeachExp into master 【社区任务】ForeachExp支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、基本信息 ### 1.1 需求来源 ForeachExp 算子是深度学习框架对应的昇腾算子实现,核心语义为:对输入张量列表(Tensor List)中的每个张量逐元素执行 $y = e^x$ 运算,返回结果张量列表。 当前 aclnnForeachExp 算子开源仓(ops-nn)仅支持浮点数据类型。为满足更广泛的端侧推理及量化场景需求,本方案在现有代码基础上再开发,新增 INT16(int16_t)、INT8(int8_t)、UINT8(uint8_t)三种整数数据类型的支持,完成算子泛化适配,并最终合入昇腾算子开源仓。 ### 1.2 背景介绍 #### 1.2.1 现有 ForeachExp 算子实现分析 现有 ForeachExp 算子的核心底层逻辑复用了 foreach_utils 目录下的 ForeachImplictOutput 模板。 现有实现路径:[https://gitcode.com/cann/ops-nn/tree/master/foreach/foreach_exp](https://gitcode.com/cann/ops-nn/tree/master/foreach/foreach_exp) #### 1.2.2 现有版本支持能力 | 参数 | 参数含义 | 数据类型支持 | 数据类型约束 | 形状 | | :--- | :--- | :--- | :--- | :--- | | x | 输入张量列表 | FLOAT32, FLOAT16, BFLOAT16 | 列表中所有 Tensor 数据类型一致 | 0-8 维 ND | | y | 输出张量列表 | 与 x 一致 | shape size $\ge$ x 的 shape size | 0-8 维 ND | #### 1.2.3 核心计算逻辑 计算公式: $x = [x_0, x_1, ... x_{n-1}]$ $y = [y_0, y_1, ... y_{n-1}]$ $y_i = e^{x_i} \quad (i=0,1,...n-1)$ **Kernel 侧计算特性:** 当前底层通过传入 Exp 操作符给 ForeachImplictOutput 模板进行实例化。对于 half 和 float,直接在 V 单元执行 Exp 指令;对于 bfloat16_t,框架内部已经通过 InnerComputer 特化实现了 Cast (提升至 float32) $\rightarrow$ Exp $\rightarrow$ Cast (还原回 bfloat16_t) 的流程。新增的整数类型也将完全复用这一 Cast 特化机制。 --- ## 二、需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供 $int8_t \leftrightarrow float$、$uint8_t \leftrightarrow float$、$int16_t \leftrightarrow float$ 的类型转换及饱和截断支持。 * 依赖 foreach_utils 中的 ForeachImplictOutput 模板类及 ForeachCommonTiling 分核策略。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | :--- | :--- | :--- | | op_host | foreach_exp_def.cpp | 扩展 tensor_dtype_list,新增 DT_INT16 / DT_INT8 / DT_UINT8 | | op_host | foreach_exp_binary.json | 在对应架构下新增三种整数类型的 JSON 配置条目 | | op_kernel | foreach_exp.cpp | 新增 TILING_KEY_INT16(5) / INT8(7) / UINT8(8) 分支 | | op_kernel | foreach_implict_output.h | 扩展 InnerComputer 对 int16_t, int8_t, uint8_t 转换 float 的模板特化 | | docs/README | 文档与 README | 更新支持的数据类型列表和数值截断说明 | | tests/examples | 测试框架 | 新增泛化场景的整数类型单元测试与 API 测试 | --- ## 三、需求模块设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | :--- | :--- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | | OPAT调优 | | | SGAT子图切分 | | ### 3.2 算子原型定义(变更后) 原型注册文件中,新增对目标数据类型的支持: cpp std::vector<ge::DataType> tensor_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_BF16, ge::DT_INT16, ge::DT_INT8, ge::DT_UINT8 }; std::vector<ge::Format> format_list(tensor_dtype_list.size(), ge::FORMAT_ND); this->Input("x") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Output("y") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->AICore().AddConfig("ascend910_93"); this->AICore().AddConfig("ascend910b"); ### 3.3 详细设计 #### 3.3.1 Host 侧设计 * **分核策略**:继续沿用 ForeachCommonTiling,根据 Tensor 数量及总元素个数进行 usedCoreNum 计算与负载均衡切分,无需做逻辑改动。 * **UB 内存分布与 TilingKey**:框架已在 common_dtype.h 中预定义了枚举,新增类型映射为:TILING_KEY_INT16=5,TILING_KEY_INT8=7,TILING_KEY_UINT8=8。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_exp.cpp 主干中补充路由分支: cpp // ... 前置的 FLOAT16, FLOAT32, BFLOAT16 分支 ... } else if (TILING_KEY_IS(5)) { ForeachImplictOutput<int16_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { ForeachImplictOutput<int8_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { ForeachImplictOutput<uint8_t, float, Exp, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } **3.3.2.2 扩展 InnerComputer 模板特化** 在 foreach_implict_output.h 中,为了让整数类型能够调用浮点 Exp 算子,需仿照 bfloat16_t 补充三组特化。以下以 int16_t 为例: cpp #if __CCE_AICORE__ >= 220 template <ImplictOutputOp<float>* op, uint8_t paramsCount> class InnerComputer<int16_t, float, op, paramsCount> { public: __aicore__ inline void Compute( LocalTensor<int16_t>& dataLocal, LocalTensor<float>& float32Tensor, uint32_t maxCastDataCount, int64_t dataCount) { uint32_t castTimes = dataCount / maxCastDataCount; uint32_t castTimesRemainder = dataCount % maxCastDataCount; for (uint32_t i = 0; i < castTimes; i++) { ComputePerCast(dataLocal, float32Tensor, maxCastDataCount, i, maxCastDataCount); } if (castTimesRemainder > 0) { ComputePerCast(dataLocal, float32Tensor, maxCastDataCount, castTimes, castTimesRemainder); } } private: __aicore__ inline void ComputePerCast( LocalTensor<int16_t>& dataLocal, LocalTensor<float>& float32Tensor, uint32_t maxCastDataCount, uint32_t index, int64_t dataCount) { PipeBarrier<PIPE_V>(); Cast(float32Tensor, dataLocal[index * maxCastDataCount], RoundMode::CAST_NONE, dataCount); PipeBarrier<PIPE_V>(); uint32_t offset = (paramsCount == 1) ? 0 : maxCastDataCount; op(float32Tensor[offset], float32Tensor, dataCount); // 核心计算:Exp PipeBarrier<PIPE_V>(); // 注意:此处转回整型使用 CAST_RINT(四舍五入)或依赖默认的饱和截断行为 Cast(dataLocal[index * maxCastDataCount], float32Tensor[offset], RoundMode::CAST_RINT, dataCount); PipeBarrier<PIPE_V>(); } }; #endif // 同理,补充 <int8_t, float, ...> 和 <uint8_t, float, ...> 的特化 **3.3.2.3 数值溢出与截断行为** 由于 $e^x$ 增长极快(例如 $x=10$ 时,结果约为 $22026.46$),该数值已远超 INT8 和 UINT8 的表示范围。在最终执行 Cast(float32 -> int) 时,硬件底层触发饱和截断:超出数据类型最大值的结果将饱和为该类型的最大值(如 INT8 饱和为 127,UINT8 饱和为 255)。 **3.3.2.4 Ascend C 实现流程图 (PlantUML)**  ### 3.4 支持硬件 * Atlas A2 训练系列产品 / Atlas 800I A2 推理产品 * Atlas A3 系列产品 ### 3.5 算子约束限制 1. **数据类型对齐强制性约束**:需要特别注意的是,在算子构建阶段,如果遇到未注册的数据类型(如框架侧下发了未支持的 dtype),CANN 软件栈的预期行为是直接构建报错并停止运行,而不会触发回退机制将算子标记为 CPU 执行。因此,Host 侧的原型注册必须与 Kernel 侧的类型分发(TilingKey 分支及 Template 特化)严格对齐,不可遗漏。 2. **输入输出类型一致性**:输入 x 张量列表内所有元素的数据类型必须完全一致,且与输出 y 张量列表的数据类型保持绝对一致。 --- ## 四、验收标准 | 验收标准 | 描述 | | :--- | :--- | | **功能标准** | 算子能够正确处理 INT16、INT8、UINT8 输入的 Exp 运算,能够正常处理多 Tensor 列表输入输出。 | | **精度标准** | 严格符合 AscendOpTest 默认阈值。由于是整数运算,基准测试逻辑需设定为:输入转换为 float64 -> 计算 np.exp -> np.round -> 转换为对应整数类型(并验证溢出时的饱和截断行为是否与 CPU 侧对齐)。 | | **泛化标准** | 支撑 0-8 维、不同 Tensor 大小组合及空张量的合法输入场景。 | --- ## 五、可维可测分析 ### 5.1 精度/性能标准 * **精度**:按照 4.0 验收标准执行,重点通过 UT 验证 $x \le 0$ 时是否下溢截断正确,以及 $x$ 较大时饱和为该类型最大正数是否正确。 * **性能**:新增分支性能须对齐已有的 BFLOAT16 逻辑,确保流水线中 MTE2 -> V -> V -> V -> MTE3 的并行度未被破坏,打满系统带宽或 V 单元算力极限。 ### 5.2 兼容性分析 该开发任务为纯粹的类型扩展,向后兼容原有框架的所有特性,不改变现有浮点类型的计算逻辑与 Tiling 策略,对存量业务零影响。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2867 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachExp.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5454 | 3 个月前 | |
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 | 3 个月前 | |
License Change Split2 Co-authored-by: huohuo_wy<wangyan389@huawei.com> # message auto-generated for no-merge-commit merge: !372 merge spilitLicense3 into master License Change Split2 Created-by: huohuo_wangyan Commit-by: huohuo_wy Merged-by: cann-robot Description: ## 描述 批量整改文件copyright注释 ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/177 ## 测试 COPYRIGHT注释头按新要求刷新 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!372 | 10 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 10 个月前 |