文件最后提交记录最后更新时间
优化多线程访问下化context可能存在竞争导致的数据错误问题 Co-authored-by: zzg_code<zengzhiguo1@huawei.com> # message auto-generated for no-merge-commit merge: !5851 merge updatacontext into master 优化多线程访问下化context可能存在竞争导致的数据错误问题 Created-by: zzg_code Commit-by: zzg_code Merged-by: cann-robot Description: ## 描述 cm2 context在设计之初只考虑了dispatch 和combine算子,因此在代码中定义了静态对象,但是目前随着发展context需要被多个的mc2算子引用,这种情况下静态成员可能导致在多线程情况下的数据竞争问题,因此修改设计逻辑 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2648 ## 测试 # MC2 Context 代码检视报告 **检视日期**: 2026-05-25 **检视文件**: 5851.diff **变更模块**: mc2/common/op_api, mc2/moe_distribute_* --- ## 1. 总体概述 本次代码变更主要涉及 MC2 通信上下文管理模块的重构,核心变更包括: 1. **架构调整**:移除单例模式,改为每次调用时创建实例(解决多线程数据冲突问题) 2. **缓存机制重构**:将"获取或创建"合并逻辑拆分为"检查缓存"和"创建"两步 3. **接口调整**:修改方法签名和参数顺序 4. **日志优化**:提升关键日志级别从 DEBUG 到 INFO,修正格式化字符串类型 5. **版本兼容性调整**:降低 HCCL_CHANNEL_SUPPORT_VERSION 版本号 变更范围涉及 3 个文件,约 100+ 行代码修改。 --- ## 2. 代码变更清单 | 文件 | 变更类型 | 变更内容 | |------|---------|---------| | mc2_context.h | 接口修改 | 删除 GetInstance() 静态方法声明;修改 CreatMc2Context 参数顺序;删除 GetOrCreateMc2Context;新增 CheckContextCache;修改版本宏定义 | | mc2_context.cpp | 实现修改 | 删除单例实现;重构 GetMc2ContextTensor 逻辑;日志级别提升;格式化字符串修复;缓存检查逻辑拆分 | | moe_distribute_combine_v2_base.cpp | 调用方修改 | 修改 opName 从 "moe_distribute_dispatch_combine_v2""moe_distribute_v2" | | moe_distribute_dispatch_v2_base.cpp | 调用方修改 | 修改 opName 从 "moe_distribute_dispatch_combine_v2""moe_distribute_v2" | --- ## 3. 检视问题列表 ### 🔴 严重问题 无 ### 🟡 中等问题 #### P1-1: 方法签名参数顺序调整可能破坏调用方 **问题描述**: CreatMc2Context 方法的参数顺序从 (hcclHandle, mc2ContextTag, engine, protocol, ctx, mc2ContextStruct) 改为 (hcclHandle, mc2ContextTag, engine, protocol, mc2ContextStruct, ctx, hcclBuffSize),参数顺序和位置调整可能影响代码可读性和调用方兼容性。 **代码位置**: ```cpp // mc2_context.h:58-59 - aclnnStatus CreatMc2Context(const HcclComm &hcclHandle, const std::string &mc2ContextTag, - const CommEngine &engine, const CommProtocol &protocol, void *&ctx, Mc2MoeContext *mc2ContextStruct); + aclnnStatus CreatMc2Context(const HcclComm &hcclHandle, const std::string &mc2ContextTag, + const CommEngine &engine, const CommProtocol &protocol, + Mc2MoeContext *mc2ContextStruct, void *&ctx, uint64_t &hcclBuffSize); ``` **修改建议**: 1. 参数顺序应遵循:输入参数 -> 输入输出参数 -> 输出参数 2. 当前调整后 mc2ContextStruct(输入)在前,ctx(输出)在后,符合规范 ✅ 3. 建议在函数注释中明确标注每个参数的方向 **状态**: 已符合规范,无需修改 --- #### P1-2: 版本号降低可能导致不兼容 **问题描述**: HCCL_CHANNEL_SUPPORT_VERSION90000000 降低到 89999700,可能导致在版本号在 [89999700, 90000000) 范围内的环境上,功能从"不启用"变为"启用",引入不稳定风险。 **代码位置**: ```cpp // mc2_context.h:21 - #define HCCL_CHANNEL_SUPPORT_VERSION 90000000 + #define HCCL_CHANNEL_SUPPORT_VERSION 89999700 ``` **修改建议**: 1. 确认降低版本号的原因(是否为了兼容旧版本 HCCL?) 2. 在代码注释中说明版本号的含义和选择依据 3. 建议在 CHANGELOG 中记录此兼容性变更 **状态**: 待确认版本兼容范围 --- #### P1-3: 日志级别提升可能影响生产环境性能 **问题描述**: 多处日志从 OP_LOGD(DEBUG)提升到 OP_LOGI(INFO),在高频调用场景下可能导致生产环境日志量激增。 **代码位置**: ```cpp // mc2_context.cpp 多处,示例: - OP_LOGD("Start to get HCCL communication handle, groupEp: %s", groupEp); + OP_LOGI("Start to get HCCL communication handle, groupEp: %s", groupEp); ``` **修改建议**: 1. 评估这些日志的打印频率(每秒多少次) 2. 高频日志建议保持 DEBUG 级别 3. 或添加调用频率限制机制(如每 N 次打印一次) **状态**: 需评估高频场景影响 --- #### P1-4: 错误处理路径可优化 **问题描述**: CheckContextCache 方法中,当缓存查找失败(hcclRet != HCCL_SUCCESS)时,仅设置 hcclBuffSize = 0 并返回成功,但未清理可能的残留状态。 **代码位置**: ```cpp // mc2_context.cpp:481-484 if (hcclRet != HCCL_SUCCESS) { // 没找到缓存,创建context hcclBuffSize = 0; OP_LOGI("Context cache not found, need to create"); return ACLNN_SUCCESS; } ``` **修改建议**: 1. 确认 ctx 参数在此场景下是否需要显式设置为 nullptr 2. 添加注释说明"缓存不存在是正常流程,非错误情况" **状态**: 建议优化 --- ### 🔵 建议优化 #### P2-1: 重复代码可抽取 **问题描述**: moe_distribute_combine_v2_base.cppmoe_distribute_dispatch_v2_base.cpp 中的 opName 定义完全相同,可抽取为公共常量。 **代码位置**: ```cpp // 两个文件中相同代码 const char *opName = "moe_distribute_v2"; ``` **修改建议**: ```cpp // 建议在头文件中定义 namespace Mc2Aclnn { constexpr const char* MOE_DISTRIBUTE_V2_OP_NAME = "moe_distribute_v2"; } ``` --- #### P2-2: 注释风格不一致 **问题描述**: 新增注释使用中文,但其他代码注释为英文或无注释,风格不统一。 **代码位置**: ```cpp // mc2_context.cpp:481 if (hcclRet != HCCL_SUCCESS) { // 没找到缓存,创建context ``` **修改建议**: 统一使用英文注释: ```cpp if (hcclRet != HCCL_SUCCESS) { // Cache not found, need to create context ``` --- #### P2-3: 魔法数字需注释 **问题描述**: hcclBuffSize = 0; 作为特殊状态标记,建议使用常量或添加注释。 **代码位置**: ```cpp // mc2_context.cpp:497 hcclBuffSize = 0; // 先默认为0,后续根据缓存情况赋值 ``` **修改建议**: ```cpp constexpr uint64_t HCCL_BUFF_SIZE_NOT_INITIALIZED = 0; hcclBuffSize = HCCL_BUFF_SIZE_NOT_INITIALIZED; ``` --- ## 4. 优点总结 ✅ **日志格式修复**:将 %d 改为 %u 匹配 uint32_t 类型,避免未定义行为 ✅ **代码职责分离**:将 GetOrCreateMc2Context 拆分为 CheckContextCacheCreatMc2Context,职责更清晰 ✅ **输出参数规范化**:CreatMc2ContexthcclBuffSize 从成员变量改为输出参数,减少隐式状态依赖 ✅ **缓存流程优化**:明确区分"命中缓存"和"需要创建"两种路径,便于问题定位 ✅ **日志可观测性提升**:关键路径日志提升到 INFO 级别,便于生产环境监控 ✅ **多线程安全**:移除单例模式,改为临时变量,解决多线程数据冲突问题 --- ## 5. 风险评估 | 风险项 | 风险等级 | 影响范围 | 状态 | |--------|---------|---------|------| | 单例移除导致状态丢失 | ~~🔴 高~~ | 功能正确性 | ✅ 已澄清 - 多线程安全设计 | | 缓存键名变更导致不兼容 | ~~🔴 高~~ | 生产环境缓存 | ✅ 已澄清 - 首次创建无兼容问题 | | 版本号降低导致功能变更 | 🟡 中 | 版本兼容性 | 待确认版本依赖范围 | | 日志级别提升影响性能 | 🟡 中 | 生产环境性能 | 需评估日志频率 | | 方法签名变更影响调用方 | 🟢 低 | 编译兼容性 | ✅ 已同步修改所有调用方 | --- ## 6. 代码质量评分 **总分**: 85/100 | 维度 | 得分 | 说明 | |------|------|------| | 架构设计 | 90 | 单例移除解决多线程问题,职责分离清晰 | | 代码规范 | 85 | 格式化字符串修复正确,注释风格可统一 | | 错误处理 | 80 | CheckContextCache 路径可优化 | | 可维护性 | 85 | 重复代码可抽取,魔法数字可常量化 | | 安全性 | 90 | 多线程安全,无明显安全风险 | --- ## 7. 建议与总结 ### 必须处理 无严重问题需处理 ### 建议处理 1. 统一注释风格(中文→英文) 2. 评估 INFO 日志在高频场景的性能影响 3. 确认版本号降低的兼容性范围 ### 可选优化 1. 抽取重复的 opName 为公共常量 2. 使用常量替代魔法数字 0 --- **检视结论**: 代码变更整体质量良好,架构设计合理(多线程安全优化),可合并。建议处理中等问题后合入主分支。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!58515 天前
fix asan bug report in gen task Co-authored-by: liusixia<liusixia@h-partners.com> # message auto-generated for no-merge-commit merge: !5550 merge master into master fix asan bug report in gen task Created-by: liusixia_gitcode Commit-by: liusixia Merged-by: cann-robot Description: ## 描述 修复asan报告的临时对象导致args_format_str变为悬空指针问题。临时对象在分号处析构后,string被delete,后面调用args_format_str读到的是已释放内存。 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2527 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!555014 天前
fix: 修复 cleancode 告警 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !5954 merge fix/cleancode-master into master fix: 修复 cleancode 告警 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 修复基础算子主线cleancode问题。 ## 关联的Issue [Bug-Report|缺陷反馈]: MC2基础算子主线存在cleancode问题 #2676 ## 测试 二级冒烟。 ## 文档更新 不涉及。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR #5489 代码检视报告 **PR**: https://gitcode.com/cann/ops-transformer/pull/5489 **标题**: merge 'fix-cleancode-issues' into 'master' **作者**: libohao6 | **范围**: 19 files, +453 -531 | **日期**: 2026-05-21 --- ## 改动分类 | 类型 | 改动数 | 说明 | |------|-------|------| | 删除未使用函数 | 5个 | matmul_util.cpp删3个static函数 + aclnn_matmul_reduce_scatter_v2.cpp删CreateWinTensor | | 删除冗余变量 | 2个 | x1Dtype/biasDtype 在 aclnn_weight_quant_matmul_all_reduce.cpp | | const修饰添加 | 5处 | 多个Tiling函数context参数加const | | 位操作类型修复 | 1处 | int32_t code → uint32_t bitCode | | 魔法数字→常量 | 1处 | alignas(8) → alignas(L2_CACHE_ALIGNMENT) | | 变量重命名 | 多处 | Kernel侧blockLocCoord→blockLocCoord_等; Host侧index→idx/i | | 参数名拼写修正 | 1处 | rcfCfg→rcsCfg | | include guard | 1处 | matmul_reduce_scatter_v2_tiling_common.h | | 头文件清理 | 3处 | 移除冗余#include | | 未使用参数标记 | 5处 | (void)opType等 | | 注释风格更新 | 大量 | 决策树层级注释从======改为差异化标记 | | 代码格式修复 | 多处 | 空格/缩进/换行 | --- ## 假设检验检视结果 ### 1. 删除未使用函数 ✅ PASS **涉及文件**: matmul_util.cpp, aclnn_matmul_reduce_scatter_v2.cpp 删除5个static函数(CheckShapeValidWithTrans、ProcessEmptyTensor、ProcessEmptyTensorWithTrans、GetMatmulOpInfoWithTrans、CreateWinTensor)。均为static,无跨文件引用风险。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 5.2 资源泄露防护 | 删除是否遗漏调用点 | ✅ static函数仅文件内可见 | ### 2. const修饰添加 ✅ PASS **涉及文件**: all_gather_matmul_tiling_base.cpp/.h, quant_all_reduce_tiling.cpp, quant_reduce_scatter_tiling.cpp gert::TilingContext *contextconst gert::TilingContext *context。GetNodeName()、GetAttrPointer()等方法为const兼容,头文件声明同步更新。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 1.1 静态类型安全 | const修饰是否导致编译错误 | ✅ 方法兼容const | ### 3. 位操作类型修复 ✅ PASS **涉及文件**: matmul_reduce_scatter_v2_aiv_mode_tiling.cpp int32_t codeuint32_t bitCode。对有符号数做右移(>>=)存在符号扩展问题,改为uint32_t消除风险。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 2.1 有符号整数不溢出 | int32_t右移符号扩展 | ✅ 修复正确 | | cpp-secure 2.2 无符号整数不回绕 | uint32_t位操作安全 | ✅ | ### 4. 魔法数字→常量 ✅ PASS **涉及文件**: unquant_matmul_all_reduce_tiling_data.h static constexpr size_t L2_CACHE_ALIGNMENT = 8; 替换 alignas(8)。值等价,不影响ABI。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 10.4 结构体字段末尾添加 | 常量定义位置 | ✅ 不影响ABI | ### 5. 冗余变量删除 ✅ PASS **涉及文件**: aclnn_weight_quant_matmul_all_reduce.cpp 删除 const auto x1Dtype = x1->GetDataType(); const auto biasDtype = bias->GetDataType();。两变量后续无引用,OP_CHECK_DTYPE_NOT_SAME宏自行获取dtype。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 3.1 禁止未初始化变量 | 删除后功能等价 | ✅ | ### 6. 参数名拼写修正 ✅ PASS **涉及文件**: matmul_reduce_scatter_tiling_base.cpp rcfCfgrcsCfg(RCS=ReduceScatter拼写修正)。所有引用已同步替换。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | MC2 MC2-13 CCU通信数据量限制 | AdjustHCCLLimit逻辑是否保留 | ✅ 256MB限制保留 | ### 7. include guard添加 ✅ PASS **涉及文件**: matmul_reduce_scatter_v2_tiling_common.h 新增 #ifndef MATMUL_REDUCE_SCATTER_V2_TILING_COMMON_H 保护。命名与文件路径一致。 ### 8. 未使用参数标记 ✅ PASS **涉及文件**: quant_reduce_scatter_util_tiling.cpp 添加 (void)opType; (void)context; (void)xDimNum; (void)outputDim; 消除编译器警告。注释声明"Reserved for future extension"。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | TOPK TOPK-7 外部输入校验 | 校验逻辑是否削弱 | ✅ 未削弱 | ### 9. LOG参数安全 ✅ PASS **涉及文件**: allto_allv_quant_grouped_mat_mul_tiling_base.cpp 循环变量 indexidx/isendCounts[%lu] should be in [0, %lu], but get %lu — 3个%lu对应3个uint64_t(idx, bsk_, sendCounts[idx]),类型和数量匹配。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 11.2 参数数量与占位符匹配 | 3个%lu=3个uint64_t | ✅ | | cpp-secure 11.3 参数类型与格式化说明符匹配 | uint64_t用%lu | ✅ | | MC2 MC2-07 专家参数合法性校验 | sendCounts/recvCounts校验完整 | ✅ | ### 10. 头文件清理 ✅ PASS **涉及文件**: matmul_reduce_scatter_tiling_base.h, quant_reduce_scatter_util_tiling.h, all_gather_matmul_tiling_base.h 移除冗余 #include "ops_utils.h"#include "mc2_log.h"。 --- ## 规范条款引用汇总 | 规范来源 | 条款编号 | 条款名称 | 检查结果 | |---------|---------|---------|---------| | cpp-secure.md | 1.1 | 保证静态类型安全 | ✅ | | cpp-secure.md | 2.1 | 有符号整数运算不溢出 | ✅ | | cpp-secure.md | 2.2 | 无符号整数运算不回绕 | ✅ | | cpp-secure.md | 3.1 | 禁止使用未初始化的变量 | ✅ | | cpp-secure.md | 5.2 | 资源泄露防护 | ✅ | | cpp-secure.md | 10.4 | 结构体字段末尾添加 | ✅ | | cpp-secure.md | 11.2 | LOG参数数量与占位符必须匹配 | ✅ | | cpp-secure.md | 11.3 | LOG参数类型与格式化说明符必须匹配 | ✅ | | mc2-specific.md | MC2-07 | 专家参数合法性校验 | ✅ | | mc2-specific.md | MC2-13 | CCU通信数据量限制 | ✅ | | ascendc-topk.md | TOPK-1 | 必须校验函数返回值 | ✅ | | ascendc-topk.md | TOPK-7 | 融合规则/InferShape/Tiling外部输入校验 | ✅ | --- ## 总体结论 **✅ 无问题** — PR #5489 为代码清理类改动,所有10项检视均PASS。改动不引入安全风险,不削弱校验逻辑,规范合规性100%。 See merge request: cann/ops-transformer!59543 天前
Add 8k stride for win addr offset Co-authored-by: tgwsakiko_<linwei69@huawei.com> # message auto-generated for no-merge-commit merge: !5666 merge 512-pd into master Add 8k stride for win addr offset Created-by: tgwsakiko_ Commit-by: tgwsakiko_ Merged-by: cann-robot Description: ## 描述 This PR introduces a rank-strided addressing scheme with EP_RANK_OFFSET_STEP = 8192, applying an epRankId * 8 KB offset to CCL buffer base-address derivation in both context setup and kernel helpers, and synchronizing tiling-side capacity checks to reserve epWorldSize * 8 KB of offset space. The change eliminates cross-rank same-address aliasing in status updates and improves performance on Ascend 950. ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [x] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!56667 天前
fix: 修复 cleancode 告警 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !5954 merge fix/cleancode-master into master fix: 修复 cleancode 告警 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 修复基础算子主线cleancode问题。 ## 关联的Issue [Bug-Report|缺陷反馈]: MC2基础算子主线存在cleancode问题 #2676 ## 测试 二级冒烟。 ## 文档更新 不涉及。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR #5489 代码检视报告 **PR**: https://gitcode.com/cann/ops-transformer/pull/5489 **标题**: merge 'fix-cleancode-issues' into 'master' **作者**: libohao6 | **范围**: 19 files, +453 -531 | **日期**: 2026-05-21 --- ## 改动分类 | 类型 | 改动数 | 说明 | |------|-------|------| | 删除未使用函数 | 5个 | matmul_util.cpp删3个static函数 + aclnn_matmul_reduce_scatter_v2.cpp删CreateWinTensor | | 删除冗余变量 | 2个 | x1Dtype/biasDtype 在 aclnn_weight_quant_matmul_all_reduce.cpp | | const修饰添加 | 5处 | 多个Tiling函数context参数加const | | 位操作类型修复 | 1处 | int32_t code → uint32_t bitCode | | 魔法数字→常量 | 1处 | alignas(8) → alignas(L2_CACHE_ALIGNMENT) | | 变量重命名 | 多处 | Kernel侧blockLocCoord→blockLocCoord_等; Host侧index→idx/i | | 参数名拼写修正 | 1处 | rcfCfg→rcsCfg | | include guard | 1处 | matmul_reduce_scatter_v2_tiling_common.h | | 头文件清理 | 3处 | 移除冗余#include | | 未使用参数标记 | 5处 | (void)opType等 | | 注释风格更新 | 大量 | 决策树层级注释从======改为差异化标记 | | 代码格式修复 | 多处 | 空格/缩进/换行 | --- ## 假设检验检视结果 ### 1. 删除未使用函数 ✅ PASS **涉及文件**: matmul_util.cpp, aclnn_matmul_reduce_scatter_v2.cpp 删除5个static函数(CheckShapeValidWithTrans、ProcessEmptyTensor、ProcessEmptyTensorWithTrans、GetMatmulOpInfoWithTrans、CreateWinTensor)。均为static,无跨文件引用风险。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 5.2 资源泄露防护 | 删除是否遗漏调用点 | ✅ static函数仅文件内可见 | ### 2. const修饰添加 ✅ PASS **涉及文件**: all_gather_matmul_tiling_base.cpp/.h, quant_all_reduce_tiling.cpp, quant_reduce_scatter_tiling.cpp gert::TilingContext *contextconst gert::TilingContext *context。GetNodeName()、GetAttrPointer()等方法为const兼容,头文件声明同步更新。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 1.1 静态类型安全 | const修饰是否导致编译错误 | ✅ 方法兼容const | ### 3. 位操作类型修复 ✅ PASS **涉及文件**: matmul_reduce_scatter_v2_aiv_mode_tiling.cpp int32_t codeuint32_t bitCode。对有符号数做右移(>>=)存在符号扩展问题,改为uint32_t消除风险。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 2.1 有符号整数不溢出 | int32_t右移符号扩展 | ✅ 修复正确 | | cpp-secure 2.2 无符号整数不回绕 | uint32_t位操作安全 | ✅ | ### 4. 魔法数字→常量 ✅ PASS **涉及文件**: unquant_matmul_all_reduce_tiling_data.h static constexpr size_t L2_CACHE_ALIGNMENT = 8; 替换 alignas(8)。值等价,不影响ABI。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 10.4 结构体字段末尾添加 | 常量定义位置 | ✅ 不影响ABI | ### 5. 冗余变量删除 ✅ PASS **涉及文件**: aclnn_weight_quant_matmul_all_reduce.cpp 删除 const auto x1Dtype = x1->GetDataType(); const auto biasDtype = bias->GetDataType();。两变量后续无引用,OP_CHECK_DTYPE_NOT_SAME宏自行获取dtype。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 3.1 禁止未初始化变量 | 删除后功能等价 | ✅ | ### 6. 参数名拼写修正 ✅ PASS **涉及文件**: matmul_reduce_scatter_tiling_base.cpp rcfCfgrcsCfg(RCS=ReduceScatter拼写修正)。所有引用已同步替换。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | MC2 MC2-13 CCU通信数据量限制 | AdjustHCCLLimit逻辑是否保留 | ✅ 256MB限制保留 | ### 7. include guard添加 ✅ PASS **涉及文件**: matmul_reduce_scatter_v2_tiling_common.h 新增 #ifndef MATMUL_REDUCE_SCATTER_V2_TILING_COMMON_H 保护。命名与文件路径一致。 ### 8. 未使用参数标记 ✅ PASS **涉及文件**: quant_reduce_scatter_util_tiling.cpp 添加 (void)opType; (void)context; (void)xDimNum; (void)outputDim; 消除编译器警告。注释声明"Reserved for future extension"。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | TOPK TOPK-7 外部输入校验 | 校验逻辑是否削弱 | ✅ 未削弱 | ### 9. LOG参数安全 ✅ PASS **涉及文件**: allto_allv_quant_grouped_mat_mul_tiling_base.cpp 循环变量 indexidx/isendCounts[%lu] should be in [0, %lu], but get %lu — 3个%lu对应3个uint64_t(idx, bsk_, sendCounts[idx]),类型和数量匹配。 | 规范条款 | 检查项 | 结果 | |---------|--------|------| | cpp-secure 11.2 参数数量与占位符匹配 | 3个%lu=3个uint64_t | ✅ | | cpp-secure 11.3 参数类型与格式化说明符匹配 | uint64_t用%lu | ✅ | | MC2 MC2-07 专家参数合法性校验 | sendCounts/recvCounts校验完整 | ✅ | ### 10. 头文件清理 ✅ PASS **涉及文件**: matmul_reduce_scatter_tiling_base.h, quant_reduce_scatter_util_tiling.h, all_gather_matmul_tiling_base.h 移除冗余 #include "ops_utils.h"#include "mc2_log.h"。 --- ## 规范条款引用汇总 | 规范来源 | 条款编号 | 条款名称 | 检查结果 | |---------|---------|---------|---------| | cpp-secure.md | 1.1 | 保证静态类型安全 | ✅ | | cpp-secure.md | 2.1 | 有符号整数运算不溢出 | ✅ | | cpp-secure.md | 2.2 | 无符号整数运算不回绕 | ✅ | | cpp-secure.md | 3.1 | 禁止使用未初始化的变量 | ✅ | | cpp-secure.md | 5.2 | 资源泄露防护 | ✅ | | cpp-secure.md | 10.4 | 结构体字段末尾添加 | ✅ | | cpp-secure.md | 11.2 | LOG参数数量与占位符必须匹配 | ✅ | | cpp-secure.md | 11.3 | LOG参数类型与格式化说明符必须匹配 | ✅ | | mc2-specific.md | MC2-07 | 专家参数合法性校验 | ✅ | | mc2-specific.md | MC2-13 | CCU通信数据量限制 | ✅ | | ascendc-topk.md | TOPK-1 | 必须校验函数返回值 | ✅ | | ascendc-topk.md | TOPK-7 | 融合规则/InferShape/Tiling外部输入校验 | ✅ | --- ## 总体结论 **✅ 无问题** — PR #5489 为代码清理类改动,所有10项检视均PASS。改动不引入安全风险,不削弱校验逻辑,规范合规性100%。 See merge request: cann/ops-transformer!59543 天前
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!36651 个月前