已关闭
【2026 HCCL通信库创新大赛-东北赛区】【易烟】 [Bug-Report|缺陷反馈]: 算法取反分支遗漏 Send/Recv 的 count 保留规则 #742
易烟创建于  9月18日关闭于  25 天前
易烟
易烟
9月18日 创建

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 / 必填)

  1. 构造 CostModel,包含 AicpuSendSoleMesh、AicpuRecvSoleMesh、AicpuBatchSendRecvSoleMesh,count 均为 1;加入 AicpuAllReduceSoleMesh 和 AicpuAllReduceSequenceMeshNHR 作对照。
  2. HcclAlgoParser::Parser("not(sole{})") 成功后调用 UpdateCostModelWithAlgo(parser, model, {"Aicpu", "Aiv", "Dpu"})。
  3. 原版会把上述 Send/Recv/BatchSendRecv 的 count 置零。改用 not(sole{mesh}) 也会出现同样结果。
  4. PR 的 UpdateCostModelSendRecvTest 同时覆盖上述两个入口、显式 opType 取反、count=2 保持以及已关闭项 count=0 不重新启用。

在已配置仓库 UT 依赖的环境中使用现有 alg_parse_test 目标运行:

./alg_parse_test --gtest_filter=UpdateCostModelSendRecvTest.*
./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 算法仍置零,未匹配的其他执行器算法保持。

[==========] 31 tests from 3 test suites ran.
[  PASSED  ] 28 tests.
[  FAILED  ] UpdateCostModelSendRecvTest.NegatedExecutorPrefixPreservesSendRecv
[  FAILED  ] UpdateCostModelSendRecvTest.NegatedExecutorExactMatchPreservesSendRecv
[  FAILED  ] UpdateCostModelSendRecvTest.ScopedNegationPreservesSendRecv
3 FAILED TESTS

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。

请社区确认问题并安排责任人,未自行认领。采纳、问题档位及积分以社区回复为准。

likedislike
易烟易烟
9月18日 关联了pull request:【2026 HCCL通信库创新大赛-东北赛区】【易烟】 [fix] 在算法取反匹配中保留 Send/Recv 候选
LLeewis成员
9月18日 关联了看板:HCCL
Leewis成员
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总结,将同步责任田进行二次确认

likedislike
LLeewis成员
9月18日 将 xiaocui235 设为负责人
Leewis成员
9月20日 评论:

同学你好,当前所提问题将由对应开发组同事进行处理,对应积分将正常计算;

likedislike
LLeewis成员
9月20日 添加了label:Scored
LLeewis成员
29 天前 issue类型由 任务 改变为 缺陷
Cclause
29 天前 关联了pull request:fix HCCL_ALGO parse bug
LLeewis成员
25 天前 issue状态由 待办的 改变为 已完成
LLeewis成员
25 天前 关闭了 issue
Leewis成员
25 天前 评论:

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

likedislike
LLeewis成员
14 天前 移除了看板:HCCL