| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
回退D&C算子context修改 Co-authored-by: zzg_code<zengzhiguo1@huawei.com> # message auto-generated for no-merge-commit merge: !5314 merge revert-mr-5224-1778740208497-auto into master 回退D&C算子context修改 Created-by: zzg_code Commit-by: zzg_code Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!5314 | 1 个月前 | |
将mc2下的算子中gen_task包含3-8包编译部分的内容删除 Co-authored-by: hid81635372<wujianfei15@huawei.com> # message auto-generated for no-merge-commit merge: !2793 merge gen_task into master 将mc2下的算子中gen_task包含3-8包编译部分的内容删除 Created-by: hid81635372 Commit-by: hid81635372 Merged-by: cann-robot Description: ## 描述 将gen_task中废弃的3-8包编译部分内容删除 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/1477 ## 测试 回黄编译transformer包通过,编译legacy包通过,产物检查无异常,MC2的A2、A3、A5二级冒烟已过 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [x] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!2793 | 3 个月前 | |
D&C Fix Communication Engine Index Co-authored-by: gitcode_lijd<lijiandong20@huawei.com> # message auto-generated for no-merge-commit merge: !5261 merge fix_2 into master D&C Fix Communication Engine Index Created-by: gitcode_lijd Commit-by: gitcode_lijd Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2385 <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> **检视文件**:mc2_tiling_utils.h **修改内容**:修改 A5_CCU_ENGINE 常量值(5 → 0) **规范来源**:cpp-secure.md、cpp-general.md --- ## 修改内容说明 ### 本次修改的目的 将 A5 芯片的通信引擎配置从 CCU_MS(值5)改为默认值(值0)。 ### 原方案 **常量定义**: cpp constexpr uint8_t A5_CCU_ENGINE = 5; // CCU_MS引擎类型 **注释说明**: cpp /** 当前通信API未提供枚举,后续会提供 0:默认值 1:HOST_TS(A2/3支持 A5不支持)2:AICPU_TS(A2/3支持 A5不支持) 3:AIV 4:AIV_ONLY(A2/3支持 A5不支持) 5:CCU_MS(A2/3支持 A5不支持) 6:CCU_SCHED(A2/3支持 A5不支持) 7:AICPU_UB/ROCE(A5不支持) **/ ### 新方案 **修改点**: cpp constexpr uint8_t A5_CCU_ENGINE = 0; // 改为COMM_ALG_DEFAULT **使用场景**(arch35目录下两个算子): - moe_distribute_dispatch_v2_tiling_arch35.cpp:845 - moe_distribute_combine_tiling_arch35.cpp:679 cpp mc2CcTilingConfig.SetCommEngine(mc2tiling::A5_CCU_ENGINE); --- ## 问题列表 | 序号 | 级别 | 问题描述 | 行号 | 规范条款 | |-----|------|---------|-----|---------| | 1 | 中 | 常量命名与实际值语义不符 | 10,23 | 规范4.2 | | 2 | 低 | 缺少修改说明和原因 | 全文件 | 规范1.3 | --- ## 问题详情 ### 1. 常量命名与实际值语义不符 [中风险] **假设检验过程**: - **H0**:修改后常量语义清晰,不影响理解 - **H1**:常量名称与值不匹配,可能导致误解 - **自信值初始化**:0% **证据收集**: 1. **规范违反** (+40%): - 规范 4.2(cpp-general.md):禁止使用魔鬼数字/字符串,常量命名应体现语义 - 原定义:A5_CCU_ENGINE = 5,名称明确表示"CCU引擎",值5对应注释中的"CCU_MS" - 新定义:A5_CCU_ENGINE = 0,名称仍为"CCU引擎",但值0是"默认值"(COMM_ALG_DEFAULT) - 命名与值语义不符:A5_CCU_ENGINE 暗示CCU引擎,但值0是默认值 2. **上下文防御缺失** (+30%): - 未修改注释说明,注释仍显示"5:CCU_MS" - 新值为0,但注释中0的含义是"默认值",不是CCU引擎 3. **数据流追踪风险** (+25%): - 使用场景在arch35目录(A5芯片相关),调用 SetCommEngine(A5_CCU_ENGINE) - 如果A5不支持CCU_MS(值5),改为默认值(值0)是合理的 - 但常量名称应改为 A5_DEFAULT_ENGINE 或类似命名 **自信值**:95%(超过60%,判定为中风险) **风险代码**: cpp // 5159.diff 第10、23行 -constexpr uint8_t A5_CCU_ENGINE = 5; +constexpr uint8_t A5_CCU_ENGINE = 0; **建议修复方案**: **方案A**:修改常量名称以匹配语义 cpp // 如果A5不支持CCU,使用默认引擎 constexpr uint8_t A5_DEFAULT_ENGINE = 0; // 或 A5_COMM_DEFAULT **方案B**:保留名称,但更新注释说明 cpp /** 当前通信API未提供枚举,后续会提供 0:默认值(A5使用) 1:HOST_TS(A2/3支持) 2:AICPU_TS(A2/3支持) 3:AIV 4:AIV_ONLY(A2/3支持) 5:CCU_MS(A2/3支持,A5不支持) 6:CCU_SCHED(A2/3支持) 7:AICPU_UB/ROCE(A5不支持) **/ constexpr uint8_t A5_CCU_ENGINE = 0; // A5使用默认引擎,不支持CCU --- ### 2. 缺少修改说明和原因 [低风险] **假设检验过程**: - **H0**:修改有明确的设计意图 - **H1**:修改原因未说明,影响可维护性 - **自信值初始化**:0% **证据收集**: 1. **规范违反** (+40%): - 规范 1.3(cpp-general.md):删除无效、冗余或永不执行的代码需说明原因 - 修改常量值属于重要配置变更,应说明修改原因 2. **上下文防御缺失** (+30%): - diff 中仅修改值,无commit message或注释说明原因 - 从注释"CCU_MS(A2/3支持 A5不支持)"推断:可能因A5不支持CCU而改为默认值 3. **数据流追踪风险** (+25%): - 修改影响通信引擎配置,可能影响性能和功能 - 应说明:为何A5不能用CCU_MS、改为0后的影响 **自信值**:95%(超过60%,判定为低风险) **建议修复方案**: - 在commit message中说明:"A5芯片不支持CCU_MS引擎,改为使用默认通信引擎配置" - 或在代码注释中补充说明 --- ## 总结 **修改合理性分析**: - 从注释"A5不支持CCU_MS"推断,修改可能合理(A5不支持值5,改用默认值0) - 但存在命名和语义不符问题 **建议**: 1. 修改常量名称为 A5_DEFAULT_ENGINE 或更新注释说明语义变更 2. 补充修改原因说明,提高可维护性 --- See merge request: cann/ops-transformer!5261 | 1 个月前 | |
回退D&C算子context修改 Co-authored-by: zzg_code<zengzhiguo1@huawei.com> # message auto-generated for no-merge-commit merge: !5314 merge revert-mr-5224-1778740208497-auto into master 回退D&C算子context修改 Created-by: zzg_code Commit-by: zzg_code Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!5314 | 1 个月前 | |
修复A2A3环境下EsTranspose和aclrtGetArgsFromExceptionInfo符号未定义问题 Co-authored-by: y00951989<yangshengjun3@huawei.com> # message auto-generated for no-merge-commit merge: !5077 merge A2A3_pr into master 修复A2A3环境下EsTranspose和aclrtGetArgsFromExceptionInfo符号未定义问题 Created-by: yangshengjun703 Commit-by: y00951989 Merged-by: cann-robot Description: ## 描述 解决A2A3环境下EsTranspose和aclrtGetArgsFromExceptionInfo符号未定义问题 ## 关联Issue 关联的Issue [https://gitcode.com/cann/ops-transformer/issues/2334](url) ## 测试 完成线上A5 A2 A3 rdv 及 本地问题单复现场景A2A3的用例测试,精度通过 # Ascend C 算子代码检视报告 ## 1. 检视概要 **检视文件**:C:\y00951989\5077.diff(171行) **检视模式**:PR 检视(C++安全检视) **检视范围**: - **文件1**:mc2/common/utils/mc2_exception_dump.h - 异常处理动态库加载改造 - **文件2**:mc2/matmul_allto_all/op_graph/fusion_pass/matmul_all_to_all_transpose_a5_fusion_pass.cpp - fusion pass 动态库加载 **核心变更**: - 使用 dlopen/dlsym 动态加载 API 函数,替代直接调用 - 目的:解决符号依赖问题,提升版本兼容性 **问题统计**: - **CRITICAL级别**:2个(空指针解引用、资源泄露) - **MEDIUM级别**:2个(外部输入校验、LOG安全) - **LOW级别**:0个 **检视结论**:该PR引入动态库加载机制解决版本兼容性问题,但存在**2个CRITICAL级别安全风险**,必须在合并前修复。 --- ## 2. 问题详情(按严重级别排序) ### CRITICAL-1:空指针解引用风险(cpp-secure 3.5) **严重级别**:CRITICAL(高) **假设检验过程**: | 步骤 | 假设与证据 | 自信值 | |------|-----------|-------| | **H0** | func 指针在使用前已判空 | 0% | | **证据1** | 行152: static EsTransposeFunc func = GetEsTransposeFunc(); 从 GetEsTransposeFunc() 获取指针 | +40% | | **证据2** | GetEsTransposeFunc() 可能返回 nullptr(dlopen 或 dlsym 失败时,第139、145行) | +30% | | **证据3** | TransposeDL 函数中第154行直接调用 func(...),未进行判空检查 | +30% | | **H1** | **func 指针可能为 nullptr,直接调用会导致程序崩溃** | **100%** | **关联条款**:cpp-secure 3.5(指针使用前判空)、TOPK-1(必须校验函数返回值) **代码路径**:mc2/matmul_allto_all/op_graph/fusion_pass/matmul_all_to_all_transpose_a5_fusion_pass.cpp(diff行152-154) **问题类型**:内存安全 - 空指针解引用 **问题代码片段**: cpp // 行150-157(TransposeDL 函数) ge::es::EsTensorHolder TransposeDL(const ge::es::EsTensorLike& x, const ge::es::EsTensorLike& perm) { static EsTransposeFunc func = GetEsTransposeFunc(); // ❌ 可能返回 nullptr auto* builder = ge::es::ResolveBuilder(x, perm); auto result = func(x.ToTensorHolder(builder).GetCTensorHolder(), // ❌ 直接调用,未判空 perm.ToTensorHolder(builder).GetCTensorHolder()); return result; } **修改建议**: cpp // ✅ 正确:添加判空检查 ge::es::EsTensorHolder TransposeDL(const ge::es::EsTensorLike& x, const ge::es::EsTensorLike& perm) { static EsTransposeFunc func = GetEsTransposeFunc(); if (func == nullptr) { OPS_LOG_E("MatmulAllToAllTransposeA5FusionPass", "EsTranspose function not loaded"); return ge::es::EsTensorHolder(); // 返回空对象或抛出异常 } auto* builder = ge::es::ResolveBuilder(x, perm); auto result = func(x.ToTensorHolder(builder).GetCTensorHolder(), perm.ToTensorHolder(builder).GetCTensorHolder()); return result; } --- ### CRITICAL-2:资源泄露风险(cpp-secure 5.2) **严重级别**:CRITICAL(高) **假设检验过程**: | 步骤 | 假设与证据 | 自信值 | |------|-----------|-------| | **H0** | dlopen handle 资源正确释放 | 0% | | **证据1** | 行136:dlopen("libes_math.so", RTLD_LAZY | RTLD_GLOBAL) 使用 RTLD_LAZY | RTLD_GLOBAL 标志 | +40% | | **证据2** | RTLD_LAZY | RTLD_GLOBAL 标志会增加动态库的引用计数 | +30% | | **证据3** | 整个函数作用域内无 dlclose 调用(第136-148行) | +30% | | **证据4** | handle 为局部变量,函数返回后丢失,无法后续释放 | +20% | | **H1** | **dlopen 增加了引用计数,但未配对 dlclose,导致资源泄露** | **100%** | **关联条款**:cpp-secure 5.2(资源申请和释放必须匹配) **代码路径**:mc2/matmul_allto_all/op_graph/fusion_pass/matmul_all_to_all_transpose_a5_fusion_pass.cpp(diff行136-148) **问题类型**:资源泄露 - dlopen未配对dlclose **问题分析**: - RTLD_LAZY | RTLD_GLOBAL 标志会加载库并增加引用计数 - 函数返回后 handle 局部变量丢失,无法后续调用 dlclose - 如果库被多次加载(虽然 static func 缓存了结果,但每次检查都会执行 dlopen),会导致库无法被正常卸载 **修改建议**: **方案1:使用 RTLD_NOLOAD,仅查询不增加引用计数**(推荐) cpp // ✅ 正确:使用 RTLD_NOLOAD,不增加引用计数 EsTransposeFunc GetEsTransposeFunc() { void* handle = dlopen("libes_math.so", RTLD_NOLOAD | RTLD_LAZY); // 仅查询 if (!handle) { OPS_LOG_E("MatmulAllToAllTransposeA5FusionPass", "dlopen failed: %s", dlerror()); return nullptr; } dlerror(); auto func = reinterpret_cast<EsTransposeFunc>(dlsym(handle, "EsTranspose")); if (dlerror() != nullptr) { OPS_LOG_E("MatmulAllToAllTransposeA5FusionPass", "dlsym EsTranspose failed"); return nullptr; } return func; // RTLD_NOLOAD 不增加引用计数,无需 dlclose } --- ### MEDIUM-1:外部输入参数未判空(cpp-secure 4.1) **严重级别**:MEDIUM(中) **假设检验过程**: | 步骤 | 假设与证据 | 自信值 | |------|-----------|-------| | **H0** | args 参数正确校验 | 0% | | **证据1** | args 参数作为 aclrtExceptionInfo 指针,属于外部输入(来自异常回调) | +40% | | **证据2** | diff 第81行直接使用 args 参数调用函数,未显示判空检查 | +30% | | **证据3** | 虽然理论上异常回调不应传入 nullptr,但规范要求对外部输入必须校验 | +20% | | **H1** | **args 参数作为外部输入,建议添加判空检查** | **70%** | **关联条款**:cpp-secure 4.1(外部输入数据合法性校验) **代码路径**:mc2/common/utils/mc2_exception_dump.h(diff行81) **问题类型**:外部输入校验 - 参数未判空 **问题代码片段**: cpp // 行81(Mc2ExceptionImpl 函数) auto ret = aclrtGetArgsFromExceptionInfoFunc(args, &devArgsPtr, &devArgsLen); // args 未判空 **修改建议**: cpp // ✅ 正确:添加参数校验 inline void Mc2ExceptionImpl(aclrtExceptionInfo *args, void *userdata, const char *op) { // 添加外部输入校验 if (args == nullptr) { OP_LOGE(OP_NAME, "args is nullptr, invalid exception info"); return; } // Get addr of hccl context from ExceptionInfo void* devArgsPtr = nullptr; uint32_t devArgsLen = 0; ... } --- ### MEDIUM-2:LOG API 潜在空指针风险(cpp-secure 11.1) **严重级别**:MEDIUM(中) **假设检验过程**: | 步骤 | 假设与证据 | 自信值 | |------|-----------|-------| | **H0** | dlerror() 返回值作为 LOG 参数安全 | 0% | | **证据1** | dlerror() 函数在无错误时返回 nullptr | +40% | | **证据2** | 代码中直接将 dlerror() 作为 %s 参数传入 OP_LOGE(第34、37、55、60行) | +30% | | **证据3** | 虽然在错误分支调用理论上应返回错误字符串,但不同平台行为可能有差异 | +20% | | **H1** | **dlerror() 可能返回 nullptr,作为 %s 参数可能导致段错误** | **50%** | **结论**:自信值 **50%** < 60%,无法推翻原假设H0,但存在**需关注**风险点。 **关联条款**:cpp-secure 11.1(LOG API 禁止传入空指针作为字符串参数) **代码路径**:mc2/common/utils/mc2_exception_dump.h(diff行34、37、55、60) **问题类型**:LOG安全 - 潜在空指针风险 **问题代码片段**: cpp // 行34、37、55、60 OP_LOGE(OP_NAME, "dlsym aclrtGetArgsFromExceptionInfo failed: %s", dlerror()); // ❌ dlerror() 可能为 nullptr OP_LOGE(OP_NAME, "dlopen failed: %s", dlerror()); // ❌ dlerror() 可能为 nullptr **修改建议**: cpp // ✅ 正确:判空或使用安全格式 // 方案1:判空 const char* errMsg = dlerror(); OP_LOGE(OP_NAME, "dlopen failed: %s", errMsg ? errMsg : "unknown error"); // 方案2:使用安全格式 OP_LOGE(OP_NAME, "dlopen failed, error code: %p", dlerror()); // 打印指针地址 --- ## 3. 通过条款 以下条款经检视后确认代码符合规范: ### TOPK-13:禁止 thread_local 变量 - ✅ **通过**:代码中使用 static 变量,未使用 thread_local 关键字 ### TOPK-1:必须校验函数返回值 - ✅ **通过**:dlopen、dlsym、aclrtGetArgsFromExceptionInfo、acldumpGetPath 等关键函数均有返回值校验 ### cpp-secure 3.1:禁止使用未初始化的变量 - ✅ **通过**:所有 static 变量均显式初始化(func = nullptr、initialized = false) ### cpp-secure 11.3:LOG API 参数类型必须与格式化说明符匹配 - ✅ **通过**:%s 对应 dlerror() 返回值(char*),%d 对应 aclError 类型(整型),类型匹配 ### mc2_exception_dump.h 中的 RTLD_NOLOAD 使用 - ✅ **合理**:GetAclrtGetArgsFromExceptionInfoFunc() 和 GetAcldumpGetPathFunc() 使用 RTLD_NOLOAD | RTLD_LAZY,仅查询库是否已加载,不增加引用计数,无需 dlclose --- ## 4. 整体评价 ### 优点总结: 1. **架构设计合理**:使用动态加载机制解决版本兼容性问题,避免硬编码符号依赖 2. **函数指针管理规范**:使用 static 变量缓存函数指针,避免重复加载开销 3. **错误处理完善**:dlopen/dlsym 失败时记录日志,提供错误信息 4. **返回值校验完整**:关键函数调用均有返回值校验和错误处理 5. **RTLD_NOLOAD 使用正确**:mc2_exception_dump.h 中使用 RTLD_NOLOAD 避免增加引用计数 ### 需改进项总结: **必须修改(CRITICAL)**: 1. ✅ TransposeDL 函数添加 func 指针判空检查(防止空指针解引用崩溃) 2. ✅ GetEsTransposeFunc() 修改为 RTLD_NOLOAD 或添加 dlclose(防止资源泄露) **建议修改(MEDIUM)**: 1. ✅ Mc2ExceptionImpl 函数添加 args 参数判空检查(外部输入校验) 2. ✅ LOG 宏中的 dlerror() 返回值判空或使用安全格式(防止段错误) ### 综合评分: | 维度 | 评分 | 说明 | |------|------|------| | **安全编码** | 60/100 | 2个CRITICAL安全问题需立即修复 | | **API使用** | 75/100 | dlopen/dlsym 使用基本规范,但存在资源泄露风险 | | **性能优化** | 90/100 | static 缓存设计合理,避免重复加载 | | **代码规范** | 85/100 | 注释清晰,格式规范 | | **版本兼容性** | 95/100 | 动态加载机制解决符号依赖问题 | **总分**:**81/100** --- ## 5. 结论与建议 ### 检视结论: 该PR引入动态库加载机制(dlopen/dlsym)解决版本兼容性问题,架构设计合理。但存在**2个CRITICAL级别的安全风险**(空指针解引用、资源泄露),必须在合并前修复。 ### 修改要求: **必须修复(阻塞合并)**: 1. ✅ **TransposeDL 函数添加判空检查**(cpp-secure 3.5) - 添加 if (func == nullptr) 检查,防止空指针解引用崩溃 - 返回空对象或抛出异常作为错误处理 2. ✅ **GetEsTransposeFunc() 资源泄露修复**(cpp-secure 5.2) - **方案1(推荐)**:改用 RTLD_NOLOAD | RTLD_LAZY,仅查询不增加引用计数 - **方案2**:缓存 handle 并添加清理函数,确保引用计数匹配 **建议修复(推荐)**: 1. ✅ Mc2ExceptionImpl 函数添加 args 参数校验(cpp-secure 4.1) 2. ✅ LOG 宏中 dlerror() 返回值判空(cpp-secure 11.1) ### 建议操作: 1. **立即修复 CRITICAL 问题**:优先修复空指针解引用和资源泄露问题 2. **补充单元测试**:测试 dlopen/dlsym 失败场景,验证错误处理逻辑 3. **添加文档说明**:在 README 或代码注释中说明动态加载机制的使用场景和注意事项 4. **代码 Review**:邀请团队成员 Review 修复后的代码 5. **性能测试**:验证动态加载对性能的影响(虽然 static 缓存可避免重复加载) --- **报告生成时间**:2026-05-08 **检视人**:AI Code Reviewer (ascendc-ops-reviewer) **检视模式**:PR检视(C++安全检视) **规范版本**:cpp-secure.md、ascendc-topk.md **检视状态**:已完成,发现2个 See merge request: cann/ops-transformer!5077 | 1 个月前 | |
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 | 2 个月前 |