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.py2 passed,全量 1347 passed。
Lessons Learned
- 仓库根目录残留的
g5_rs.cp314-win_amd64.pyd因pythonpath=.遮蔽 site-packages 新版本,重建后必须同步覆盖根目录副本,否则 Python 端验证跑的还是旧 binary。 - 无 venv 环境 maturin develop 不可用,用
maturin build+python -m pip install --force-reinstall <wheel>。