已关闭
fix(hcomm): 独立更新 SIMT 队列计数器的两个 32 位字段 #231
fix(hcomm): 独立更新 SIMT 队列计数器的两个 32 位字段 #231
已关闭
little_apple_12创建于 9月26日关闭于 3 天前
9月26日

描述

src/aicore/hcomm/common/hcomm_simt_utils.h 原先将低 32 位 SQ head 与高 32 位 CQE 计数打包后整体相加。SQ head 回卷时产生的低位进位会误增 CQE 计数。本 PR 在 32 位宽度内分别更新 HcommSimtHeadIdx(headVal)+bbCnt 和 HcommSimtWqeCnt(headVal)+cqeCnt,再重新打包;只改动该 helper 的一处 hunk,不改变接口或源码注释定义的计数语义。

与 issue #8/PR #133 的区别:已合入修复处理 cqe=0 WQE 被计为一个 CQE;本 PR 处理的是计数值正确时低 32 位回卷仍向高位进位,两者根因不同。

关联的Issue

关联Issue #45

测试

在仓库根目录执行以下源码断言和 host 计数器边界核对:

python3 - <<'PY'
from pathlib import Path
s = Path('src/aicore/hcomm/common/hcomm_simt_utils.h').read_text()
assert 'uint32_t nextHeadIdx = HcommSimtHeadIdx(headVal) + bbCnt;' in s
assert 'uint32_t nextWqeCnt = HcommSimtWqeCnt(headVal) + cqeCnt;' in s
assert '*headAddr = (static_cast<uint64_t>(nextWqeCnt) << 32U) | static_cast<uint64_t>(nextHeadIdx);' in s
assert '*headAddr = headVal + delta;' not in s
mask = (1 << 32) - 1
head = (41 << 32) | mask
for cqe_cnt, expected_cqe in ((1, 42), (0, 41)):
    next_bb = ((head & mask) + 1) & mask
    next_cqe = ((head >> 32) + cqe_cnt) & mask
    print(f'wrap cqeCnt={cqe_cnt}: cqeCnt={next_cqe}, bbHead=0x{next_bb:08x}')
    assert next_cqe == expected_cqe and next_bb == 0
print('production source assertions: PASS')
PY

真实输出:

wrap cqeCnt=1: cqeCnt=42, bbHead=0x00000000
wrap cqeCnt=0: cqeCnt=41, bbHead=0x00000000
production source assertions: PASS

使用 GCC 12.3.1 编译并运行保存于 case 验证记录中的 C++17 host 边界模型:

g++ -std=c++17 -Wall -Wextra -Werror cases/asc-comm-2026-09-26-002/verify/counter-probe-after-fix.cpp -o /tmp/asc-comm-simt-counter-probe-after-fix && /tmp/asc-comm-simt-counter-probe-after-fix

真实输出:

wrap cqeCnt=1: cqeCnt=42, bbHead=0x00000000
wrap cqeCnt=0: cqeCnt=41, bbHead=0x00000000
no wrap: cqeCnt=42, bbHead=9
PASS

模型断言通过,覆盖 cqeCnt=1、cqeCnt=0 和未回卷输入。git diff --check 通过。尝试构建仓内 examples/aicore/hcomm/04_simt_urma 样例,但本机 Toolkit 9.1.0 与当前仓库头文件布局不匹配:安装头文件缺少 COMM_PROTOCOL_UB_CTP/hcomm_simt.h,改用源码头文件后其 package-relative ../../../impl/comm_api/... 头也未暂存,故样例编译未完成;没有运行 NPU kernel 或设备端 Drain 测试。

文档更新

无。

类型标签

当前PR是否有AI参与:

[] 否
[x] 是
__1. Agent平台信息: Codex CLI 0.153.4
__2. 模型信息: gpt-5.6-luna
__3. Prompt摘要: 独立复核 SIMT URMA packed counter 回卷缺陷及相近 issue,按源码契约分别更新 SQ/CQE 两个 32 位字段,并进行边界静态验证。

希望检视人员了解:

  1. 人工参与说明:贡献者提供候选报告、基线和审核规则;本轮独立核对目标与最新 upstream 行号、全量 issue/PR 去重、issue 正文和 assignee 回读,并完成单 hunk 修复与 host 静态验证。未运行 NPU;提交后由贡献者负责评审沟通和上游反馈。
likedislike
当前Pull Request已关闭, 关闭人@little_apple_12
Llittle_apple_12
9月26日 创建了 pull request,commit c22d0dcb
Llittle_apple_12
9月26日 关联了issue:[Bug-Report|缺陷反馈]: SIMT URMA 关闭 CQE 的任务被 Drain 错误计数并超时,[Bug-Report|缺陷反馈]: SIMT URMA SQ head 回卷将进位错误计入 CQE 数
atomgit-bot
atomgit-bot
9月26日 评论:

变更摘要

本 PR 修复 src/aicore/hcomm/common/hcomm_simt_utils.h 中 HcommSimtTryReserve 的 SIMT 队列计数器回卷缺陷。原实现把低 32 位 SQ head 与高 32 位 CQE 计数打包成一个 delta 后整体加到 headVal 上,导致 SQ head 回卷时产生的低位进位会误增 CQE 计数。改动改为在 32 位宽度内分别更新 HcommSimtHeadIdx(headVal)+bbCnt 与 HcommSimtWqeCnt(headVal)+cqeCnt 两个字段,再按原有布局重新打包写回,不改变接口与计数语义。

主要改动

  • 移除整体打包相加: 删除原 delta(高 32 位 cqeCnt、低 32 位 bbCnt)的构造及 *headAddr = headVal + delta;,避免低位进位向高位 CQE 字段传播。
  • 低位 SQ head 字段独立更新: 新增 uint32_t nextHeadIdx = HcommSimtHeadIdx(headVal) + bbCnt;,使 head 回卷仅发生在自身 32 位宽度内。
  • 高位 CQE 计数字段独立更新: 新增 uint32_t nextWqeCnt = HcommSimtWqeCnt(headVal) + cqeCnt;,使 CQE 计数不再受 head 进位影响。
  • 重新打包写回: 通过 *headAddr = (static_cast<uint64_t>(nextWqeCnt) << 32U) | static_cast<uint64_t>(nextHeadIdx); 恢复原有 head/CQE 位布局,保持对外行为与接口不变。
likedislike
不准确?
atomgit-bot
atomgit-bot
9月26日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
9月26日 添加了label:ai-co-authored
CANN-robotCANN-robot成员
9月26日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
9月26日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)

Module Approval Details

module lgtm status approve status
src ❌ jiangxinyu3 (1/2)(You can also ask: kong0808, qin437231, zhanghao_0689, 李东锋, dengjing_aoe) ❌ (0/1)(You can also ask: 肖婷, 苏建加, jiangxinyu3, YeZZzzz1, bluesky901)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

little_apple_12, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
little_apple_12
9月26日 评论:

compile

likedislike
Llittle_apple_12
9月26日 预合并成功(commit_id: e34295acbfec07e49b5550ab73389621f9078a07)
CANN-robot
CANN-robot成员
9月26日 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
9月26日 添加了label:ci-pipeline-running
CANN-robotCANN-robot成员
9月26日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
9月26日 添加了label:ci-pipeline-passed
little_apple_12
10 天前 评论:

这个 PR 提交 23 天了,还在等人工评审。@bluesky901 您方便的时候麻烦看一下,谢谢!

likedislike
izanaami
izanaami成员
3 天前 评论:

🤖 GitCode 检视报告

PR: https://gitcode.com/cann/asc-comm/pull/231
base: f030174da0811a4f22201aa252ddd52885335b6c
head: c216b4481e28c220f0d872a804bbc8959a28e077

结论:Issue #45 成立,PR 修复合理,未发现需要修改的新增缺陷,可按正常门禁推进合入。

问题依据:HcommSimtTryReserve 的低 32 位为 WQEBB head,高 32 位为产生 CQE 的累计计数。整体 64 位加法会在低位回卷时向高位多进 1;ReserveSq 调用该 helper,Drain 将高位传给 PollCq,目标高出实际完成数可能导致额外等待和失败。Issue 已准确限定为静态/主机复现,没有冒充设备运行结果。

修复与反证:分别在 uint32_t 内加法后重组保持独立模 2^32 语义;这是有意回卷,不是需要饱和或报错的普通整数溢出。HCOMM_SIMT_WQE_CNT_MASK 为 0xFFFFFFFF,公共契约限制单 lane 驱动通道,原有容量检查及 headVal 输出语义保持不变。与 cqe=0 计数修复根因不同。

验证:从当前头文件原样提取 HeadIdx、WqeCnt、TryReserve 函数体,抹去设备限定符,以主机 C++17 -Wall -Wextra -Werror 编译运行。48 组输入覆盖低位 0/8/UINT32_MAX-1/UINT32_MAX、高位 0/41/UINT32_MAX、bbCnt 1/2、cqeCnt 0/1,全部通过;容量拒绝不改 head、仍输出原 head 的断言通过。相同方式运行 merge-base 原函数,复现 CQE=43(期望 42)。git diff --check 和 API 文件清单交叉核对通过。

建议把上述边界用例纳入仓内回归测试;当前 PR 只修改 helper,正文的外部模型不是持续集成测试。本项作为建议,不据此否定已核验的最小修复。未验证设备限定符、设备编译、缓存/并发、NPU Drain 或长时间运行;主机提取测试不是完整设备测试。

本次三个 Issue 对应独立修复,无需联合交付;各 PR 独立审查。

likedislike
izanaami
izanaami成员
3 天前 评论:

/lgtm

likedislike
little_apple_12
3 天前 评论:

本 PR(commit c216b44)的修复——headAddr 的高低 32 位应分别独立回绕(wrapping)相加,而不是整体做一次 64 位加法(避免 curHead 回绕时错误进位污染 wqeCnt)——已被 upstream 对 hcomm_simt_utils.h 的独立重写覆盖:新版同样分别计算 curHead + bbCnt 与 wqeCnt + cqeCnt 后再拼回 64 位,数学上与本 PR 的修复完全等价,并额外带有调试断言与辅助函数重构。本 PR 没有其他改动。关闭为 superseded。

likedislike
Llittle_apple_12
3 天前 关闭了 pull request