| Files | Last commit | Last update |
|---|---|---|
perf: 优化 SparseSegmentMean 和 SparseSegmentSum AICPU 性能 Co-authored-by: Ding_Jing<dingjing19@huawei.com> # message auto-generated for no-merge-commit merge: !11057 merge perf/sparse-segment-eigen5 into master perf: 优化 SparseSegmentMean 和 SparseSegmentSum AICPU 性能 Created-by: Ding_Jing Commit-by: Ding_Jing Merged-by: cann-robot Description: ## 描述 Eigen 5.0 下 SparseSegmentMean 和 SparseSegmentSum 的 TensorMap/chip 热路径存在明显性能回退。 本 PR 将两个算子改为连续行 packet 循环与标量尾部,只对 segment 间隙清零,并保持逐元素累加顺序; 同步补充向量尾部、segment gap、负索引和有符号溢出等真实 kernel UT。 首轮流水线暴露 SparseSegmentSum 头文件依赖未自包含及 C++17 写法与生产 C++14 不兼容,已修复。 两个热函数的 CodeCheck NBNC 均已收敛:Mean 为 50,Sum 为 48。Mean 的最终修复保留原 while (true) 热循环;普通 helper 候选曾稳定回退约 5.6%,已否决,未进入本 PR。 本 PR 变更文件: - index/sparse_segment_mean/op_kernel_aicpu/sparse_segment_mean_aicpu.cpp - index/sparse_segment_mean/tests/ut/op_kernel_aicpu/test_sparse_segment_mean.cpp - index/sparse_segment_sum/op_kernel_aicpu/sparse_segment_sum_aicpu.cpp - index/sparse_segment_sum/op_kernel_aicpu/sparse_segment_sum_aicpu.h - index/sparse_segment_sum/tests/ut/op_kernel_aicpu/test_sparse_segment_sum.cpp ## 关联的Issue 关联 Issue #6138 ## 测试 - Mean 指定场景 FLOAT[104,105] + INT32[10922] + INT32[10922] -> FLOAT[3,105]: 最终 5x101 最慢均值 335.563 us,比 Eigen 3.4 的 722.35 us 门槛低 53.55%; 21x101 最终版/调整前复测比为 1.00093,95% CI [0.99960,1.00227]。 - Sum 指定场景 FLOAT[32,512] + INT32[8192] + INT32[8192] -> FLOAT[3,512]: CodeCheck 修复后 9x101 p50 平均 692.812 us,比 Eigen 3.4 的 924.43 us 门槛低约 24.8%; 修复后/修复前为 1.00130,95% CI [0.99905,1.00356]。 - 完整矩阵:Mean/Sum 共 56 个 dtype x shape 组合无确认性能回退;56/56 普通值和 6/6 特殊值 输出哈希一致。Mean 最终行数修复另做 12 组同机 A/B,输出哈希逐位一致且无确认回退。 - 独立 ABI=0 真实 kernel UT:Mean 12/12、Sum 9/9;ASan+UBSan 均通过,无报告。 - 当前源码 repo-native AICPU UT:Mean 12/12、Sum 9/9 均编译、链接并运行通过。 - 两个 graph example 均成功且输出与各自 host 参考一致。Mean 的 host/device plog 记录 aicpu_ascend_kernel::CheckSupported 和从 libcpu_kernels.so 取得 RunCpuKernel;Sum 的同一 会话记录 aicpu_custom_scheduler 与 CUSTOM_COMPUTE,确认实际执行 AICPU 路径。 - 本轮检视修复:x 第 0 维非法日志已补充算子名前缀和实际 dim0,并同步 canndev。 修复前后两仓各 68 个 ComputeKernelWithType 模板符号大小逐项一致,指定 FLOAT 实例 规范化指令一致;ops-nn Sum 真实 kernel UT 9/9、canndev 非文件驱动 UT 15/15 通过。 - 两仓均通过 -O2 -ftrapv -Wall -Wextra -Werror 严格编译;5 个变更文件连续两次通过 pre-commit(clang-format、OAT、codespell),git diff --check 通过。 - 当前单提交已通过服务端完整流水线,标签为 ci-pipeline-passed。 ## 文档更新 无产品文档变更;本地完整验证报告为 /home/ding-jing/ops_nn_sparse_segment_eigen5_perf_verification.md。 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [x] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!11057 | 1 month ago | |
Add SparseSegmentSum op migration Co-authored-by: jialimin1<jialimin1@huawei.com> # message auto-generated for no-merge-commit merge: !7621 merge migrate-sparse-segment-sum into master Add SparseSegmentSum op migration Created-by: jialimin1 Commit-by: jialimin1 Merged-by: cann-robot Description: ## 描述 将 SparseSegmentSum AICPU 算子迁移至 ops-nn 仓库,共新增 16 个文件,并同步更新 docs/zh/op_list.md。算子沿 segment_ids 指定的稀疏分段对 x 的切片求和,计算公式 y[segment_ids[i]] += x[indices[i]],兼容 TensorFlow SparseSegmentSum。 实现要点: 1. op_graph/sparse_segment_sum_proto.h:REG_OP(SparseSegmentSum) 注册 3 输入(x/indices/segment_ids)、1 输出(y),声明支持的数据类型集合(x/y 11 种 dtype,indices/segment_ids 为 INT32/INT64)。 2. op_host/sparse_segment_sum_infershape.cpp:校验 x rank≥1、indices/segment_ids 为 1D 且 shape 一致;输出 dim0 在 segment_ids 为 const 时取 max(segment_ids)+1,否则置 UNKNOWN_DIM;输出 dim[1:] 取 x[1:];输出 dtype 与 x 一致。 3. op_kernel_aicpu/sparse_segment_sum_aicpu.cpp:校验 segment_ids 非负且单调非递减、indices 元素 < x.dim(0);使用 Eigen TensorMap 按段累加 input_flat.chip<0>(indices[r]),段间 gap 与末尾 gap 用 setConstant(0) 填零;x 支持 11 种 dtype,indices/segment_ids 各支持 INT32/INT64(4 种组合)。 4. 配套 examples(图模式调用样例)、tests/ut(Host InferShape + kernel UT)、各级 CMakeLists.txt 与 README.md。 ## 关联的Issue #4294 ## 测试 根据代码变更,测试场景如下: 1. **编译构建测试** - 执行各级 CMakeLists.txt 配置与编译,验证 SparseSegmentSum 算子(op_graph / op_host / op_kernel_aicpu / tests)可正常构建。 2. **算子注册/加载验证** - 验证 REG_OP(SparseSegmentSum) 与 REGISTER_CPU_KERNEL(SparseSegmentSum, ...) 注册成功,算子可被框架正确识别并加载。 3. **InferShape 验证** - 运行 tests/ut/op_host/test_sparse_segment_sum_infershape.cpp,验证:x rank≥1 校验、indices/segment_ids 1D 且 shape 一致校验、const segment_ids 时输出 dim0 = max+1、非 const 时输出 dim0 = UNKNOWN_DIM、输出 dtype 与 x 一致。 4. **kernel 单元测试** - 运行 tests/ut/op_kernel_aicpu/test_sparse_segment_sum.cpp,覆盖 x 的 11 种数据类型(INT8/16/32/64、UINT8/16/32/64、FLOAT16/FLOAT/DOUBLE)与 indices/segment_ids 的 4 种 INT32/INT64 组合,验证累加结果与 gap 填零正确。 5. **参数校验测试** - 覆盖 SparseSegmentCheck / SparseSegmentDataCheck 中的边界场景:x rank<1、indices/segment_ids 元素数不一致、x/y dtype 不一致、segment_ids 存在负值、segment_ids 非单调递减、indices 元素 ≥ x.dim(0) 等,均应返回 KERNEL_STATUS_PARAM_INVALID。 6. **图模式接口调用验证** - 运行 examples/test_geir_sparse_segment_sum.cpp,通过 GE IR 构图方式调用 SparseSegmentSum 算子,验证端到端功能与输出正确性,并与 TensorFlow SparseSegmentSum 结果对齐。 7. **算子清单登记验证** - 确认 docs/zh/op_list.md 中 SparseSegmentSum 条目正确显示,分类为 index,README 链接可达。 ## 文档更新 - 新增 index/sparse_segment_sum/README.md:产品支持情况(Ascend 950PR/950DT 支持)、功能说明、参数说明(含完整数据类型表格)、约束说明与调用说明。 - 更新 docs/zh/op_list.md:登记 SparseSegmentSum 算子条目。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7621 | 3 months ago |