已关闭
【2026 HCCL通信库创新大赛-东北赛区】【易烟】 [Bug-Report|缺陷反馈]: 算法取反分支遗漏 Send/Recv 的 count 保留规则 #742
易烟创建于 9月18日关闭于 25 天前
9月18日 关联了pull request:【2026 HCCL通信库创新大赛-东北赛区】【易烟】 [fix] 在算法取反匹配中保留 Send/Recv 候选
Leewis
9月18日 评论:
9月18日 评论:
代码验证确认
经对照源码核实,问题确认有效。这是算法选择逻辑缺陷。
验证结果:
| 位置 | 代码行 | 确认 |
|---|---|---|
src/common/alg_parse.cc:552 |
注释明确写道"规则 4.6:send/recv 算法名不参与 count=0 的排除逻辑" | ✅ |
alg_parse.cc:594-596 |
执行器取反分支(algoList.empty() + isExecNegated):count = 0 — 未检查 ContainsSendRecv |
✅ |
alg_parse.cc:607-609 |
执行器取反分支(algoList 非空 + isExecNegated):同样未检查 ContainsSendRecv |
✅ |
alg_parse.cc:634 |
ProcessMatchedResults 排除逻辑正确检查 ContainsSendRecv |
✅ |
alg_parse.cc:663-664 |
ExcludeAlgosNotInEngines 也正确检查 ContainsSendRecv |
✅ |
分析: 同文件已实现 ContainsSendRecv 函数,且两处正确使用(ProcessMatchedResults 和 ExcludeAlgosNotInEngines),但两处 isExecNegated 分支遗漏了该检查。not(sole{}) 和 not(sole{mesh}) 会错误地将 AicpuSendSoleMesh、AicpuRecvSoleMesh、AicpuBatchSendRecvSoleMesh 等候选的 count 置零。修复方案为在两处取反分支复用 ContainsSendRecv。
严重程度: 高(算法选择逻辑缺陷,影响 Send/Recv 算法候选筛选)
本回复为AI总结,将同步责任田进行二次确认


Leewis
25 天前 评论:
25 天前 评论:
修复 HCCL_ALGO 解析中 Send & Recv 算子处理逻辑不一致的问题:在取反(negative)场景下,此前会无条件地将相关 costAlgoParams 的 count 置零,与其它算子的处理逻辑不一致。改动在 src/common/alg_parse.cc 的 CollectMatchedNamesForOpType 中引入 ContainsSendRecv 判断,使 Send/Recv 类算法名不参与 count=0 的排除逻辑。


Issue类别:问题修复
参赛团队:易烟
所属赛区:东北赛区
报名绑定账号:w346868
Describe the current behavior / 问题描述 (Mandatory / 必填)
src/common/alg_parse.cc::CollectMatchedNamesForOpType的执行器取反分支直接将匹配算法的 count 置零,遗漏了同文件已经实现的 Send/Recv 例外规则。全局not(sole{})和not(sole{mesh})都会将已有的 AicpuSendSoleMesh、AicpuRecvSoleMesh、AicpuBatchSendRecvSoleMesh 等候选置零。同文件 ContainsSendRecv 上方明确注释“规则 4.6:send/recv 算法名不参与 count=0 的排除逻辑”,引擎过滤及正向匹配后的排除分支均遵守此规则;两处 isExecNegated 分支却没有检查。上述名称对应仓库已注册的 Send/Recv/BatchSendRecv 算法,不是为测试虚构的名称。selector_engine.cc 的 FilterCmByHcclAlgo 会调用该更新逻辑,因此错误 count 会进入算法选择候选模型。本次只复现并修复模型过滤结果,未声称复现 NPU 上的通信失败;规则解释和采纳请社区确认。
Environment / 环境信息 (Mandatory / 必填)
Linux x86_64;GCC;C++14;GoogleTest 1.14.0。局部测试编译真实 src/common/alg_parse.cc,沿用仓内 alg_parse/stub;本地缺完整 CANN 构建环境,使用 HCOMM 仓现有 include 与 test/stub/depends 头文件作为测试依赖,没有改动产品构建依赖。
master 基线:
31054b7189b830e613b1f8d7097fa026d74cbf00。Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
在已配置仓库 UT 依赖的环境中使用现有 alg_parse_test 目标运行:
本地编译方式(从 HCCL 仓根目录;变量分别指向 HCOMM 仓和 googletest 源码的 googletest 子目录):
g++ -std=c++14 -pthread \ -Itest/ut/common/alg_parse/stub -Isrc/common \ -I"$HCOMM_ROOT/include" -I"$HCOMM_ROOT/include/hccl" \ -I"$HCOMM_ROOT/test/stub/depends/include" -I"$HCOMM_ROOT/test/stub/depends/pkg_inc" \ -I"$GTEST_ROOT/include" -I"$GTEST_ROOT" \ src/common/alg_parse.cc test/ut/common/alg_parse/*.cc \ "$GTEST_ROOT/src/gtest-all.cc" -o /tmp/alg_parse_test /tmp/alg_parse_test这是局部主机回归,不等同于完整 CANN UT/ST 或上板运行。
Describe the expected behavior / 预期结果 (Mandatory / 必填)
遵循现有规则 4.6,Send/Recv/BatchSendRecv 候选保留原 count;匹配的非 Send/Recv 算法仍置零,未匹配的其他执行器算法保持。
Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
Special notes for this issue / 备注 (Optional / 选填)
修复方案:在执行器取反的前缀匹配和精确匹配两处复用 ContainsSendRecv,保持 Send/Recv/BatchSendRecv 原有 count,既不置零也不重新启用已关闭项。其他集合通信算法仍按原配置排除。补充 3 个 GTest 回归方法,沿用现有 alg_parse_test 目标。
查重范围:API 返回 695 条 Issue、3233 条 PR 的标题和正文。检索 ContainsSendRecv、not(sole、规则 4.6、Send/Recv 取非/取反过滤,未发现相同缺陷报告或修复。未声称逐一检视所有历史 diff。
请社区确认问题并安排责任人,未自行认领。采纳、问题档位及积分以社区回复为准。