| feat: 支持常量折叠 V2 Host CPU 与 AICPU 路由能力
Co-authored-by: pan-tong<pantong@huawei.com>
# message auto-generated for no-merge-commit merge:
!1824 merge master into master
feat: 支持常量折叠 V2 Host CPU 与 AICPU 路由能力
Created-by: pan-tong
Commit-by: pan-tong
Merged-by: cann-robot
Description: # Pull Request
## 描述
本 PR 在 GE 仓打通常量折叠(Constant Folding)V2 端到端链路,包含 so 加载策略调整、V2 wrapper 与 per-handle 反向索引、LoadLib API 简化、配套 UT 与 stub 共 5 大块改动。
### 1. so 加载策略:先 dlopen V1 静态注册、后 Initialize V2 覆盖(host_cpu_engine.cc/.h)
HostCpuEngine::Initialize 调整加载顺序,使同名 op_type 上"AICPU V2 后写覆盖 V1"的 last-write-wins 语义自然生效:
| 顺序 | so | 动作 | 说明 |
|------|----|------|------|
| 1 | libconstant_folding_ops.so | 仅 dlopen | 该 so 无 Initialize 符号 |
| 2 | libops_host_cpu.so | **仅 dlopen,推迟 Initialize** | file-scope REGISTER_HOST_CPU_OP_BUILDER 注册的常量折叠算子先入册 |
| 3 | libaicpu_const_folding.so | dlopen + Initialize | 内部走 InitCpuConstantFoldingNew,对同名 op_type 通过 create_fns_[op_type] = create_fn 覆盖前一步注册项 |
| 4 (兜底) | libops_host_cpu.so | 仅当步骤 3 失败时调用其 Initialize | 注册 V1 wrapper,保证常量折叠链路可用 |
同时简化 LoadLib:
- 旧 API:LoadLib(path, require_init, invoke_init),含语义模糊的"调了但不在乎结果"灰色路径。
- 新 API:LoadLib(path, invoke_init = false),调用方先决定是否需要 Initialize,一旦决定调用则缺失/失败统一回 INTERNAL_ERROR。
- 拆出私有 DlopenLib / InvokeLibInitialize,便于"先 dlopen 推迟 Initialize、必要时再回头 Initialize"的场景复用。
### 2. V2 wrapper(aicpu_const_folding/host_cpu_kernel_wrapper.{cpp,h},新增)
新增 ge::HostCpuKernelWrapperOpV2 : public HostCpuOp,Compute 通过 per-handle binding 调用 opbase 暴露的 V2 接口;并以 REGISTER_HOST_CPU_OP_BUILDER("HostCpuKernelWrapperOpV2", ...) 完成静态注册。
### 3. V2 binding 与反向索引(aicpu_const_folding/folding.{cc,h})
- 每个 ops.so 一份 V2ModuleBinding,dlsym opbase 暴露的 C ABI 裸名符号 GetAllRegisteredOpTypesV2 / IsRegisteredV2 / RunCpuKernelV2。
- Initialize 期遍历 GetAllRegisteredOpTypesV2() 建立 op_type → V2ModuleBinding * 反向索引,运行期 O(1) 命中正确的 so。
- InitCpuConstantFoldingNew 中按 V2 表注册 wrapper 工厂 []{ return new HostCpuKernelWrapperOpV2(); },与 V1 路径完全对称。
- IsConstantFoldingSo 排除 libconstant_folding_ops.so,避免该 so 被重复扫描。
### 4. 单测与 stub
- tests/engines/cpueng/stub/aicpu/aicpu_stub.cpp:补齐 V2 符号 stub,供 UT 链接。
- tests/engines/cpueng/ut/cpu_engine/folding_ut.cpp:新增 V2 注册命中、V2 未命中回退 V1、IsConstantFoldingSo 排除规则等用例。
- tests/ge/ut/ge/common/host_cpu_engine_unittest.cc:新增 LoadLib_SkipInvokeInit,覆盖 invoke_init=false 不进入 dlsym 的分支。
## 变更类型
<!-- [x] 表示选中 -->
- [ ] 🐛 Bug 修复
- [x] ✨ 新功能
- [ ] 💄 代码风格更新(格式化,局部变量)
- [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动)
- [ ] 📦 构建过程或辅助工具的变动
- [ ] 📝 文档内容更新
## 关联的Issue
关联 Issue #383
## 如何测试
### 1. 编译
```bash
cd ge_1030/cmake-build-gcov
make ge_common cpu_engine_utest -j8
```
预期:ge_common 与 cpu_engine_utest 均编译通过。
### 2. UT 用例
```bash
# AICPU 常量折叠主用例
./tests/engines/cpueng/ut/cpu_engine_utest \
--gtest_filter='AicpuConstFoldingTest.*'
```
预期:9/9 PASSED。
```bash
# HostCpuEngine LoadLib 分支
./tests/ge/ut/ge/multiparts/ut_libge_multiparts_utest \
--gtest_filter='UTEST_host_cpu_engine.LoadLib*'
```
预期:包含新增 LoadLib_SkipInvokeInit 在内全部通过,覆盖 invoke_init=false 跳过 dlsym 分支。
### 3. 端到端
联合 cann/runtime#1522、cann/ge#1824 进行常量折叠 V2 端到端验证:


## 核对清单
<!-- [x] 表示选中 -->
- [x] 我的代码遵循了项目的代码风格
- [x] 我已对代码进行了自测
- [ ] 我已更新了相关的文档
- [x] 我在标题中使用了合适的类型标签(如:feat:, fix:)
- [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md)
## 其他信息
- 与 cann/runtime#1522(V2 注册/查询 C ABI)、cann/opbase#299(V2 优先调度)配套使用。各仓可以独立合入,已处理兼容性。
- 改动严格保持 V1 路径行为不变,V2 缺失场景自动回退到现有 V1 链路。
See merge request: cann/ge!1824 | 16 天前 |