跳到主要内容

ISSUE-048:G5 多芯 ring collective msg_id 超出 multi-channel 段长,N>16 仿真 panic

发现日期:2026-06-11 状态已修复 类型实现 bug 影响范围:multi-channel C>4 下 ring collective 参与芯片数 N>16 时仿真 panic,路径整体不可用;N≤16 不受影响。


问题现象

32 芯 ring allreduce(services 评估路径 participants: "all")panic:

src\collective\expand.rs:72: multi-channel C=8 (>4) 复用 msg_id 段: 单 channel msg_id 跨度 62 必须 < 32 (段长)

调查过程

  • [实验] 4 芯 allreduce 正常,32 芯 panic → 规模相关。
  • [查代码] replicate_channels:C>4 时 ch=4..7 与 ch=0..3 共享 msg_central,靠段长 32 的偏移隔离 → 断言要求单 channel msg_id 跨度 < 32。
  • [查代码] expand_ring_steps:msg_id = step(全程唯一),ring AR 步数 2(N−1),N=32 → 跨度 62 ≥ 32。
  • [查 spec] G5-CDMA-msg同步体系设计规格:4 central × 256 slot/chip;MsgWait 为消费语义(满足即扣减)。spec 无「步号全程唯一」要求,段长 32 是展开层自定的静态分段。

根因分析

展开层给 msg_id 直接赋步号且全程不复用;静态三层分段(方向位/共享 central/段偏移)后每空间仅 32 号。N>16 时步数超过段长。断言本身来自守恒加固,目的正确(之前同样跑法是静默串扰)。


解决方案

msg_id 取模复用:步号按段长 32 取模。安全前提(两条同时成立):MsgWait 消费语义清零计数;ring 依赖链使生产端最多领先消费端 1 步,同号复用相隔 32 步。N 不再受 msg_id 空间限制。

文件改动
src/collective/helpers.rs新增 MSG_ID_SEGMENT_SIZE=32;1-port / 2-port 路径 msg_id 取模;删除 total_steps<128 与 <32 断言

replicate_channels 的段隔离断言保留(其他算法超段仍显式拒绝)。


验证

  • cargo test 453 + golden 1 全过。
  • 修复前 32 芯 panic → 修复后 tests/services/test_comm_eval_routing.py 2 passed,全量 1347 passed。

Lessons Learned

  • 仓库根目录残留的 g5_rs.cp314-win_amd64.pydpythonpath=. 遮蔽 site-packages 新版本,重建后必须同步覆盖根目录副本,否则 Python 端验证跑的还是旧 binary。
  • 无 venv 环境 maturin develop 不可用,用 maturin build + python -m pip install --force-reinstall <wheel>