ISSUE-025: G5 仿真测试覆盖审查 — 过时测试 + 缺口
发现日期:2026-05-15
状态:批次 A 已完成 (2026-05-15) / 批次 B 待启动
测试数:274 → 281 (+7 净增加,0 失败)
类型:建模误差风险 (测试缺口未直接造成 bug,但回归保护薄弱)
影响范围:G5 仿真所有模块。已知部分 P0 缺口 (如 hash 周期共振,ISSUE-018) 已修复但无回归测试;CFS 一致性模式 / Relay 多跳透传 / 跨 LG 事务完成等无端到端覆盖,风险集中在大消息 / 多 chip / 多 LG 场景
问题现象
对 G5 仿真 5 个 spec 文件 (4369 行) 与 278 个 Rust 测试做对照审查:
- 总功能点 ~160 个 (按可测试行为粒度)
- ✅ 覆盖 96 (60%)
- ⚠️ 部分覆盖 25 (16%)
- ❌ 未覆盖 39 (24%)
- 过时/弱效用测试 6 个
覆盖呈两端化:
- 高覆盖 (70-85%): CDMA 指令体系,RC Link TX (含 DCQCN),collective 展开
- 低覆盖 (<30%): CFS 模式,Switch DT-iSLIP 边界,A4S 跨 chip 路径,Relay 透传
调查过程
- [审查] 对照 5 个 spec (
G5-CDMA建模设计规格.md1555 /G5-PAXICore事务层设计规格.md309 /G5-RC-Link传输层设计规格.md1287 /G5-Switch建模设计规格.md731 /互联通信G5仿真建模设计规格.md487) 与 18 个测试文件 - [对照] 按模块逐项标记 ✅ / ⚠️ / ❌
- [验证] grep spec 章节 vs 测试名引用;抽样确认部分覆盖测试的实际断言强度
- [评估] 按 spec 给出的工况数 / 边界条件 / 错误路径数,反推单项覆盖深度
根因分析
测试基础设施稳健 (Rust build 阻止已删字段测试存活),但测试设计有结构性失衡:
- 集成测试占比仅 5% (15/278) — 多 chip / 多 LG / Switch 路径过度依赖少量集成测试;单一回归会掩盖多条路径
- 单元测试单点过密 — CDMA
tests.rs一个文件 59 个测试,而 Switch 只有 6 个;资源分配与 spec 复杂度不匹配 - 历史 ISSUE 修复缺回归 — ISSUE-018 (hash ITLV)、ISSUE-024 (qp_id 编码) 修复后没有补 regression,同类 bug 重新出现无保护
- 降级路径覆盖弱 — panic 类边界 ✅,但 NAK 风暴恢复 / DCQCN 持续 congested / Switch DT drop 后等运行时降级未覆盖
- Phase 2 计划项无 baseline —
write_done sideband,A4S 物理隔离当前是 Phase 1 简化,Phase 2 切换时无对照数据
Spec / 文档依据
项目 Spec:
docs/specs/G5仿真建模/共 5 文件 4369 行
审查方法:见 audit 报告 ([本会话产出,未独立成文])
解决方案
批次拆分
批次 A (低成本,高 ROI, ~1-2 小时):
- 清理 / 重构 6 个过时弱效用测试
- 补 P0#2 hash vs RR 周期共振 regression
- 补 P0#4 CHS Send 不触发 CdmaLocalComplete 断言
- 补 P1 qp_id
{XPU_ID, BANK}编码单元测试
批次 B (大工作,半天到一天):
- P0#1 跨 LG 事务完成端到端断言
- P0#3 CFS 一致性模式整套路径
- P0#5 Relay 芯片透传 (多跳 Mesh/Ring)
- P0#6 CreditReturn 免序列化路径
- P1 其余 (Switch port_busy overlap / iSLIP 收敛性 / Fence 多线程隔离 / RX per-LG / RETRY_TIMEOUT 等)
- 2-port Ring 标度问题 (2 个 #[ignore] 测试) — 见下文 "搁置回归测试"
搁置回归测试 (ignored,需在批次 B 调查)
批次 A audit 时发现 4 个 #[ignore] 测试,2 个是功能未实现的合理占位,2 个是真实回归被搁置,必须在批次 B 调查:
| 测试 | 位置 | 类型 | 处理 |
|---|---|---|---|
test_ring_allreduce_num_chunks | tree_allreduce.rs:194 | 功能占位 (num_chunks > 1 未支持,msg_id 命名空间无 chunk bit) | 保留 ignore,等命名空间扩展 |
test_2port_with_chunks | allreduce.rs:310 | 同上 | 保留 ignore |
test_2port_allreduce_faster_than_1port | multi_chip/tests.rs:267 | 疑似建模误差,注释 "2-port ring 历史上恒定 5233ns 不随 N 变化,thread_id 修复后暴露" | 批次 B 调查 — 2-port 比 1-port 快是 Ring 算法基本设计目标,仿真不满足意味着模型可能漏建某条加速路径 |
test_2port_latency_varies_with_n | multi_chip/tests.rs:284 | 同上,"2-port 延迟应随 N 变化,不能恒定" | 批次 B 调查 — 修了 thread_id (ISSUE-024) 后暴露的标度问题,可能与跨 LG 事务完成 (P0#1) 或 hash ITLV 散布 (P0#2) 相关,一起排查 |
风险:这两个搁置测试在 cargo test 中完全不可见 (ignored 输出,容易被忽略). 当前仿真在 2-port 配置下产出的 latency 结果未经标度验证,用户配置 num_ports=2 跑 multi-chip AllReduce 可能拿到错误的 latency 数据。
关键缺口清单
P0 (6 项)
| # | 缺口 | spec § |
|---|---|---|
| 1 | 跨 LG 事务完成保证 | RC Link §跨 LG 事务完成 |
| 2 | hash vs RR 周期共振回归 | RC Link §为什么 hash 优于 RR (历史 ISSUE-018) |
| 3 | CFS 模式整套路径 | CDMA §CHS/CFS |
| 4 | CHS Send 不触发 CdmaLocalComplete | CDMA §CHS 特殊处理 |
| 5 | Relay 芯片透传 (多跳无 Switch) | 顶层 §逐跳转发 |
| 6 | CreditReturn 免序列化 | RC Link §CreditReturn 免序列化 |
P1 (10 项)
| 缺口 | spec § |
|---|---|
qp_id {XPU_ID, BANK} 编码 | RC Link §QP ID 编码 (历史 ISSUE-024) |
| iSLIP 只第一轮更新指针 | Switch §指针更新规则 |
| Switch port_busy 不含 fwd_lat | Switch §port_busy_until 更新 |
| Fence 多线程隔离 | CDMA §仲裁机制 |
| write_done sideband Phase 2 baseline | CDMA §write_done sideband |
| RETRY_TIMEOUT_NS 超时重传 | RC Link §超时重传 |
| iSLIP iterations=1/4 吞吐对比 | Switch §吞吐率 vs 迭代次数 |
| DT α 灵敏度 (α=0.5/1.0/2.0/4.0) | Switch §alpha 值的影响 |
| RX per-LG EPSN 独立 | RC Link §RX 侧设计 |
| A4S 物理隔离 + Phase 2 切换 | CDMA §msg 信号传输路径 |
过时测试 6 项
| 测试 | 位置 | 处理 |
|---|---|---|
test_cmd_queue_load_more_than_64_does_not_panic | cdma/tests.rs | 重构:测软上限断言,不只测不 panic |
test_write_done_sideband_yaml_loading | cdma/tests.rs | 删除:与 sideband 功能无关 |
test_expand_collectives_dispatch | tree_allreduce.rs | 删除:与 expand.rs 32 个 dispatch 测试重复 |
test_2port_n2_falls_back_to_1port | expand.rs | 保留 (复查后):验证 wire bytes 公式 (N-1)/N × M,与 test_ring_2port_1port_fallback 验证 cmd 数量不同维度 |
test_n1_backward_compat | paxi.rs | 重命名:N=1 是合法配置,不是"兼容" |
test_a4s_zero_line_rate_panics | a4s.rs | 保留 (input 验证,价值低但无害) |
验证
批次 A 完成标准:
- 6 个过时测试按 "处理" 列动作 (3 删 + 2 重构 + 1 保留)
- 3 个 P0/P1 回归测试通过,故意回滚被测代码可让新测试失败
cargo test --release总数维持或增加,0 失败
批次 B 完成标准:待批次 A 结束后单独 plan.