| aiv_dpu context结构体切换
Co-authored-by: zzg_code<zengzhiguo1@huawei.com>
Co-authored-by: y00951989<yangshengjun3@huawei.com>
# message auto-generated for no-merge-commit merge:
!3665 merge dpu_pr into master
aiv_dpu context结构体切换
Created-by: yangshengjun703
Commit-by: y00951989;zzg_code
Merged-by: cann-robot
Description: ## 描述
dispatch/combine算子实现aiv dpu直驱下A5 context结构体切换
## 关联Issue
关联的Issue [https://gitcode.com/cann/ops-transformer/issues/1880](url)
## 测试
完成本地、线上 rdv 及 8p pod 环境用例测试,精度通过
# NPU算子代码检视报告
**项目名称**:MoE算子代码修改检视
**PR链接**:https://gitcode.com/cann/ops-transformer/pull/3665
**检视文件**:3665.diff
**检视人**:Turing Team
**检视日期**:2026-04-14
---
## 检视概览
| 统计项 | 数值 |
|-------|------|
| 发现问题总数 | 6 个 |
| 严重级(CRITICAL)问题 | 2 个 |
| 中等级(MEDIUM)问题 | 2 个 |
| 轻微级(LOW)问题 | 2 个 |
**核心结论**:本次修改涉及 MoE 算子的 V2 到 V3 版本迁移、新增 Mc2Context 通信上下文管理类、build.sh 自动编译配置等,发现 6 处需要关注的问题,其中 2 处严重问题需要优先修复。
---
## 问题详情及修改建议
### 问题ID:ISSUE-001 | 严重级别:CRITICAL
**关联红线条款**:cpp-secure 3.6 / cpp-general 4.2
**代码路径**:build.sh:1408-1413
**问题类型**:字符串存储越界
**问题描述**:build.sh 中使用字符串拼接将 V3 版本算子名添加到编译列表时,未检查 ascend_op_name 变量的长度是否足以容纳新增内容。若原始 ascend_op_name 长度接近变量容量,可能导致字符串截断或行为异常。
**修改建议**:
```bash
# bash 变量赋值在大多数情况下会自动扩展,风险较低
# 建议在赋值前检查原始字符串长度,或使用更安全的方式
if [[ "${ascend_op_name}" == *"moe_distribute_combine_v2"* ]] && [[ "${ascend_op_name}" != *"moe_distribute_combine_v3"* ]]; then
ascend_op_name="${ascend_op_name};moe_distribute_combine_v3"
fi
# 同样处理 dispatch
```
---
### 问题ID:ISSUE-002 | 严重级别:CRITICAL
**关联红线条款**:cpp-secure 5.1 / cpp-secure 5.2 / cpp-secure 3.5
**代码路径**:mc2_context.h - Mc2Context 类
**问题类型**:空指针未保护 / 资源泄露
**问题描述**:使用 dlopen/dlsym 动态加载 HCCL 库时,dlopen 返回的句柄和 dlsym 获取的函数指针均未进行空值检查。若库文件不存在、版本不匹配或符号导出问题,可能导致后续调用空指针引发程序崩溃。此外,dlclose 的调用路径需要与 dlopen 配对。
**修改建议**:
```cpp
void* handle = dlopen(libPath.c_str(), RTLD_NOW | RTLD_GLOBAL);
if (handle == nullptr) {
OP_LOGE(ACLNN_ERR_INNER, "dlopen HCCL library failed: %s, error: %s", libPath.c_str(), dlerror());
return ACLNN_ERR_INNER;
}
void* func = dlsym(handle, "HcclRankGraphGetLinks");
if (func == nullptr) {
OP_LOGE(ACLNN_ERR_INNER, "Load func=%s error=%s in lib hccl failed.", funcName.c_str(), dlerror());
dlclose(handle);
return ACLNN_ERR_INNER;
}
```
**修改说明**:遵循 cpp-secure 5.1 资源申请后必须判断是否成功的要求,dlopen 和 dlsym 调用后必须进行返回值检查,失败时进行错误处理并释放已申请的资源。
---
### 问题ID:ISSUE-003 | 严重级别:MEDIUM
**关联红线条款**:cpp-secure 10.11 / cpp-secure 10.12
**代码路径**:mc2_moe_context.h - epRankId 字段类型
**问题类型**:结构体 ABI 兼容性
**问题描述**:将 epRankId 从 uint64_t 改为 uint32_t,这会导致结构体大小变化,可能与原有的二进制布局不兼容。若有存量设备上的旧版本结构体数据,可能导致解析错误。新增 rankSizePerServer 字段也需要确保在结构体末尾添加。
**修改建议**:
1. 若用于进程间通信(IPC)或持久化存储,需要版本号管理
2. 若仅用于同一进程内的运行时传递,需确认所有调用方已同步更新
3. 建议添加版本号字段或使用更安全的序列化方式
---
### 问题ID:ISSUE-004 | 严重级别:MEDIUM
**关联红线条款**:ascendc-topk 1 / cpp-secure 4.1
**代码路径**:moe_distribute_combine_v2_base.cpp - Mc2Context 调用
**问题类型**:函数返回值未校验
**问题描述**:新增的 Mc2Context 相关调用(如获取通信句柄、资源等)需要检查返回值。若通信初始化失败或资源获取失败,可能导致后续操作访问无效数据。
**修改建议**:
```cpp
auto ret = Mc2Aclnn::Mc2Context::GetMc2ContextTensor(groupEp, opName, hcclBuffSize, mc2Context);
if (ret != ACLNN_SUCCESS) {
OP_LOGE(ACLNN_ERR_INNER, "Get Mc2Context Tensor failed");
return ret;
}
```
---
### 问题ID:ISSUE-005 | 严重级别:LOW
**代码路径**:CMakeLists.txt
**问题类型**:依赖配置
**问题描述**:CMakeLists.txt 新增 mc2_context.cpp 编译,依赖项已正确配置。
---
### 问题ID:ISSUE-006 | 严重级别:LOW
**代码路径**:多个 cpp 文件
**问题类型**:代码风格
**问题描述**:接口调用从 aclnnInnerMoeDistributeCombineV2 改为 aclnnMoeDistributeCombineBase,逻辑正确。建议确认 V3 版本接口的兼容性。
---
## 修改汇总
| 问题ID | 严重级别 | 状态 | 修复建议 |
|--------|---------|------|---------|
| ISSUE-001 | CRITICAL | 待处理 | bash 字符串拼接风险较低,建议监控 |
| ISSUE-002 | CRITICAL | **需修复** | 必须增加 dlopen/dlsym 返回值检查 |
| ISSUE-003 | MEDIUM | 需确认 | 确认结构体使用场景,确保 ABI 兼容 |
| ISSUE-004 | MEDIUM | 建议修复 | 增加 Mc2Context 调用返回值检查 |
| ISSUE-005 | LOW | 已正确 | 无需修改 |
| ISSUE-006 | LOW | 已正确 | 无需修改 |
---
## 核心建议
1. **优先修复**: CRITICAL-002 - 动态库加载必须增加空值检查
2. **关注**: MEDIUM-003 - 结构体 ABI 兼容性需确认使用场景
3. **建议**: 所有 Mc2Context 调用处增加错误处理
---
## 涉及文件清单
- build.sh
- mc2/common/CMakeLists.txt
- mc2/common/op_api/mc2_context.cpp (新增)
- mc2/common/op_api/mc2_context.h (新增)
- mc2/common/op_kernel/mc2_moe_context.h
- mc2/moe_distribute_combine_v2/op_api/aclnn_moe_distribute_combine_v2.cpp
- mc2/moe_distribute_combine_v2/op_api/aclnn_moe_distribute_combine_v3.cpp
- mc2/moe_distribute_combine_v2/op_api/aclnn_moe_distribute_combine_v4.cpp
- mc2/moe_distribute_combine_v2/op_api/moe_distribute_combine_v2_base.cpp
- mc2/moe_distribute_combine_v2/op_api/moe_distribute_combine_v2_base.h
- mc2/moe_distribute_combine_v2/op_host/CMakeLists.txt
---
*报告生成时间:2026-04-14*
See merge request: cann/ops-transformer!3665 | 1 个月前 |