文件最后提交记录最后更新时间
optimize the performance of aicpu concatv2 operator Co-authored-by: ZhaiPeiChao<zhaipeichao@huawei.com> # message auto-generated for no-merge-commit merge: !2395 merge master into master optimize the performance of aicpu concatv2 operator Created-by: ZhaiPeiChao Commit-by: ZhaiPeiChao Merged-by: cann-robot Description: ## 描述 对 conversion/concat_v2 aicpu 算子进行性能优化重构。 **修改位置** - conversion/concat_v2/op_kernel_aicpu/concat_v2_aicpu.h - conversion/concat_v2/op_kernel_aicpu/concat_v2_aicpu.cpp - conversion/concat_v2/tests/ut/op_kernel_aicpu/test_concat_v2.cpp **修改原因与方法** 原实现在热路径上存在多项性能与工程规范问题,导致小张量多输入场景延迟偏高、多核扩展性受限: 1. **去除 Eigen 与 shared_ptr 抽象层**:原代码每个输入都 std::make_shared<Eigen::TensorMap<...>> 构造访问器,一次 Compute 产生 N 次堆分配,热路径存在两层指针解引用(shared_ptr → TensorMap → data),并因 shared_ptr 控制块在 shard 间拷贝导致引用计数原子 RMW 造成跨核 cache-line ping-pong。改为 POD 描述符 ConcatV2InputDesc{const T* base; int64_t dim1},在 Prepare 阶段一次性构建,热路径零分配、单层解引用。 2. **按自然边界(整行 / 输入区间)并行**:原 ParallelFor 使用元素级 grain(sizeof(T)),每个 shard 要处理"首尾半行"边界,分支多、memcpy 长度不稳定、任务数量级过大。改为按行切分(ByRow 路径)或按输入区间切分(ByInput 路径),per_unit_size 传整行字节数,shard 永远对齐到自然边界,每段都能走 libc memcpy ifunc 快路径。 3. **退化形态专用分支**:flat_dim0 == 1(含 axis=0、一维)场景走 ByInput 路径,通过前缀 offset + 输出区间切分让各 shard 写入不相交区间,彻底消除 false sharing;N == 1、空输入等也做前置处理。 4. **热内核函数 static 模板化 + 显式捕获 lambda**:CopyOneRow 改为头文件中的 static 模板函数,去 this 指针便于跨 TU 内联;并行 lambda 由默认捕获 [this, &...] 改为显式捕获,同时用 std::atomic<uint32_t> + memory_order_relaxed 收敛 shard 错误,避免原实现中 memcpy_s 失败被静默。 5. **合规与可维护性**:reinterpret_cast 替换为 aicpu::PtrToPtrCompute 拆分为 CheckParams / ParseInputs / ValidateShapes / DoCompute<T> 等小函数(单函数 ≤ 50 行、圈复杂度 ≤ 5);不改成员的方法加 const;关键路径补 KERNEL_LOG_INFO,错误分支补 KERNEL_LOG_ERROR 含上下文信息;CPU 核使用策略(是否预留)与原实现一致。 6. **UT 扩展**:在原 16 例基础上新增 9 例(共 25 例),覆盖新增的 ByRow/ByInput 分派路径、axis=0 与一维退化形态、N=1、空输入、多 dtype、错误路径,保证优化前后行为严格等价。 ## 关联的Issue [#1342](https://gitcode.com/cann/ops-math/issues/1342) ## 测试 - **UT 全量回归**:直接 cmake 构建 math_aicpu_op_kernel_ut(绕开 build.sh --opkernel_aicpu_testUT_TARGETS=() 已知 bug),25 例 UT 全部通过,覆盖常规路径、退化形态、错误路径、全部支持的 dtype。 - **等价性验证**:独立 microbench 对 7 个典型输入场景(小张量 × N 大、中等带宽、大张量、axis=0、N=1 等)执行 std::memcmp 逐字节比对,新旧实现输出完全一致。 - **性能验证**:在 1 / 4 / 10 三档线程下采集实测数据,典型场景加速 1.8×–7.6×。 ## 文档更新 无。 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [x] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!23951 个月前
optimize the performance of aicpu concatv2 operator Co-authored-by: ZhaiPeiChao<zhaipeichao@huawei.com> # message auto-generated for no-merge-commit merge: !2395 merge master into master optimize the performance of aicpu concatv2 operator Created-by: ZhaiPeiChao Commit-by: ZhaiPeiChao Merged-by: cann-robot Description: ## 描述 对 conversion/concat_v2 aicpu 算子进行性能优化重构。 **修改位置** - conversion/concat_v2/op_kernel_aicpu/concat_v2_aicpu.h - conversion/concat_v2/op_kernel_aicpu/concat_v2_aicpu.cpp - conversion/concat_v2/tests/ut/op_kernel_aicpu/test_concat_v2.cpp **修改原因与方法** 原实现在热路径上存在多项性能与工程规范问题,导致小张量多输入场景延迟偏高、多核扩展性受限: 1. **去除 Eigen 与 shared_ptr 抽象层**:原代码每个输入都 std::make_shared<Eigen::TensorMap<...>> 构造访问器,一次 Compute 产生 N 次堆分配,热路径存在两层指针解引用(shared_ptr → TensorMap → data),并因 shared_ptr 控制块在 shard 间拷贝导致引用计数原子 RMW 造成跨核 cache-line ping-pong。改为 POD 描述符 ConcatV2InputDesc{const T* base; int64_t dim1},在 Prepare 阶段一次性构建,热路径零分配、单层解引用。 2. **按自然边界(整行 / 输入区间)并行**:原 ParallelFor 使用元素级 grain(sizeof(T)),每个 shard 要处理"首尾半行"边界,分支多、memcpy 长度不稳定、任务数量级过大。改为按行切分(ByRow 路径)或按输入区间切分(ByInput 路径),per_unit_size 传整行字节数,shard 永远对齐到自然边界,每段都能走 libc memcpy ifunc 快路径。 3. **退化形态专用分支**:flat_dim0 == 1(含 axis=0、一维)场景走 ByInput 路径,通过前缀 offset + 输出区间切分让各 shard 写入不相交区间,彻底消除 false sharing;N == 1、空输入等也做前置处理。 4. **热内核函数 static 模板化 + 显式捕获 lambda**:CopyOneRow 改为头文件中的 static 模板函数,去 this 指针便于跨 TU 内联;并行 lambda 由默认捕获 [this, &...] 改为显式捕获,同时用 std::atomic<uint32_t> + memory_order_relaxed 收敛 shard 错误,避免原实现中 memcpy_s 失败被静默。 5. **合规与可维护性**:reinterpret_cast 替换为 aicpu::PtrToPtrCompute 拆分为 CheckParams / ParseInputs / ValidateShapes / DoCompute<T> 等小函数(单函数 ≤ 50 行、圈复杂度 ≤ 5);不改成员的方法加 const;关键路径补 KERNEL_LOG_INFO,错误分支补 KERNEL_LOG_ERROR 含上下文信息;CPU 核使用策略(是否预留)与原实现一致。 6. **UT 扩展**:在原 16 例基础上新增 9 例(共 25 例),覆盖新增的 ByRow/ByInput 分派路径、axis=0 与一维退化形态、N=1、空输入、多 dtype、错误路径,保证优化前后行为严格等价。 ## 关联的Issue [#1342](https://gitcode.com/cann/ops-math/issues/1342) ## 测试 - **UT 全量回归**:直接 cmake 构建 math_aicpu_op_kernel_ut(绕开 build.sh --opkernel_aicpu_testUT_TARGETS=() 已知 bug),25 例 UT 全部通过,覆盖常规路径、退化形态、错误路径、全部支持的 dtype。 - **等价性验证**:独立 microbench 对 7 个典型输入场景(小张量 × N 大、中等带宽、大张量、axis=0、N=1 等)执行 std::memcmp 逐字节比对,新旧实现输出完全一致。 - **性能验证**:在 1 / 4 / 10 三档线程下采集实测数据,典型场景加速 1.8×–7.6×。 ## 文档更新 无。 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [x] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!23951 个月前
feat: migrate math+conversion json ops to opdef pipeline Co-authored-by: zhaowenrui666<zhaowenrui7@huawei.com> # message auto-generated for no-merge-commit merge: !2130 merge mathdef into master feat: migrate math+conversion json ops to opdef pipeline Created-by: zhaowenrui666 Commit-by: zhaowenrui666 Merged-by: cann-robot Description: ## 描述 math仓aicpu算子信息库由json融合修改为op def文件,修改注册方式以及工程适配 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/1271 ## 测试 本次按 ENABLE_CUSTOM=ON 的 custom 路径验收,已验证 OpDef -> libaicpu_ops.so -> op_build --aicpu -> aicpu_kernel.ini -> parser_ini.py -> cust_aicpu_kernel.json 链路跑通,相关产物已生成并校验通过。AICPU before/after 与 I/O 对比已按新规则重评:input/output -> input0/output0 视为规范化差异;RightShift、SearchSorted、Sinh 在整改前 JSON 缺 I/O,但已对齐 CANN 基线 aicpu_kernel.ini,不判缺失;AddN: input0 -> dynamic_input0 和 AddFake -> Add 也已确认接受,不作为阻塞项。 AICore 回归已补做,before/after 经 parser_ini.py 转 json 后无差异。综合结论:本提交满足当前 OpDef 整改验收标准,可通过。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!21301 个月前