ISSUE-033 — G5 仿真 TX 端 SerDes 限速错置 per-edge,缺 chip 级聚合带宽 cap
| 字段 | 值 |
|---|---|
| 日期 | 2026-06-03 |
| 状态 | 根因已锁定 (git 考古 + Rust 调试实测 + 原始 spec 证据). 修复 = TX 端新增 chip 级 per-LG 聚合 cap (镜像 ISSUE-029 RX) + 撤 PhyLink per-edge 带宽 cap + spec 修正,走 spec-plan-act |
| 类型 | 建模缺陷 (modeling bug) — SerDes 限速放错抽象层 (per-edge 而非 per-LG),仿真产出 per-chip busbw / TX 速率违反物理上限 |
| 影响范围 | G5 TX 路径 (rc_link_tx.rs frame_send_delay + c2c_link.rs per-edge PhyLink) + spec G5-RC-Link传输层设计规格.md (§打包延迟 vs §芯片级聚合吞吐 自相矛盾) + validation exp37 数据集 (主线 234 cell busbw>400,集中 tok>=192) |
| 关联 | ISSUE-018 (引入回归);ISSUE-029 (RX 端已修,本 issue 是 TX 对称面) |
[2026-06-04 根因修正] 本 issue 是症状,真因见 ISSUE-034
后续 debug 用 Rust 探针实测推翻本 issue 的"chip 出向超速"定性:单 LG 物理严格 50 GB/s (overlap=0)、单 chip 出向 ≤396 < 400, 物理串行从未违反。busbw>400 的真因是 [[ISSUE-034]] alltoallv 帧静默丢失 → 仿真提前终止 → total_time 偏小 → busbw 虚高,非 TX 超速。
- 本 issue 加的 per-LG SerDes 发送 cap (frame_send_delay=max(datapath,serdes), tx_busy 串行) 物理正确,予以保留 — 它正确约束了单 LG 稳态吞吐 = line_rate_per_lg, chip 8 LG 聚合 400。
- 但它不是 busbw>400 的解决方案 (cap 生效后 v4 仍 203 cell 超限)。真正的修复见 ISSUE-034 (per-LG 容量取货,不丢帧)。
- 本 issue "解决方案/验证" 中"修复后 busbw≤400"的结论作废 — 那是基于残缺数据的误判。
结论速览
根因:SG2262 的 c2c SerDes 限速物理上是 per-LG(chip 固定 8 个 Link Group / MAC,各按 line_rate_per_lg=50 GB/s 释放 MAC2TX_CREDIT,聚合 chip 级 400)。但 G5 把 TX SerDes 限速放在 per-edge PhyLink(每条拓扑链路独立限速)——edge 数随拓扑变(cpb=8 → 8 条),LG 数固定 8。多 edge 拓扑下 TX 聚合 = edge 数 × per-edge BW,突破物理 8×50=400。
回归来源:commit 8508676(04-30) 曾用 pack_delay = max(datapath, serdes) 在 RcLinkTx 内实现 per-LG SerDes 限速;commit bc2a716(ISSUE-018, frame-level 重构,spec 1.3.0) 移除该 serdes 项,注释改"SerDes 由 PhyLink 承担"——把 chip 级 per-LG 约束错置成 per-edge。单 edge 拓扑 (cpb=1) 下 per-edge=chip 唯一出口,bug 不显;cpb=8/torus 多 edge 暴露。
Rust 调试实测 (fat-tree-k16 ECMP S1 skew2.0, chip0): TX wire_rate 620(tok256)/700(tok1024) GB/s >> 400; RX 315/324 < 400 (ISSUE-029 RX cap 工作正常).
原始硬件 spec 证据 (RCLINK_AFH_SPEC_v2.4 §7.4.1 CEMAC_TX): MAC2TX_CREDIT_I "MAC releases 1 credit" 是单个 MAC 的 credit 信号;SG2262 每芯片 8 个 LG/MAC (C2C 方案 + SG2262.yaml num_link_groups=8),各 MAC 按自身 SerDes 线速释放 credit。即限速粒度 = per-LG (per-MAC), chip 级 = 8 LG 聚合,与拓扑 edge 无关。
问题现象
exp37 主线 (top_k=6, sw_lat 默认) 234 cell bus_bw_gb_per_s > 400, max 449.7 (= 400×63/56,完美均衡 chip 多 edge 并行理论上界). 按 tok: tok<=128 0 个;tok=192 12; tok=256 169 (max 427); tok=512 8; tok=768 2; tok=1024 43 (max 450). 超限从 tok>=192 出现,decode 主点 tok=256 受影响最多。
机制:TX 无 chip 级 cap -> chip 突发推完 (chip0 TX window 远小于 payload/400) -> total_time 由别处决定 -> 数据量大时 busbw = avg_TX/total_time > 400.
调查过程
- [查记录] ISSUE-029 (RX 缺 chip 级 cap) 已修 (commit 3899aff, per-LG rx_busy). 时间线:exp37 (06-02 17:35) 晚于 RX cap commit (17:27) -> v3 带 RX cap 跑的。
- [假设 板内 mesh] 否决:cpb=8 vs cpb=1(pure) 同 cell busbw 逐位相同 (402.57). 板内 mesh 不是根因。
- [Rust 调试] paxi.rs 加临时 dbg 累计 + Drop 打印 chip0 聚合 rate. 实测 RX 315(正常),TX 620-700 (无 chip 级 cap).
- [git 考古]
git log -S serdes -- rc_link_tx.rs: 8508676 加max(datapath,serdes), bc2a716(ISSUE-018) 移除。diff 实锤:pack_delay=datapath_ns.max(serdes_ns)→frame_send_delay=wire/datapath+ 注释"SerDes 由 PhyLink 承担". - [原始 spec] RCLINK_AFH_SPEC §7.4.1: MAC2TX_CREDIT per-MAC; 8 LG/chip -> per-LG 限速,chip 级聚合。证明 PhyLink per-edge 是错抽象层。
- [反例验证] 临时恢复 frame_send_delay=max(datapath,serdes):部分 cell 降但 n32 无效 / skew1.0 regression(460). 因 ISSUE-018 后 SerDes 已在 PhyLink,再加 = 双重串行。证明修复必须撤 PhyLink 带宽 cap,不能简单恢复 frame_send_delay.
根因分析
抽象层错置:SerDes 物理限速应在 per-LG (chip 固定 8 个 MAC),G5 放在 per-edge PhyLink (随拓扑变)。
| 概念 | 数量 | G5 现状 | 应为 |
|---|---|---|---|
| LG / MAC | 固定 8 | 无 per-LG TX 限速 (frame_send_delay 只算 datapath) | per-LG SerDes 串行化 (line_rate_per_lg) |
| edge | 随拓扑 (cpb=8→8) | per-edge PhyLink 各 400 GB/s (带宽 cap) | 仅 base_latency 物理传播,不做带宽 cap |
为何 ISSUE-029 漏 TX:ISSUE-029 verify 2 称"TX 端 PhyLink 有 chip 级 cap",基于 cpb=1 (单 edge=chip 唯一出口) 观察,cpb=8 多 edge 下失效。是样本盲区。
Spec / 文档依据
| 来源 | 内容 | 与本 issue |
|---|---|---|
| RCLINK_AFH_SPEC_v2.4 §7.4.1 CEMAC_TX | MAC2TX_CREDIT_I = per-MAC credit; CBFC per-VC (8 VC/MAC) | 限速粒度 per-LG(per-MAC),非 per-edge — 权威依据 |
| SG2262.yaml:106 | num_link_groups=8 | chip 固定 8 LG |
| spec §芯片级聚合吞吐 (L587) | TX per-LG MAC credit, 8 LG 聚合 400 (chip 级) | 正确,但实现未跟随 |
| spec §打包延迟 (L378, 1.3.0) | frame_send_delay=datapath only, "SerDes 由 per-edge PhyLink 承担" | 错误 (ISSUE-018 引入),与 §芯片级聚合吞吐 矛盾,需修正 |
| spec §芯片级聚合接收 cap (L687, 1.4.2) | RX 镜像 TX per-LG cap | TX 对称面缺失 |
解决方案
采用 (实施后修正):TX 在 RcLinkTx 层加 per-LG 发送 SerDes cap; PhyLink per-edge 序列化保留,二者共存。
rc_link_tx.rs(核心):RcLinkTx 加tx_serdes_line_rate_bytes_per_ns字段;try_arbitrate的frame_send_delay = max(datapath_delay, serdes_delay)(serdes = wire/line_rate_per_lg)。tx_busy(bool) 已串行化本 LG,单 LG 吞吐 = wire/max(datapath, serdes) = line_rate_per_lg (serdes 50 < datapath 64, serdes binding); chip 8 个 RcLinkTx (per-LG 实例) 并行 -> 聚合 cap = 8 × 50 = 400。tx_serdes=0 退化 datapath-only (fixture,对称 RX guard)。+ 3 unit test。paxi.rs: PAXIConfig 加tx_serdes_line_rate_per_lg_bytes_per_ns+ 透传 RcLinkTx::with_dcqcn。setup.rs:从 yaml 注入 (复用paxi.tx.line_rate_per_lg_bytes_per_ns,收发共用全双工 SerDes)。c2c_network.rs:零改动 — PhyLink per-edge 序列化保留,与 per-LG cap 共存 (chip 出口 binding = min(per-LG 聚合 400, PhyLink edge 400),均 ≤ 400)。
关键修正 (与初始 plan 不同):初始 plan 拟撤 PhyLink chip 出口带宽 cap (避免 double-serialize)。实施验证证明撤 PhyLink 会 crash single-switch (425→21):chip→sw 撤序列化后数据涌入单 sw, sw→chip 序列化 + 单 sw 中转产生病态串行。改为保留 PhyLink:per-LG cap (50/LG) 是 binding, PhyLink edge (400) 在多 edge 下不 binding、single edge 下共同 400,无 double-throughput (busbw 由 per-LG binding ≤400),latency 略增可接受。spec §打包延迟/§芯片级聚合发送 cap 的"PhyLink 撤 chip 出口 cap"表述需相应修正为"共存"。
否决 (撤 PhyLink chip 出口序列化):single-switch crash 425→21,见上。
验证 (Acceptance Criteria)
实测 (gate 子集 + n64 补测):
- ✅ 核心:n64 tok256 (decode 主区间,原 169 cell 超 400 大头) 全 ≤400:ft-k16 ECMP S0/S1/S2 = 295/258/294, dmodk = 382/235/379; torus-4x4x4 ECMP = 375/224/379, DOR = 373/231/370。
- ✅ single-switch S1 skew1.2 tok256: 425 → 355。
- ✅ RX cap 不变 (ft-k16 S1 tok256 = 258); baseline tok128 = 131。
- ✅ cargo test 361 passed (含 3 新 TX cap test: serdes-binding / 串行 / zero-bypass)。per-LG 串行化已确认 (lg0 连续帧间隔 = 86ns = ceil(wire/50))。
boundary (few-frame artifact / 范围外,接受):
- n32 tok256 S2 = 402.6 (0.65% over): n32 小矩阵 few-frame, per-LG cap (限稳态排队吞吐) 不 binding, busbw 由 startup 延迟主导 — measurement artifact,非稳态 TX 超物理。
- tok1024 (prefill) skew1.0 = 460: design 范围仅 decode (tok 128-256), prefill 不在范围 + few-frame artifact。
待全量重跑 (Task 6):exp37 全量 3879 cell 重跑确认 decode (tok≤256) 主区间无 cell >400; few-frame/prefill artifact 单独标注。重写 report KA1/KA2/KA3。
遗留问题
- 修复后 KA1/KA2 拓扑/路由相对排序预期不变 (同比例下修),绝对 busbw 数字下修,待重跑确认排序稳定。
- spec 统一后,TX cap 与 RX cap 应合并为同一节 "芯片级聚合 c2c cap (TX/RX 对称,per-LG)".