| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
【社区任务】ForeachExpm1支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5214 merge submit-ForeachExpm1 into master 【社区任务】ForeachExpm1支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。为现有的 aclnnForeachExpm1 算子增加对 DT_INT16、DT_INT8、DT_UINT8 数据类型的支持,以满足更广泛的网络量化及端侧推理场景对底层核心算子的完备性要求。 ### 1.2 背景介绍 ForeachExpm1 算子用于对张量列表(Tensor List)执行逐元素的 $y = e^x - 1$ 运算。由于在 $x$ 接近 $0$ 时,$e^x - 1$ 的直接计算易导致精度丢失,该算子能提供比组合算子更好的数值稳定性。 根据最新算子原型定义,当前算子已支持 FLOAT16、FLOAT32、BFLOAT16。本项目要求在现有代码架构下,新增对 INT16、INT8、UINT8 数据的支持。 **关键架构决策**: 考虑到 foreach 模块是高度抽象的通用框架,为兼顾精度与底层指令的泛化性,对于新增的整型类型,采用精度提升(Cast)机制: * **int16_t**:Cast 至 float(float32)进行高精度计算,计算完毕后通过 CAST_RINT 截断回 int16_t。 * **int8_t / uint8_t**:Cast 至 half(float16)进行计算,计算完毕后截断回 int8_t / uint8_t。 ## 二、 需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供低比特整型与 float / half 之间的精度双向转换及饱和截断机制。 * 依赖原有的 Expm1Adapter(组合 Exp 与 Adds)进行核心逻辑的运算。 * 依赖现有的 ForeachImplictOutput 通用隐式输出模板框架。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | --- | --- | --- | | op_host | foreach_expm1_def.cpp | 扩展原型 tensor_dtype_list,新增 DT_INT16/DT_INT8/DT_UINT8。更新硬件配置为 ascend910_93 和 ascend910b。 | | op_host | foreach_tiling_func.cpp | **修改 UB 切分策略**:int16_t 按照 float (4 Bytes) 预留中间缓存;int8_t/uint8_t 按照 half (2 Bytes) 预留中间缓存。 | | op_kernel | foreach_expm1.cpp | 新增 TILING_KEY_IS 路由分支:5 路由至 float 适配器;7、8 路由至 half 适配器。 | | op_kernel | foreach_implict_output.h | 扩展 InnerComputer 模板特化,新增整型转浮点型进行运算的流水线拆分。 | | op_kernel | kernel_foreach_unary.h / base.h | 补充 INT16/INT8/UINT8 类型映射,支持对应的 COPY_SPACE_MULTIPLE(临时转换缓冲)分配逻辑。 | ## 三、 需求详细设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | --- | --- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | ### 3.2 算子原型设计 修改 op_host/foreach_expm1_def.cpp,同步更新数据类型,并根据任务约束**严格限制硬件架构注册**: cpp explicit ForeachExpm1(const char* name) : OpDef(name) { 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(); // 仅保留 A2/A3 对应的架构 this->AICore().AddConfig("ascend910_93"); this->AICore().AddConfig("ascend910b"); } ### 3.3 详细设计 #### 3.3.1 Host 侧设计:UB 切分策略修改 在 foreach_utils/op_host/foreach_tiling_func.cpp 中,负责 UB 切分的逻辑需根据计算载体预留内存: 1. **DT_INT16 (Key 5)**:计算中转为 float,需将其切分参数及 COPY_SPACE_MULTIPLE 视作 float 处理,保证单次 Tile 计算时有充足的 4 Bytes 中转空间。 2. **DT_INT8 (Key 7) / DT_UINT8 (Key 8)**:计算中转为 half,需将其切分参数及 COPY_SPACE_MULTIPLE 视作 half 处理,保证单次 Tile 计算时有充足的 2 Bytes 中转空间。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_expm1.cpp 中,补充基于上述架构决策的分发逻辑: cpp // ... 前置的 FLOAT16(1), FLOAT32(2) 分支 ... #if __CCE_AICORE__ >= 220 && !(defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3003 || __NPU_ARCH__ == 3113)) else if (TILING_KEY_IS(4)) { ForeachImplictOutput<bfloat16_t, float, Expm1Adapter<float>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(5)) { // int16_t 提升至 float 计算 ForeachImplictOutput<int16_t, float, Expm1Adapter<float>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { // int8_t 提升至 half 计算 ForeachImplictOutput<int8_t, half, Expm1Adapter<half>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { // uint8_t 提升至 half 计算 ForeachImplictOutput<uint8_t, half, Expm1Adapter<half>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } #endif **3.3.2.2 扩展 InnerComputer 与底层头文件支持** 1. **foreach_implict_output.h**:仿照 bfloat16_t,补充针对 int16_t -> float、int8_t -> half、uint8_t -> half 的模板特化,利用双向 Cast 隔离原始数据与 Expm1Adapter 的计算环境。 2. **kernel_foreach_unary.h / kernel_foreach_base.h**:在基类的类型萃取中(如定义 TT 时),需补充新的逻辑,即当判定到 int16_t 时分配 float 缓冲,判定到 int8_t/uint8_t 时分配 half 缓冲,并正确启用 COPY_SPACE_MULTIPLE。 #### 3.3.3 Ascend C 侧运行流程图  ### 3.4 支持硬件 * **Atlas A2 训练系列产品 / Atlas A3 系列产品**(严格限定对应 ascend910_93 及 ascend910b)。 ### 3.5 算子约束与异常拦截机制 1. **构建拦截规则(严格防线)**:如果前端尝试下发未注册的类型组合,构建流程会立刻阻断并报错,**不会触发向 CPU 执行的回退(Fallback)机制**。因此要求 Host 侧配置与 Kernel 侧模板的实例化必须保持严格一致。 2. **泛化要求**:输入 x 与输出 y 在多维度(0~8维)、极值边界以及数据类型之间必须严格匹配,并支撑框架级的各种泛化 Shape 传入。 ## 四、 验收及可维可测标准 ### 4.1 精度与性能标准 * **精度标准**:满足 AscendOpTest 的默认阈值。 * **性能标准**:无。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2983 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachExpm1.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5214 | 6 天前 | |
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 | 14 天前 | |
【社区任务】ForeachAddList算子支持int16/int8/uint8实现贡献 Co-authored-by: Nice_try<nicetryzzw@163.com> # message auto-generated for no-merge-commit merge: !5213 merge submit-ForeachAddListV2 into master 【社区任务】ForeachAddList算子支持int16/int8/uint8实现贡献 Created-by: Nice_try Commit-by: Nice_try Merged-by: cann-robot Description: ## 描述 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。为现有的 aclnnForeachAddListV2 算子增加对 DT_INT16、DT_INT8、DT_UINT8 数据类型的支持,以满足更广泛的网络量化及端侧推理场景对底层核心算子的完备性要求。 ### 1.2 背景介绍 ForeachAddListV2 算子用于对两个张量列表(Tensor List)执行逐元素的带缩放加法运算。其核心数学计算公式为: $y_i = x1_i + \alpha \times x2_i$ 根据最新算子原型定义,当前算子已支持 FLOAT16, FLOAT32, INT32, BFLOAT16 数据类型。本项目要求在现有代码架构下,新增对 INT16、INT8、UINT8 数据的支持。 **关键架构决策**:虽然在 Atlas A2/A3 架构上,底层 Add 与 Muls 指令已原生支持 int16_t 数据类型,但考虑到 foreach 模块是一个高度抽象的通用模板框架,服务于众多算子,为了保持底层 InnerComputer 计算流的统一性与极简性,本设计决定**不走原生分支,而是将 int16_t 统一转换(Cast)为 float(float32)进行处理**。同理,对于 int8_t 和 uint8_t,则通过精度提升转换至 half (float16) 并在计算后再转换回原类型。 ## 二、 需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供 int16_t 与 float32、以及 int8_t/uint8_t 与 half 之间的精度转换及饱和截断机制。 * 依赖现有的 ForeachOneScalarTernary 通用三元标量模板框架。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | --- | --- | --- | | op_host | foreach_add_list_def.cpp | 扩展主配置的 tensor_dtype_list,新增 DT_INT16/DT_INT8/DT_UINT8。更新硬件配置,仅保留 ascend910_93 和 ascend910b。 | | op_host | foreach_tiling_func.cpp | **修改 UB 切分策略**:int16_t 按照中间缓存 float32 (4 Bytes) 预留内存;int8_t/uint8_t 按照 half (2 Bytes) 预留内存。 | | op_kernel | foreach_add_list.cpp | 新增 TILING_KEY_IS 路由分支:int16_t 路由至 float 适配器;int8/uint8 路由至 half 适配器。 | | op_kernel | foreach_one_scalar_ternary.h | 扩展 InnerComputer 模板特化,新增 int16_t -> float 及 8-bit -> half 执行运算的双向转换流水线编排。 | | op_api | aclnn_foreach_add_list_v2.cpp | 从调用层面上增加三种新增数据类型的支持。 | ## 三、 需求详细设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | --- | --- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | ### 3.2 算子原型设计 修改 op_host/foreach_add_list_def.cpp,同步更新数据类型并**严格限制硬件架构注册**: cpp std::vector<ge::DataType> tensor_dtype_list = {ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, 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); std::vector<ge::DataType> scalar_tensor_dtype_list = {ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32}; this->Input("x1") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Input("x2") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Input("alpha") .ParamType(REQUIRED) .DataType(scalar_tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list); 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"); ### Design(设计方案) ### 3.3 详细设计 #### 3.3.1 Host 侧设计:UB 切分策略修改 在 foreach/foreach_utils/op_host/foreach_tiling_func.cpp 中,负责 UB 切分的逻辑需根据目标中间计算类型分类处理: 1. **DT_INT16 (Key 5)**:由于在 V 单元内部必须先 Cast 成 float32 才能进行计算,因此在 Host 侧计算单次最大处理数据量 (ub_size 和 tileDataNum) 时,必须**按照 float32(4 字节)的内存诉求来预留和切分 UB 空间**。 2. **DT_INT8 (Key 7) / DT_UINT8 (Key 8)**:在 V 单元内部将 Cast 成 half (float16) 进行计算,因此必须**按照 half(2 字节)的内存诉求来预留和切分 UB 空间**。 两者均需应用相应的 COPY_SPACE_MULTIPLE 逻辑,确保 InnerComputer 特化中引入的额外 LocalTensor 不会发生内存踩踏。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_add_list.cpp 中,增加针对三种新类型的入口调用,统一利用 AddListFloatAdapter 的高精度指令(Axpy): cpp // ... 现有 FLOAT16, FLOAT32, INT32, BFLOAT16 分支 ... #if __CCE_AICORE__ >= 220 } else if (TILING_KEY_IS(5)) { // int16_t 转 float 计算,保持通用性 ForeachOneScalarTernary<int16_t, float, AddListFloatAdapter<float>> op; op.Init(inputs_1, inputs_2, alpha, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { // int8_t 转 half 计算 ForeachOneScalarTernary<int8_t, half, AddListFloatAdapter<half>> op; op.Init(inputs_1, inputs_2, alpha, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { // uint8_t 转 half 计算 ForeachOneScalarTernary<uint8_t, half, AddListFloatAdapter<half>> op; op.Init(inputs_1, inputs_2, alpha, outputs, userWS, &tilingData); op.Process(); } #endif **3.3.2.2 扩展 InnerComputer 模板特化** 在 foreach_one_scalar_ternary.h 中补充特化。 * 对于 int16_t,引入 <int16_t, float, op> 的特化,核心为 Cast(floatTensor, int16_Tensor) -> 运算 -> Cast(int16_Tensor, floatTensor, CAST_RINT)。 * 对于 8-bit,引入 <int8_t, half, op> 及 <uint8_t, half, op> 的特化,使用 half 作为中转张量。 #### 3.3.3 Ascend C 侧运行流程图  ### 3.4 支持硬件 * **Atlas A2 训练系列产品 / Atlas A3 系列产品** ### 3.5 算子约束与异常拦截机制 1. **构建拦截规则(严格)**:构建过程中如果发现不支持的算子或未能匹配原型中声明的数据类型组合,会直接构建失败并导致流程中断报错,**绝不会触发回退机制将该算子标记为 CPU 执行**。因此,原型库 (op_def)、Tiling 策略与 Kernel 侧泛型实例化必须维持强一致的闭环。 2. **张量类型一致性**:输入列表 x1, x2 以及输出列表 y 内部及之间的数据类型必须完全一致。 ## 四、 验收及可维可测标准 ### 4.1 精度与性能标准 * **精度标准**:满足 AscendOpTest 默认阈值。由于底层全部执行了提权计算,整数运算的期望基准应为: * int16_t:转化为 float64/float32 -> 计算 $x1_i + \alpha \times x2_i$ -> 采用 round 四舍五入 -> 执行 int16_t 边界的饱和截断。 * int8/uint8:转化为 float16 -> 计算 $x1_i + \alpha \times x2_i$ -> 采用 round 四舍五入 -> 执行目标数据类型边界的饱和截断。 * **性能标准**:三种整型的吞吐率应对齐已有涉及双向 Cast 逻辑的 BFLOAT16 方案,确保 V 单元与搬运单元 (MTE2/MTE3) 之间流水线被充分掩盖。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2863 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachAddList.md、aclnnForeachAddListV2.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5213 | 6 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
【社区任务】ForeachAddScalarV2 支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5667 merge submit-foreachaddscalar into master 【社区任务】ForeachAddScalarV2 支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。为现有的 aclnnForeachAddScalarV2 算子增加对 DT_INT16、DT_INT8、DT_UINT8 数据类型的支持,以满足网络量化及端侧推理场景对底层核心算子的完备性要求。 ### 1.2 背景介绍 ForeachAddScalar 算子用于对张量列表(Tensor List)执行逐元素的标量加法运算。其核心数学计算公式为: $y_i = x_i + \alpha$ 根据最新算子原型定义,当前算子已支持 FLOAT16、FLOAT32、INT32、BFLOAT16。本项目要求在现有代码架构下,新增对 INT16、INT8、UINT8 这三种整型数据的支持。 **关键架构决策**: 为了保持底层 InnerComputer 计算流的统一性与极简性,并兼顾精度,本设计采用精度提升(Cast)机制: * **int16_t**:统一转换(Cast)为 float (float32) 进行 Adds 处理,计算完成后截断回 int16_t。 * **int8_t / uint8_t**:统一转换(Cast)为 half (float16) 进行 Adds 处理,计算完成后截断回原 8-bit 类型。 ## 二、 需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供低比特整型与 float / half 之间的精度双向转换及饱和截断(CAST_RINT)机制。 * 依赖现有的 ForeachOneScalarBinary 通用单标量二元操作模板框架。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | --- | --- | --- | | op_host | foreach_add_scalar_def.cpp | 扩展原型 DataType,新增 DT_INT16/DT_INT8/DT_UINT8。明确 scalar 的对应关系。 | | op_host | foreach_tiling_func.cpp | **修改 UB 切分策略**:int16_t 按照 float (4 Bytes) 预留;int8_t/uint8_t 按照 half (2 Bytes) 预留。 | | op_kernel | foreach_add_scalar.cpp | 新增 TILING_KEY_IS 路由分支:int16_t 路由至 float 适配器;int8/uint8 路由至 half 适配器。 | | op_kernel | foreach_one_scalar_binary.h | 扩展 InnerComputer 模板特化,新增整型转浮点型执行运算的双向转换流水线编排。 | | op_kernel | kernel_foreach_base.h<br> <br>kernel_foreach_unary.h | 补充底层基础模板对这三种整型的识别萃取及 COPY_SPACE_MULTIPLE 倍数控制。 | ## 三、 需求详细设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | --- | --- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | ### 3.2 算子原型设计 ### 算子原型表格 该表格清晰界定了算子的输入输出类型、维度约束及格式要求。 | 名称 | 类别 | 数据类型 | Format | Shape | 说明 | | --- | --- | --- | --- | --- | --- | | **x** | 输入 | FLOAT16, FLOAT32, BF16, INT32, **INT16, INT8, UINT8** | ND | 0-8 维 | 输入张量列表,列表中所有 Tensor 类型需一致 | | **scalar** | 输入 | FLOAT16, FLOAT32, FLOAT32, INT32, **INT32, INT32, INT32** | ND | [1] | 待加的标量值,与 Tensor 元素类型保持绑定 | | **y** | 输出 | FLOAT16, FLOAT32, BF16, INT32, **INT16, INT8, UINT8** | ND | 与 x 一致 | 输出张量列表,结果 $y_i = x_i + \alpha$ | 修改 op_host/foreach_add_scalar_def.cpp,同步更新数据类型并严格限制硬件架构: cpp explicit ForeachAddScalar(const char* name) : OpDef(name) { // 输入张量支持的 dtype 列表新增整型 std::vector<ge::DataType> tensor_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_BF16, ge::DT_INT16, ge::DT_INT8, ge::DT_UINT8 }; // 标量支持的 dtype 列表(BF16 对应 FLOAT,整型严格一一对应) std::vector<ge::DataType> scalar_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32 }; 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->Input("scalar") .ParamType(REQUIRED) .DataType(scalar_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Output("y") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list); OpAICoreConfig membaseCfg; membaseCfg.DynamicCompileStaticFlag(true) .DynamicRankSupportFlag(true) .DynamicShapeSupportFlag(true) .ExtendCfgInfo("opFile.value", "foreach_add_scalar"); // 仅保留 A2/A3 对应的系列 this->AICore().AddConfig("ascend910b", membaseCfg); this->AICore().AddConfig("ascend910_93", membaseCfg); } ### 3.3 详细设计 #### 3.3.1 Host 侧设计:UB 切分策略修改 在 foreach_utils/op_host/foreach_tiling_func.cpp 中,负责 UB 切分的逻辑需根据中间计算类型分类处理: 1. **DT_INT16 (Key 5)**:由于在 V 单元内部必须先 Cast 成 float32 才能进行计算,因此在 Host 侧计算单次最大处理数据量(ub_size 和 tileDataNum)时,必须**按照 float32(4 字节)的内存诉求来预留和切分 UB 空间**。 2. **DT_INT8 (Key 7) / DT_UINT8 (Key 8)**:由于在 V 单元内部将 Cast 成 half (float16) 进行计算,必须**按照 half(2 字节)的内存诉求来预留和切分 UB 空间**。 两者均需应用相应的 COPY_SPACE_MULTIPLE 逻辑,确保中转所需的临时张量空间充足。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_add_scalar.cpp 中,增加针对三种新类型的入口调用。 cpp // ... 现有 FLOAT16, FLOAT32, INT32 分支 ... #if __CCE_AICORE__ >= 220 else if (TILING_KEY_IS(3)) { ForeachOneScalarBinary<int, int, AddsAdapter<int>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); #if !(defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3003 || __NPU_ARCH__ == 3113)) } else if (TILING_KEY_IS(4)) { ForeachOneScalarBinary<bfloat16_t, float, AddsAdapter<float>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(5)) { // int16_t 提升至 float 计算 ForeachOneScalarBinary<int16_t, float, AddsAdapter<float>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { // int8_t 提升至 half 计算 ForeachOneScalarBinary<int8_t, half, AddsAdapter<half>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { // uint8_t 提升至 half 计算 ForeachOneScalarBinary<uint8_t, half, AddsAdapter<half>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); #endif } #endif **3.3.2.2 扩展 InnerComputer 模板特化** 在 foreach_one_scalar_binary.h 中补充特化。 * 针对 int16_t,引入 <int16_t, float, op> 的特化:Cast(floatTensor, int16_Tensor) -> Adds(floatTensor, scalar_float) -> Cast(int16_Tensor, floatTensor, CAST_RINT)。 * 针对 8-bit,引入 <int8_t, half, op> 及 <uint8_t, half, op> 的特化,使用 half 张量作为指令计算的中转站。 * **注意标量转换**:通过类型偏特化机制,将标量安全读取为内部的 TT 类型(即 float 或 half),防范底层编译器的 float = unsigned 非法转换拦截。 #### 3.3.3 Ascend C 侧运行流程图  ### 3.4 支持硬件 * **Atlas A2 训练系列产品 / Atlas A3 系列产品** (对应 ascend910_93 及 ascend910b)。 ### 3.5 算子约束与异常拦截机制 1. **构建阻断拦截**:如果在前端执行或编译期发现未注册的类型组合(例如输入 dtype 不在定义的列表内),构建流程将直接报错失败,**绝不触发降级至 CPU 的回退机制**。原型库 (op_def)、Tiling 策略与 Kernel 侧的泛型分支必须维持强一致闭环。 2. **张量类型一致性**:输入的 x 张量列表、scalar 标量张量、输出的 y 张量列表在对应维度上的数据类型必须完全匹配。 ## 四、 验收及可维可测标准 ### 4.1 精度与性能标准 * **精度标准**:满足 AscendOpTest 默认阈值。由于整型算子底层全部执行提权计算,整数运算的期望基准应为: * int16_t:转化为 float64/float32 -> 计算 $x_i + \alpha$ -> 采用 round 四舍五入 -> 执行 int16_t 边界的饱和截断。 * int8/uint8:转化为 float16 -> 计算 $x_i + \alpha$ -> 采用 round 四舍五入 -> 执行目标数据类型边界的饱和截断。 * **性能标准**:增加类型的吞吐率应对齐已有涉及双向 Cast 操作的 BFLOAT16 方案,确保计算单元 (V) 与搬运单元 (MTE2/MTE3) 的流水线被充分掩盖。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #3091 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 通过了eager测试、ut测试、AscendOpTest测试。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachAddScalar.md、aclnnForeachAddScalarV2.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5667 | 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 | 14 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7374 merge feat/foreach-non-contiguous-batch2 into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 说明 本 PR 为 foreach 系列算子的**第二批**非连续输入和输出支持,涉及 4 个算子: | 算子 | 改造 | |------|------| | aclnnForeachDivScalarV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachAddListV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachLerpScalar | 新增手写 aclnn(aclScalar*) | | aclnnForeachAddcdivScalarList | 新增手写 aclnn(aclTensor*) | ### 实现方式 - CMakeLists 改为 aclnn_exclude,手写 aclnn 层 - 使用 ForeachMakeContiguousTensorList + ForeachViewCopyToOutputTensorList 实现非连续输入输出支持 - 复用 foreach_contiguous_helper.h,与第一批 PR #6980 保持一致 ### 参数检查修改 - CheckParams 增加 tensorList 长度一致性校验(x->Size() == out->Size() 等) - scalar 按 BF16→FLOAT 特殊处理,其余按输入 dtype 转换(ConvertToTensor) ### 文档修改 - 7 个 README.md:将"输出支持非连续Tensor"更正为"输出不支持非连续Tensor"(kernel 本不支持非连续,非连续由 aclnn 层处理) - 11 个 aclnn docs:out(输出)非连续标记由 × 改为 ✓ ### UT 覆盖 - LerpScalar、AddcdivScalarList:新增非连续 op_api UT 用例 - DivScalarV2、AddListV2:在已有 UT 中补充非连续测试用例 ## 测试 ATK 测试通过。 See merge request: cann/ops-nn!7374 | 6 天前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7374 merge feat/foreach-non-contiguous-batch2 into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 说明 本 PR 为 foreach 系列算子的**第二批**非连续输入和输出支持,涉及 4 个算子: | 算子 | 改造 | |------|------| | aclnnForeachDivScalarV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachAddListV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachLerpScalar | 新增手写 aclnn(aclScalar*) | | aclnnForeachAddcdivScalarList | 新增手写 aclnn(aclTensor*) | ### 实现方式 - CMakeLists 改为 aclnn_exclude,手写 aclnn 层 - 使用 ForeachMakeContiguousTensorList + ForeachViewCopyToOutputTensorList 实现非连续输入输出支持 - 复用 foreach_contiguous_helper.h,与第一批 PR #6980 保持一致 ### 参数检查修改 - CheckParams 增加 tensorList 长度一致性校验(x->Size() == out->Size() 等) - scalar 按 BF16→FLOAT 特殊处理,其余按输入 dtype 转换(ConvertToTensor) ### 文档修改 - 7 个 README.md:将"输出支持非连续Tensor"更正为"输出不支持非连续Tensor"(kernel 本不支持非连续,非连续由 aclnn 层处理) - 11 个 aclnn docs:out(输出)非连续标记由 × 改为 ✓ ### UT 覆盖 - LerpScalar、AddcdivScalarList:新增非连续 op_api UT 用例 - DivScalarV2、AddListV2:在已有 UT 中补充非连续测试用例 ## 测试 ATK 测试通过。 See merge request: cann/ops-nn!7374 | 6 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 10 天前 | |
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 | 14 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
修复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 | 12 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7374 merge feat/foreach-non-contiguous-batch2 into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 说明 本 PR 为 foreach 系列算子的**第二批**非连续输入和输出支持,涉及 4 个算子: | 算子 | 改造 | |------|------| | aclnnForeachDivScalarV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachAddListV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachLerpScalar | 新增手写 aclnn(aclScalar*) | | aclnnForeachAddcdivScalarList | 新增手写 aclnn(aclTensor*) | ### 实现方式 - CMakeLists 改为 aclnn_exclude,手写 aclnn 层 - 使用 ForeachMakeContiguousTensorList + ForeachViewCopyToOutputTensorList 实现非连续输入输出支持 - 复用 foreach_contiguous_helper.h,与第一批 PR #6980 保持一致 ### 参数检查修改 - CheckParams 增加 tensorList 长度一致性校验(x->Size() == out->Size() 等) - scalar 按 BF16→FLOAT 特殊处理,其余按输入 dtype 转换(ConvertToTensor) ### 文档修改 - 7 个 README.md:将"输出支持非连续Tensor"更正为"输出不支持非连续Tensor"(kernel 本不支持非连续,非连续由 aclnn 层处理) - 11 个 aclnn docs:out(输出)非连续标记由 × 改为 ✓ ### UT 覆盖 - LerpScalar、AddcdivScalarList:新增非连续 op_api UT 用例 - DivScalarV2、AddListV2:在已有 UT 中补充非连续测试用例 ## 测试 ATK 测试通过。 See merge request: cann/ops-nn!7374 | 6 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7374 merge feat/foreach-non-contiguous-batch2 into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 说明 本 PR 为 foreach 系列算子的**第二批**非连续输入和输出支持,涉及 4 个算子: | 算子 | 改造 | |------|------| | aclnnForeachDivScalarV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachAddListV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachLerpScalar | 新增手写 aclnn(aclScalar*) | | aclnnForeachAddcdivScalarList | 新增手写 aclnn(aclTensor*) | ### 实现方式 - CMakeLists 改为 aclnn_exclude,手写 aclnn 层 - 使用 ForeachMakeContiguousTensorList + ForeachViewCopyToOutputTensorList 实现非连续输入输出支持 - 复用 foreach_contiguous_helper.h,与第一批 PR #6980 保持一致 ### 参数检查修改 - CheckParams 增加 tensorList 长度一致性校验(x->Size() == out->Size() 等) - scalar 按 BF16→FLOAT 特殊处理,其余按输入 dtype 转换(ConvertToTensor) ### 文档修改 - 7 个 README.md:将"输出支持非连续Tensor"更正为"输出不支持非连续Tensor"(kernel 本不支持非连续,非连续由 aclnn 层处理) - 11 个 aclnn docs:out(输出)非连续标记由 × 改为 ✓ ### UT 覆盖 - LerpScalar、AddcdivScalarList:新增非连续 op_api UT 用例 - DivScalarV2、AddListV2:在已有 UT 中补充非连续测试用例 ## 测试 ATK 测试通过。 See merge request: cann/ops-nn!7374 | 6 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
【社区任务】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 | 7 天前 | |
【社区任务】ForeachExpm1支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5214 merge submit-ForeachExpm1 into master 【社区任务】ForeachExpm1支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。为现有的 aclnnForeachExpm1 算子增加对 DT_INT16、DT_INT8、DT_UINT8 数据类型的支持,以满足更广泛的网络量化及端侧推理场景对底层核心算子的完备性要求。 ### 1.2 背景介绍 ForeachExpm1 算子用于对张量列表(Tensor List)执行逐元素的 $y = e^x - 1$ 运算。由于在 $x$ 接近 $0$ 时,$e^x - 1$ 的直接计算易导致精度丢失,该算子能提供比组合算子更好的数值稳定性。 根据最新算子原型定义,当前算子已支持 FLOAT16、FLOAT32、BFLOAT16。本项目要求在现有代码架构下,新增对 INT16、INT8、UINT8 数据的支持。 **关键架构决策**: 考虑到 foreach 模块是高度抽象的通用框架,为兼顾精度与底层指令的泛化性,对于新增的整型类型,采用精度提升(Cast)机制: * **int16_t**:Cast 至 float(float32)进行高精度计算,计算完毕后通过 CAST_RINT 截断回 int16_t。 * **int8_t / uint8_t**:Cast 至 half(float16)进行计算,计算完毕后截断回 int8_t / uint8_t。 ## 二、 需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供低比特整型与 float / half 之间的精度双向转换及饱和截断机制。 * 依赖原有的 Expm1Adapter(组合 Exp 与 Adds)进行核心逻辑的运算。 * 依赖现有的 ForeachImplictOutput 通用隐式输出模板框架。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | --- | --- | --- | | op_host | foreach_expm1_def.cpp | 扩展原型 tensor_dtype_list,新增 DT_INT16/DT_INT8/DT_UINT8。更新硬件配置为 ascend910_93 和 ascend910b。 | | op_host | foreach_tiling_func.cpp | **修改 UB 切分策略**:int16_t 按照 float (4 Bytes) 预留中间缓存;int8_t/uint8_t 按照 half (2 Bytes) 预留中间缓存。 | | op_kernel | foreach_expm1.cpp | 新增 TILING_KEY_IS 路由分支:5 路由至 float 适配器;7、8 路由至 half 适配器。 | | op_kernel | foreach_implict_output.h | 扩展 InnerComputer 模板特化,新增整型转浮点型进行运算的流水线拆分。 | | op_kernel | kernel_foreach_unary.h / base.h | 补充 INT16/INT8/UINT8 类型映射,支持对应的 COPY_SPACE_MULTIPLE(临时转换缓冲)分配逻辑。 | ## 三、 需求详细设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | --- | --- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | ### 3.2 算子原型设计 修改 op_host/foreach_expm1_def.cpp,同步更新数据类型,并根据任务约束**严格限制硬件架构注册**: cpp explicit ForeachExpm1(const char* name) : OpDef(name) { 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(); // 仅保留 A2/A3 对应的架构 this->AICore().AddConfig("ascend910_93"); this->AICore().AddConfig("ascend910b"); } ### 3.3 详细设计 #### 3.3.1 Host 侧设计:UB 切分策略修改 在 foreach_utils/op_host/foreach_tiling_func.cpp 中,负责 UB 切分的逻辑需根据计算载体预留内存: 1. **DT_INT16 (Key 5)**:计算中转为 float,需将其切分参数及 COPY_SPACE_MULTIPLE 视作 float 处理,保证单次 Tile 计算时有充足的 4 Bytes 中转空间。 2. **DT_INT8 (Key 7) / DT_UINT8 (Key 8)**:计算中转为 half,需将其切分参数及 COPY_SPACE_MULTIPLE 视作 half 处理,保证单次 Tile 计算时有充足的 2 Bytes 中转空间。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_expm1.cpp 中,补充基于上述架构决策的分发逻辑: cpp // ... 前置的 FLOAT16(1), FLOAT32(2) 分支 ... #if __CCE_AICORE__ >= 220 && !(defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3003 || __NPU_ARCH__ == 3113)) else if (TILING_KEY_IS(4)) { ForeachImplictOutput<bfloat16_t, float, Expm1Adapter<float>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(5)) { // int16_t 提升至 float 计算 ForeachImplictOutput<int16_t, float, Expm1Adapter<float>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { // int8_t 提升至 half 计算 ForeachImplictOutput<int8_t, half, Expm1Adapter<half>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { // uint8_t 提升至 half 计算 ForeachImplictOutput<uint8_t, half, Expm1Adapter<half>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } #endif **3.3.2.2 扩展 InnerComputer 与底层头文件支持** 1. **foreach_implict_output.h**:仿照 bfloat16_t,补充针对 int16_t -> float、int8_t -> half、uint8_t -> half 的模板特化,利用双向 Cast 隔离原始数据与 Expm1Adapter 的计算环境。 2. **kernel_foreach_unary.h / kernel_foreach_base.h**:在基类的类型萃取中(如定义 TT 时),需补充新的逻辑,即当判定到 int16_t 时分配 float 缓冲,判定到 int8_t/uint8_t 时分配 half 缓冲,并正确启用 COPY_SPACE_MULTIPLE。 #### 3.3.3 Ascend C 侧运行流程图  ### 3.4 支持硬件 * **Atlas A2 训练系列产品 / Atlas A3 系列产品**(严格限定对应 ascend910_93 及 ascend910b)。 ### 3.5 算子约束与异常拦截机制 1. **构建拦截规则(严格防线)**:如果前端尝试下发未注册的类型组合,构建流程会立刻阻断并报错,**不会触发向 CPU 执行的回退(Fallback)机制**。因此要求 Host 侧配置与 Kernel 侧模板的实例化必须保持严格一致。 2. **泛化要求**:输入 x 与输出 y 在多维度(0~8维)、极值边界以及数据类型之间必须严格匹配,并支撑框架级的各种泛化 Shape 传入。 ## 四、 验收及可维可测标准 ### 4.1 精度与性能标准 * **精度标准**:满足 AscendOpTest 的默认阈值。 * **性能标准**:无。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2983 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachExpm1.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5214 | 6 天前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7374 merge feat/foreach-non-contiguous-batch2 into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 说明 本 PR 为 foreach 系列算子的**第二批**非连续输入和输出支持,涉及 4 个算子: | 算子 | 改造 | |------|------| | aclnnForeachDivScalarV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachAddListV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachLerpScalar | 新增手写 aclnn(aclScalar*) | | aclnnForeachAddcdivScalarList | 新增手写 aclnn(aclTensor*) | ### 实现方式 - CMakeLists 改为 aclnn_exclude,手写 aclnn 层 - 使用 ForeachMakeContiguousTensorList + ForeachViewCopyToOutputTensorList 实现非连续输入输出支持 - 复用 foreach_contiguous_helper.h,与第一批 PR #6980 保持一致 ### 参数检查修改 - CheckParams 增加 tensorList 长度一致性校验(x->Size() == out->Size() 等) - scalar 按 BF16→FLOAT 特殊处理,其余按输入 dtype 转换(ConvertToTensor) ### 文档修改 - 7 个 README.md:将"输出支持非连续Tensor"更正为"输出不支持非连续Tensor"(kernel 本不支持非连续,非连续由 aclnn 层处理) - 11 个 aclnn docs:out(输出)非连续标记由 × 改为 ✓ ### UT 覆盖 - LerpScalar、AddcdivScalarList:新增非连续 op_api UT 用例 - DivScalarV2、AddListV2:在已有 UT 中补充非连续测试用例 ## 测试 ATK 测试通过。 See merge request: cann/ops-nn!7374 | 6 天前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7374 merge feat/foreach-non-contiguous-batch2 into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 说明 本 PR 为 foreach 系列算子的**第二批**非连续输入和输出支持,涉及 4 个算子: | 算子 | 改造 | |------|------| | aclnnForeachDivScalarV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachAddListV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachLerpScalar | 新增手写 aclnn(aclScalar*) | | aclnnForeachAddcdivScalarList | 新增手写 aclnn(aclTensor*) | ### 实现方式 - CMakeLists 改为 aclnn_exclude,手写 aclnn 层 - 使用 ForeachMakeContiguousTensorList + ForeachViewCopyToOutputTensorList 实现非连续输入输出支持 - 复用 foreach_contiguous_helper.h,与第一批 PR #6980 保持一致 ### 参数检查修改 - CheckParams 增加 tensorList 长度一致性校验(x->Size() == out->Size() 等) - scalar 按 BF16→FLOAT 特殊处理,其余按输入 dtype 转换(ConvertToTensor) ### 文档修改 - 7 个 README.md:将"输出支持非连续Tensor"更正为"输出不支持非连续Tensor"(kernel 本不支持非连续,非连续由 aclnn 层处理) - 11 个 aclnn docs:out(输出)非连续标记由 × 改为 ✓ ### UT 覆盖 - LerpScalar、AddcdivScalarList:新增非连续 op_api UT 用例 - DivScalarV2、AddListV2:在已有 UT 中补充非连续测试用例 ## 测试 ATK 测试通过。 See merge request: cann/ops-nn!7374 | 6 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7374 merge feat/foreach-non-contiguous-batch2 into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 说明 本 PR 为 foreach 系列算子的**第二批**非连续输入和输出支持,涉及 4 个算子: | 算子 | 改造 | |------|------| | aclnnForeachDivScalarV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachAddListV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachLerpScalar | 新增手写 aclnn(aclScalar*) | | aclnnForeachAddcdivScalarList | 新增手写 aclnn(aclTensor*) | ### 实现方式 - CMakeLists 改为 aclnn_exclude,手写 aclnn 层 - 使用 ForeachMakeContiguousTensorList + ForeachViewCopyToOutputTensorList 实现非连续输入输出支持 - 复用 foreach_contiguous_helper.h,与第一批 PR #6980 保持一致 ### 参数检查修改 - CheckParams 增加 tensorList 长度一致性校验(x->Size() == out->Size() 等) - scalar 按 BF16→FLOAT 特殊处理,其余按输入 dtype 转换(ConvertToTensor) ### 文档修改 - 7 个 README.md:将"输出支持非连续Tensor"更正为"输出不支持非连续Tensor"(kernel 本不支持非连续,非连续由 aclnn 层处理) - 11 个 aclnn docs:out(输出)非连续标记由 × 改为 ✓ ### UT 覆盖 - LerpScalar、AddcdivScalarList:新增非连续 op_api UT 用例 - DivScalarV2、AddListV2:在已有 UT 中补充非连续测试用例 ## 测试 ATK 测试通过。 See merge request: cann/ops-nn!7374 | 6 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
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 | 14 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
【社区任务】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 | 10 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
feat: foreach系列算子支持非连续输入和输出 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7374 merge feat/foreach-non-contiguous-batch2 into master feat: foreach系列算子支持非连续输入和输出 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 说明 本 PR 为 foreach 系列算子的**第二批**非连续输入和输出支持,涉及 4 个算子: | 算子 | 改造 | |------|------| | aclnnForeachDivScalarV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachAddListV2 | 改造已有手写 aclnn(aclScalar*) | | aclnnForeachLerpScalar | 新增手写 aclnn(aclScalar*) | | aclnnForeachAddcdivScalarList | 新增手写 aclnn(aclTensor*) | ### 实现方式 - CMakeLists 改为 aclnn_exclude,手写 aclnn 层 - 使用 ForeachMakeContiguousTensorList + ForeachViewCopyToOutputTensorList 实现非连续输入输出支持 - 复用 foreach_contiguous_helper.h,与第一批 PR #6980 保持一致 ### 参数检查修改 - CheckParams 增加 tensorList 长度一致性校验(x->Size() == out->Size() 等) - scalar 按 BF16→FLOAT 特殊处理,其余按输入 dtype 转换(ConvertToTensor) ### 文档修改 - 7 个 README.md:将"输出支持非连续Tensor"更正为"输出不支持非连续Tensor"(kernel 本不支持非连续,非连续由 aclnn 层处理) - 11 个 aclnn docs:out(输出)非连续标记由 × 改为 ✓ ### UT 覆盖 - LerpScalar、AddcdivScalarList:新增非连续 op_api UT 用例 - DivScalarV2、AddListV2:在已有 UT 中补充非连续测试用例 ## 测试 ATK 测试通过。 See merge request: cann/ops-nn!7374 | 6 天前 | |
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 | 14 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
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 | 14 天前 | |
test(assets): 补充foreach/scatter类等算子的golden标杆 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7659 merge feat-ttk-golden-assets into master test(assets): 补充foreach/scatter类等算子的golden标杆 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 test(assets): 补充foreach/scatter类等算子的golden标杆 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 不涉及 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7659 | 2 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
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 | 14 天前 | |
【社区任务】ForeachAddScalarV2 支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5667 merge submit-foreachaddscalar into master 【社区任务】ForeachAddScalarV2 支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。为现有的 aclnnForeachAddScalarV2 算子增加对 DT_INT16、DT_INT8、DT_UINT8 数据类型的支持,以满足网络量化及端侧推理场景对底层核心算子的完备性要求。 ### 1.2 背景介绍 ForeachAddScalar 算子用于对张量列表(Tensor List)执行逐元素的标量加法运算。其核心数学计算公式为: $y_i = x_i + \alpha$ 根据最新算子原型定义,当前算子已支持 FLOAT16、FLOAT32、INT32、BFLOAT16。本项目要求在现有代码架构下,新增对 INT16、INT8、UINT8 这三种整型数据的支持。 **关键架构决策**: 为了保持底层 InnerComputer 计算流的统一性与极简性,并兼顾精度,本设计采用精度提升(Cast)机制: * **int16_t**:统一转换(Cast)为 float (float32) 进行 Adds 处理,计算完成后截断回 int16_t。 * **int8_t / uint8_t**:统一转换(Cast)为 half (float16) 进行 Adds 处理,计算完成后截断回原 8-bit 类型。 ## 二、 需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供低比特整型与 float / half 之间的精度双向转换及饱和截断(CAST_RINT)机制。 * 依赖现有的 ForeachOneScalarBinary 通用单标量二元操作模板框架。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | --- | --- | --- | | op_host | foreach_add_scalar_def.cpp | 扩展原型 DataType,新增 DT_INT16/DT_INT8/DT_UINT8。明确 scalar 的对应关系。 | | op_host | foreach_tiling_func.cpp | **修改 UB 切分策略**:int16_t 按照 float (4 Bytes) 预留;int8_t/uint8_t 按照 half (2 Bytes) 预留。 | | op_kernel | foreach_add_scalar.cpp | 新增 TILING_KEY_IS 路由分支:int16_t 路由至 float 适配器;int8/uint8 路由至 half 适配器。 | | op_kernel | foreach_one_scalar_binary.h | 扩展 InnerComputer 模板特化,新增整型转浮点型执行运算的双向转换流水线编排。 | | op_kernel | kernel_foreach_base.h<br> <br>kernel_foreach_unary.h | 补充底层基础模板对这三种整型的识别萃取及 COPY_SPACE_MULTIPLE 倍数控制。 | ## 三、 需求详细设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | --- | --- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | ### 3.2 算子原型设计 ### 算子原型表格 该表格清晰界定了算子的输入输出类型、维度约束及格式要求。 | 名称 | 类别 | 数据类型 | Format | Shape | 说明 | | --- | --- | --- | --- | --- | --- | | **x** | 输入 | FLOAT16, FLOAT32, BF16, INT32, **INT16, INT8, UINT8** | ND | 0-8 维 | 输入张量列表,列表中所有 Tensor 类型需一致 | | **scalar** | 输入 | FLOAT16, FLOAT32, FLOAT32, INT32, **INT32, INT32, INT32** | ND | [1] | 待加的标量值,与 Tensor 元素类型保持绑定 | | **y** | 输出 | FLOAT16, FLOAT32, BF16, INT32, **INT16, INT8, UINT8** | ND | 与 x 一致 | 输出张量列表,结果 $y_i = x_i + \alpha$ | 修改 op_host/foreach_add_scalar_def.cpp,同步更新数据类型并严格限制硬件架构: cpp explicit ForeachAddScalar(const char* name) : OpDef(name) { // 输入张量支持的 dtype 列表新增整型 std::vector<ge::DataType> tensor_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_BF16, ge::DT_INT16, ge::DT_INT8, ge::DT_UINT8 }; // 标量支持的 dtype 列表(BF16 对应 FLOAT,整型严格一一对应) std::vector<ge::DataType> scalar_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32 }; 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->Input("scalar") .ParamType(REQUIRED) .DataType(scalar_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Output("y") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list); OpAICoreConfig membaseCfg; membaseCfg.DynamicCompileStaticFlag(true) .DynamicRankSupportFlag(true) .DynamicShapeSupportFlag(true) .ExtendCfgInfo("opFile.value", "foreach_add_scalar"); // 仅保留 A2/A3 对应的系列 this->AICore().AddConfig("ascend910b", membaseCfg); this->AICore().AddConfig("ascend910_93", membaseCfg); } ### 3.3 详细设计 #### 3.3.1 Host 侧设计:UB 切分策略修改 在 foreach_utils/op_host/foreach_tiling_func.cpp 中,负责 UB 切分的逻辑需根据中间计算类型分类处理: 1. **DT_INT16 (Key 5)**:由于在 V 单元内部必须先 Cast 成 float32 才能进行计算,因此在 Host 侧计算单次最大处理数据量(ub_size 和 tileDataNum)时,必须**按照 float32(4 字节)的内存诉求来预留和切分 UB 空间**。 2. **DT_INT8 (Key 7) / DT_UINT8 (Key 8)**:由于在 V 单元内部将 Cast 成 half (float16) 进行计算,必须**按照 half(2 字节)的内存诉求来预留和切分 UB 空间**。 两者均需应用相应的 COPY_SPACE_MULTIPLE 逻辑,确保中转所需的临时张量空间充足。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_add_scalar.cpp 中,增加针对三种新类型的入口调用。 cpp // ... 现有 FLOAT16, FLOAT32, INT32 分支 ... #if __CCE_AICORE__ >= 220 else if (TILING_KEY_IS(3)) { ForeachOneScalarBinary<int, int, AddsAdapter<int>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); #if !(defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3003 || __NPU_ARCH__ == 3113)) } else if (TILING_KEY_IS(4)) { ForeachOneScalarBinary<bfloat16_t, float, AddsAdapter<float>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(5)) { // int16_t 提升至 float 计算 ForeachOneScalarBinary<int16_t, float, AddsAdapter<float>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { // int8_t 提升至 half 计算 ForeachOneScalarBinary<int8_t, half, AddsAdapter<half>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { // uint8_t 提升至 half 计算 ForeachOneScalarBinary<uint8_t, half, AddsAdapter<half>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); #endif } #endif **3.3.2.2 扩展 InnerComputer 模板特化** 在 foreach_one_scalar_binary.h 中补充特化。 * 针对 int16_t,引入 <int16_t, float, op> 的特化:Cast(floatTensor, int16_Tensor) -> Adds(floatTensor, scalar_float) -> Cast(int16_Tensor, floatTensor, CAST_RINT)。 * 针对 8-bit,引入 <int8_t, half, op> 及 <uint8_t, half, op> 的特化,使用 half 张量作为指令计算的中转站。 * **注意标量转换**:通过类型偏特化机制,将标量安全读取为内部的 TT 类型(即 float 或 half),防范底层编译器的 float = unsigned 非法转换拦截。 #### 3.3.3 Ascend C 侧运行流程图  ### 3.4 支持硬件 * **Atlas A2 训练系列产品 / Atlas A3 系列产品** (对应 ascend910_93 及 ascend910b)。 ### 3.5 算子约束与异常拦截机制 1. **构建阻断拦截**:如果在前端执行或编译期发现未注册的类型组合(例如输入 dtype 不在定义的列表内),构建流程将直接报错失败,**绝不触发降级至 CPU 的回退机制**。原型库 (op_def)、Tiling 策略与 Kernel 侧的泛型分支必须维持强一致闭环。 2. **张量类型一致性**:输入的 x 张量列表、scalar 标量张量、输出的 y 张量列表在对应维度上的数据类型必须完全匹配。 ## 四、 验收及可维可测标准 ### 4.1 精度与性能标准 * **精度标准**:满足 AscendOpTest 默认阈值。由于整型算子底层全部执行提权计算,整数运算的期望基准应为: * int16_t:转化为 float64/float32 -> 计算 $x_i + \alpha$ -> 采用 round 四舍五入 -> 执行 int16_t 边界的饱和截断。 * int8/uint8:转化为 float16 -> 计算 $x_i + \alpha$ -> 采用 round 四舍五入 -> 执行目标数据类型边界的饱和截断。 * **性能标准**:增加类型的吞吐率应对齐已有涉及双向 Cast 操作的 BFLOAT16 方案,确保计算单元 (V) 与搬运单元 (MTE2/MTE3) 的流水线被充分掩盖。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #3091 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 通过了eager测试、ut测试、AscendOpTest测试。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachAddScalar.md、aclnnForeachAddScalarV2.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5667 | 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 | 14 天前 | |
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 | 7 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 天前 | ||
| 6 天前 | ||
| 14 天前 | ||
| 6 天前 | ||
| 2 天前 | ||
| 4 天前 | ||
| 14 天前 | ||
| 2 天前 | ||
| 6 天前 | ||
| 6 天前 | ||
| 2 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 10 天前 | ||
| 14 天前 | ||
| 2 天前 | ||
| 12 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 6 天前 | ||
| 2 天前 | ||
| 6 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 7 天前 | ||
| 6 天前 | ||
| 6 天前 | ||
| 6 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 2 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 6 天前 | ||
| 2 天前 | ||
| 14 天前 | ||
| 2 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 10 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 6 天前 | ||
| 14 天前 | ||
| 2 天前 | ||
| 14 天前 | ||
| 2 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 4 天前 | ||
| 14 天前 | ||
| 7 个月前 |