当前Pull Request已关闭, 关闭人@little_apple_12
变更摘要
本 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 位布局,保持对外行为与接口不变。


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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


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


🤖 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 独立审查。


/lgtm


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


描述
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=0WQE 被计为一个 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真实输出:
使用 GCC 12.3.1 编译并运行保存于 case 验证记录中的 C++17 host 边界模型:
真实输出:
模型断言通过,覆盖
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 位字段,并进行边界静态验证。
希望检视人员了解: