互联通信G5仿真建模设计规格
版本: 1.2.0 状态: Draft 创建日期: 2026-03-31 最后更新: 2026-04-08
背景与目标
背景
数学模型(Alpha-Beta)以闭式公式计算集合通信延迟,适用于快速参数扫描,但无法建模链路排队争用、流控背压、多线程仲裁等硬件行为。本 spec 定义包级事件驱动通信仿真的设计——以 CDMACommand 为基本仿真单位,经 PAXI 事务层分段、RC Link 传输层打包后在 C2C 物理链路上逐跳传输。与数学模型互补:数学模型用于设计空间探索,包级仿真用于精确瓶颈分析和硬件验证。
目标
- 事件驱动仿真完整 Tier 6 通信栈:PAXICore → RC Link TX/RX → InterconnectTopology → Switch(可选)
- CDMA 多线程仲裁建模(RR 仲裁、Outstanding 流控、tcredit 握手)
- 集合通信算法展开为 CDMACommand 序列
- RC Link 完整协议建模:Slot 状态机、PSN 序列号、CBFC credit 流控、Go-Back-N 重传
- 支持 chip + switch 混合拓扑,路由由外部 Dijkstra 预计算
- 可选 Switch 模型(VOQ + iSLIP + Dynamic Threshold + ECN)
不涉及范围
- Tier 3 核级计算模块(TIU/DMA/SDMA/HAU)
- Tier 4 NoC 完整 flit 级仿真(当前简化为 BusModel)
- Tier 5 D2D 互联建模(已在 BusModel 作为透明延迟叠加层实现)
术语
| 术语 | 定义 |
|---|---|
| CDMACommand | 跨芯片 DMA 指令,包级仿真的基本单位 |
| PAXI | Protocol of Accelerated eXchange Interconnect,芯片间互联协议的总称(含事务层 + 传输层) |
| PAXICore | PAXI 事务层模块名,管理 W/R OST 和 MPS 分段。注:PAXI 指协议,PAXICore 指仿真中的事务层模块 |
| RC Link | Reliable Connection Link,PAXI 的传输层,提供可靠传输、CBFC 流控 |
| Slot | RC Link TX 的发送缓冲槽位,三态:Empty → WaitGrant → WaitAck |
| PSN | Packet Sequence Number,12-bit 包序列号,per-(dst, QP_ID) 独立 |
| QP | Queue Pair,RC Link 通信端点 |
| VC | Virtual Channel,5 个有效通道:Bank0–3 + MUL |
| CBFC | Credit-Based Flow Control,per-(dst, VC_ID) 的 credit 流控 |
| OST | Outstanding Transaction,在途事务数上限 |
| MPS | Maximum Payload Size,事务层单次 burst 最大 4096B |
| VOQ | Virtual Output Queuing,交换机中消除 HOL 阻塞的队列结构 |
| iSLIP | 交换机调度算法,多轮 Request-Grant-Accept |
| tcredit | P2P 握手信号,RECEIVE 端发给 SEND 端确认就绪 |
| write_done | SEND 端写完成后发给 RECEIVE 端的通知 |
| FACK | Fast ACK,零字节包绕过 ACK MERGE 立即确认 |
通信栈架构
分层总览
模块职责
| 模块 | 职责 | 输入 | 输出 |
|---|---|---|---|
| 集合通信展开 | 将 AllReduce/P2P 等原语拆为每芯片的 CDMACommand 列表 | CommOp | CDMACommand 序列 |
| CDMA | 多线程指令调度,决定何时提交到 PAXI | CDMACommand | 提交请求 (dst, data_bytes, context) |
| PAXICore | 事务级管理,将大传输按 MPS 分段,追踪完成状态 | 提交请求 | 分段后的包列表(内部传递给 RC Link TX) |
| RC Link TX | 为每个包分配 Slot/PSN,VC 仲裁后打包发送 | 包列表 | 打包完成事件 (RcPackDone) |
| RC Link RX | PSN 校验,ACK 汇聚,CBFC credit 返还 | 收到的包 | ACK/NAK + CreditReturn |
| InterconnectTopology | 物理链路传输,序列化延迟 + 排队争用 + 传播延迟 | wire_bytes + 路由 | 到达下一跳的时间 |
| Switch | 交换机转发,VOQ 入队 + iSLIP 调度 + 出口序列化 | 入口帧 | 出口帧 |
端到端示例:一次 Transfer 的完整生命周期
以 Chip 0 向 Chip 1 发送 8192B Transfer(经 Switch)为例,展示包从发起到确认的完整流程。
时序图
关键时间点
| 阶段 | 延迟来源 | 典型值 (8192B @ 448 GB/s) |
|---|---|---|
| CDMA startup | 指令启动固定开销 | 50 ns |
| PAXICore 分段 | 逻辑处理(不计入仿真时间) | 0 |
| RC Link TX 打包 | ceil(wire_bytes / 64) ns,512-bit datapath @ 1GHz | ~22 ns / 包 |
| C2C 链路 (Chip→Switch) | wire_bytes / bandwidth + base_latency | ~3 ns + 150 ns / 包 |
| Switch 转发 | 转发延迟 + 出口序列化 | 30 ns + ~3 ns |
| C2C 链路 (Switch→Chip) | wire_bytes / bandwidth + base_latency | ~3 ns + 150 ns / 包 |
| RX ACK MERGE | 轮询周期 | 4 ns |
| ACK 反向传输 | 50B / bandwidth + base_latency (× 跳数) | ~150 ns × 2 跳 |
| CBFC credit 返还 | 固定延迟 | 1 ns |
CDMA 建模
每个 Die 有 4 个 CDMAUnit,每个 CDMAUnit 含多个线程共享一个 datapath。
线程状态机
每条指令有 cmd_id_dep 字段,仅当线程的 sync_id >= cmd_id_dep 时才参与仲裁。sync_id 在指令完成时更新。
仲裁决策流程
tcredit 握手
P2P 通信使用 Send + Receive 配对。Receive 端先发射零字节 tcredit 包,Send 端收到后才能开始数据传输:
- 目标芯片执行 Receive → 提交零字节包到 PAXI → 经完整协议栈传输
- RX 端收到零字节包 → FACK(绕过 ACK MERGE,立即 ACK)→ 事务完成 → TcreditArrived 事件
- 源芯片 CDMA 收到 tcredit → TCreditWait 线程转 Ready → 仲裁胜出后执行 Send
- Send 数据经完整协议栈传输 → 全部 ACK → DataArrived → 源端 on_remote_done + 目标端 notify_write_done
参数
| 参数 | 含义 | 默认值 |
|---|---|---|
| CDMA_COUNT_PER_DIE | 每 Die 的 CDMAUnit 数 | 4 |
| THREADS_PER_CDMA | 每 CDMAUnit 线程数 | 8 |
| MAX_OUTSTANDING | 共享 Outstanding 上限 | 16 |
| BANDWIDTH_BYTES_PER_NS | datapath 带宽 | 8.0 (64 GB/s) |
| STARTUP_LATENCY_NS | 指令启动延迟 | 50 |
PAXICore 事务层建模
PAXICore 管理 AXI 事务级 OST 和 MPS 分段。
OST 管理
W_OST 和 R_OST 独立计数,各上限 256。提交时检查对应 OST 是否已满:
- 未满:分配 OST,创建 TxnTracker,生成 SegmentInfo 列表
- 已满:入 pending_queue 排队,等释放后 drain
事务的所有包全部收到 ACK 后释放 OST。
MPS 分段规则
将 AXI 事务按 MPS (4096B) 拆分为 segment,每 segment 再按 max_payload (1344B) 拆分为 RC Link 包:
$\text{segments} = \lceil \text{data\_bytes} / \text{MPS} \rceil$
$\text{每 segment 包数} = \lceil \text{seg\_bytes} / \text{max\_payload} \rceil$
示例:8192B → 2 segment × 4 包 = 8 个 SegmentInfo。
事务追踪
每个事务创建 TxnTracker,记录 total_packets 和 acked_packets。每收到一个包的 ACK,acked_packets++。全部完成时:
- 释放 OST
- 根据 op_type 生成 DataArrived(Transfer/Send)或 TcreditArrived(Receive)事件
PAXICore 与 RC Link 的衔接
PAXICore 的 submit() 完成 OST 检查和 MPS 分段后,将分段结果直接传递给同一 PAXIBridge 内的 RC Link TX。RC Link TX 为每个分段分配 Slot 和 PSN,入 VC 待发队列。整个过程在同一次调用链中完成,PAXICore 和 RC Link TX 共同组成 PAXIBridge 的发送路径。
反向路径:RC Link TX 收到 ACK 后释放 Slot,调用 PAXICore 的 on_packet_acked() 更新事务追踪状态。
参数
| 参数 | 含义 | 默认值 |
|---|---|---|
| W_OST_LIMIT | 写 OST 上限 | 256 |
| R_OST_LIMIT | 读 OST 上限 | 256 |
| MPS | Maximum Payload Size | 4096B |
| MAX_PAYLOAD | RC Link 最大包负载 | 1344B |
RC Link 传输层建模
RC Link 分 TX 和 RX 两个独立部分,负责可靠传输、流控和仲裁。
Slot 状态机 (TX)
TX 维护 512 个 Slot 的发送缓冲池:
Slot 耗尽时新包入 pending 队列,ACK 释放 Slot 后自动 drain。
PSN 管理
12-bit 环形序列号 (0–4095),per-(dst, qp_id) 独立计数。分配时递增。比较使用半区判定:
$\text{before}(a, b) = 0 < (b - a) \bmod 4096 < 2048$
ACK 为累积确认:ack_psn 表示该值之前的所有 PSN 已确认。
VC 仲裁
5 个虚拟通道,按 qp_id 低 2 位分类到 Bank0–3:
| VC | 权重 | 分类 |
|---|---|---|
| Bank0 | 1 | qp_id & 3 == 0 |
| Bank1 | 1 | qp_id & 3 == 1 |
| Bank2 | 1 | qp_id & 3 == 2 |
| Bank3 | 1 | qp_id & 3 == 3 |
| MUL | 256 | 多播 |
仲裁决策流程:
CBFC 流控
Per-(dst, vc_id) 粒度,单位 credit_size (256B):
$\text{消耗} = \lceil (\text{payload} + \text{pkt\_ovhd}) / \text{credit\_size} \rceil$
发送检查:credit >= 消耗 + CREDIT_UF_LIMIT。RX 端收包后延迟 1 ns 返还 credit,返还量使用相同公式计算:$\lceil (\text{payload} + \text{PKT\_OVHD}) / \text{CREDIT\_SIZE} \rceil$。
初始 credit 在仿真组装时统一设置(默认 1024)。
Go-Back-N 重传
RX 检测 PSN 间隙时生成 NAK。TX 收到 NAK 后:
- 检查重传计数是否超过 max_retry (15)
- 将该 (dst, qp_id) 所有 WaitAck Slot 回退到 WaitGrant
- push_front 到 VC 队列头部(优先重传)
- 重传计数 +1
另设 retry_timeout (50 μs):WaitAck 超时未收到 ACK,视同 NAK 处理。
RX 收包处理
ACK MERGE:需求驱动的累积 ACK 汇聚。收包时更新 max_contiguous_psn,轮询触发时生成一个 ACK 覆盖所有已收包。减少 ACK 包数量。
参数
| 参数 | 含义 | 默认值 |
|---|---|---|
| TYPE1_OST | Slot 池大小 | 512 |
| HEADER_OVERHEAD | 每包头部 | 50B |
| CREDIT_SIZE | CBFC 信用粒度 | 256B |
| CREDIT_UF_LIMIT | 信用下限保留 | 1 |
| MAX_RETRY | Go-Back-N 最大重传次数 | 15 |
| RETRY_TIMEOUT_NS | 重传超时 | 50000 |
| CC_WINDOW_NS | Rate Control 窗口 | 1000 |
| LENGTH_THR | 窗口内最大字节数 | 86016 |
| MERGE_DEPTH | ACK MERGE 深度 | 64 |
| POLL_CYCLE_NS | ACK MERGE 轮询周期 | 4.0 |
| CREDIT_RETURN_DELAY_NS | credit 返还延迟 | 1.0 |
InterconnectTopology 互联拓扑建模
物理链路延迟模型
每条链路(单向)维护 busy_until_ns 时间戳,建模序列化延迟和 FIFO 排队争用:
$T = T_{\text{wait}} + T_{\text{serial}} + T_{\text{prop}}$
| 分量 | 公式 | 含义 |
|---|---|---|
| $T_{\text{wait}}$ | $\max(0, \text{busy\_until} - \text{now})$ | 排队等待 |
| $T_{\text{serial}}$ | $\text{wire\_bytes} / \text{bandwidth}$ | 序列化(bandwidth 单位 bytes/ns) |
| $T_{\text{prop}}$ | base_latency_ns | 传播延迟 |
路由数据来源
路由由 Python 侧 topo_routing 子包的 Dijkstra 算法预计算,以四类数据传入仿真:
- nodes:节点列表,每个节点标记类型(chip 或 switch)及属性(chip_id、端口数、转发延迟)
- edges:物理链路列表,含带宽 (GB/s) 和延迟 (μs),自动创建双向链路
- routes:每对 chip 间的预计算路径,以节点名列表表示(如
["c0", "sw0", "c1"]) - switch_configs:switch 的端口数和转发延迟,用于自动创建 SwitchModel
逐跳转发逻辑
包在网络中逐跳传输,每到达一个节点根据类型决定下一步行为:
路由查找:给定 (src_chip, dst_chip, current_node),从预计算路径中定位 current_node 的位置,返回路径中的下一个节点。
反向路径:ACK/NAK/CreditReturn 从 RX 端沿反向路由传回 TX 端,同样经过物理链路延迟。反向路由使用 (dst_chip, src_chip) 的预计算路径。
Switch 建模
当拓扑图中存在 switch 节点时自动创建。
VOQ + iSLIP 调度
VOQ:per-(ingress, egress, priority) 独立队列,消除 Head-of-Line 阻塞。
iSLIP 调度:每时间槽执行多轮 Request-Grant-Accept:
- Request:未匹配的 ingress 向有数据的 egress 发请求
- Grant:每个 egress 用 RR 指针选择一个 ingress
- Accept:每个 ingress 用 RR 指针接受一个 grant,更新双方指针
默认 2 轮迭代,8 端口下可达 ~99% 吞吐。时间槽 = frame_size / port_bandwidth。
优先级分类:
| 流量类型 | 优先级 | 说明 |
|---|---|---|
| tcredit / write_done | 3 (High) | 控制消息优先 |
| allreduce / transfer | 2 (Medium) | 数据传输 |
| 其他 | 1 (Low) | 响应/杂项 |
Dynamic Threshold 缓冲管理
$T_q = \alpha \cdot \frac{B_{\text{free}}}{N_{\text{active}}}$
$\alpha$ 控制激进程度:$\alpha \geq 2$ 适合 AllReduce 同步突发场景。
ECN 标记
基于出口端口缓冲占用率 $\rho$ 的概率标记:
$P(\rho) = \begin{cases} 0 & \rho < k_{\min} \\ \frac{\rho - k_{\min}}{k_{\max} - k_{\min}} & k_{\min} \leq \rho \leq k_{\max} \\ 1 & \rho > k_{\max} \end{cases}$
标记后生成 CnpReceived 事件发回源端(当前未闭环调速)。
参数
| 参数 | 含义 | 默认值 |
|---|---|---|
| FORWARDING_LATENCY_NS | 转发延迟 | 30 |
| PORT_BANDWIDTH_GBPS | 端口带宽 | 400 |
| PORT_COUNT | 端口数 | 8 |
| BUFFER_CAPACITY_BYTES | 总缓冲 | 16 MB |
| ALPHA | DT 系数 | 2.0 |
| ECN_KMIN / ECN_KMAX | ECN 阈值 | 0.5 / 0.8 |
| ISLIP_ITERATIONS | iSLIP 迭代轮数 | 2 |
| FRAME_SIZE_BYTES | 典型帧大小 | 1406 |
集合通信展开
将高层通信原语展开为每芯片的 CDMACommand 序列。
算法总览
| 算法 | 步数 | 每步指令数 | 依赖模式 |
|---|---|---|---|
| Ring AllReduce | $2(N-1)$ | $N$ | 同芯片串行 (cmd_id_dep) |
| Ring AllGather | $N-1$ | $N$ | 同芯片串行 |
| Ring ReduceScatter | $N-1$ | $N$ | 同芯片串行 |
| Tree AllReduce | $2\log_2 N$ | $\leq N$ | 树状依赖 |
| Pairwise AllToAll | $N-1$ | $N$ | 同芯片串行 |
| 分层集合通信 | 按 tier 分段 | 按维度分组 | 跨维度串行 |
| P2P | 1 | 2 | Send + Receive + tcredit |
指令生成规则
展开时为每条 CDMACommand 分配:
- thread_id:在每个芯片内按模块级计数器轮转(
counter % THREADS_PER_CDMA),使指令均匀分布到各线程 - cmd_id_dep:同芯片内的串行依赖。Ring 算法中,每步的指令依赖上一步同 chunk 的指令完成;分层算法中,跨维度通过最后一条指令的 cmd_id 建立依赖
- cmd_id:全局递增,展开函数维护计数器
Ring 管线化
当 num_chunks > 1 时,每步拆为多个子传输。同 chunk 跨步串行(cmd_id_dep 链接),不同 chunk 可在不同线程上并行。管线深度 = min(num_chunks, THREADS_PER_CDMA)。
P2P 展开
生成 Receive(目标芯片,零字节 tcredit)+ Send(源芯片,等 tcredit 后发数据)配对。remote_thread_id 互相指向对方,用于 tcredit/write_done 路由匹配。
接口定义
事件类型
| 事件 | 携带数据 | 触发行为 |
|---|---|---|
| CdmaWake | chip_id | 触发 CDMA try_arbitrate() |
| RcPackDone | chip_id, slot_idx, dst, wire_bytes, qp_id | 包打包完成,提交到 InterconnectTopology |
| C2CLinkDone | src_chip, arrived_at_node, final_dst, slot/psn/txn/vc/ecn | 物理传输完成,按节点类型分派 |
| SwitchTick | switch_id | Switch 执行 iSLIP 调度 |
| AckMergePoll | chip_id, src_chip, qp_id | RX 端 ACK 汇聚轮询 |
| AckArrived | chip_id, from_chip, ack_psn, is_nak, qp_id | ACK/NAK 到达 TX 端 |
| CreditReturn | chip_id, from_chip, vc_id, count | CBFC credit 返还 |
| RcLinkWake | chip_id | RC Link TX 仲裁唤醒 |
| DataArrived | src/dst_chip, cmd_id, threads, op_type, data_bytes | 事务完成通知 CDMA |
| TcreditArrived | chip_id, from_chip, from_thread | tcredit 到达 |
| RetryTimeout | chip_id, dst, qp_id | Go-Back-N 重传超时 |
| CnpReceived | chip_id, from_chip, qp_id | 拥塞通知(预留) |
仿真组装流程
验收标准
精度目标
| 场景 | 消息范围 | 目标 RMSPE |
|---|---|---|
| 单层 8-GPU Ring AllReduce | > 64 MB | < 15% |
| 双层 16-GPU Ring AllReduce | > 64 MB | < 30%(ECN→CC 闭环前) |
| P2P Send/Recv | > 1 MB | < 10% |
功能验证
| 场景 | 预期行为 |
|---|---|
| Ring AllReduce N=4 | 6 步串行,总指令 24 条 |
| P2P 包级全链路 | tcredit → Send → ACK → DataArrived |
| CBFC credit 耗尽 | Slot 阻塞等待 CreditReturn |
| Go-Back-N | NAK → WaitAck → WaitGrant 回退 |
| Switch 多跳 | chip → switch → chip 正确转发 |
未来演进
| 方向 | 说明 |
|---|---|
| ECN → CC 闭环 | CnpReceived 事件已预留,实现 DCQCN 调速 |
| NVLS 算法 | NVSwitch 网内 AllReduce,步数从 2(N-1) 降到 2 |
| 动态集合通信选择 | 根据消息大小自动选择 Ring/Tree/NVLS |
实现备注
本节记录 spec 与实际实现的偏差。
- [2026-04-08] 仿真核心已用 Rust 实现,通过 PyO3 暴露接口。Python 侧仅保留适配层和路由预计算。
- [2026-04-08] 路由由 Python
topo_routingDijkstra 预计算后传入仿真。 - [2026-04-08] DCQCN 调速框架已部分实现(CnpReceived、DcqcnTimeTimer 事件和 on_cnp/on_dcqcn_timer 回调),但未完整闭环。
- [2026-04-07] 初始 CBFC credit 硬编码为 1024。