跳到主要内容

互联通信G5仿真建模设计规格

版本: 1.2.0 状态: Draft 创建日期: 2026-03-31 最后更新: 2026-04-08

背景与目标

背景

数学模型(Alpha-Beta)以闭式公式计算集合通信延迟,适用于快速参数扫描,但无法建模链路排队争用、流控背压、多线程仲裁等硬件行为。本 spec 定义包级事件驱动通信仿真的设计——以 CDMACommand 为基本仿真单位,经 PAXI 事务层分段、RC Link 传输层打包后在 C2C 物理链路上逐跳传输。与数学模型互补:数学模型用于设计空间探索,包级仿真用于精确瓶颈分析和硬件验证。

目标

  1. 事件驱动仿真完整 Tier 6 通信栈:PAXICore → RC Link TX/RX → InterconnectTopology → Switch(可选)
  2. CDMA 多线程仲裁建模(RR 仲裁、Outstanding 流控、tcredit 握手)
  3. 集合通信算法展开为 CDMACommand 序列
  4. RC Link 完整协议建模:Slot 状态机、PSN 序列号、CBFC credit 流控、Go-Back-N 重传
  5. 支持 chip + switch 混合拓扑,路由由外部 Dijkstra 预计算
  6. 可选 Switch 模型(VOQ + iSLIP + Dynamic Threshold + ECN)

不涉及范围

  • Tier 3 核级计算模块(TIU/DMA/SDMA/HAU)
  • Tier 4 NoC 完整 flit 级仿真(当前简化为 BusModel)
  • Tier 5 D2D 互联建模(已在 BusModel 作为透明延迟叠加层实现)

术语

术语定义
CDMACommand跨芯片 DMA 指令,包级仿真的基本单位
PAXIProtocol of Accelerated eXchange Interconnect,芯片间互联协议的总称(含事务层 + 传输层)
PAXICorePAXI 事务层模块名,管理 W/R OST 和 MPS 分段。注:PAXI 指协议,PAXICore 指仿真中的事务层模块
RC LinkReliable Connection Link,PAXI 的传输层,提供可靠传输、CBFC 流控
SlotRC Link TX 的发送缓冲槽位,三态:Empty → WaitGrant → WaitAck
PSNPacket Sequence Number,12-bit 包序列号,per-(dst, QP_ID) 独立
QPQueue Pair,RC Link 通信端点
VCVirtual Channel,5 个有效通道:Bank0–3 + MUL
CBFCCredit-Based Flow Control,per-(dst, VC_ID) 的 credit 流控
OSTOutstanding Transaction,在途事务数上限
MPSMaximum Payload Size,事务层单次 burst 最大 4096B
VOQVirtual Output Queuing,交换机中消除 HOL 阻塞的队列结构
iSLIP交换机调度算法,多轮 Request-Grant-Accept
tcreditP2P 握手信号,RECEIVE 端发给 SEND 端确认就绪
write_doneSEND 端写完成后发给 RECEIVE 端的通知
FACKFast ACK,零字节包绕过 ACK MERGE 立即确认

通信栈架构

分层总览

模块职责

模块职责输入输出
集合通信展开将 AllReduce/P2P 等原语拆为每芯片的 CDMACommand 列表CommOpCDMACommand 序列
CDMA多线程指令调度,决定何时提交到 PAXICDMACommand提交请求 (dst, data_bytes, context)
PAXICore事务级管理,将大传输按 MPS 分段,追踪完成状态提交请求分段后的包列表(内部传递给 RC Link TX)
RC Link TX为每个包分配 Slot/PSN,VC 仲裁后打包发送包列表打包完成事件 (RcPackDone)
RC Link RXPSN 校验,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 端收到后才能开始数据传输:

  1. 目标芯片执行 Receive → 提交零字节包到 PAXI → 经完整协议栈传输
  2. RX 端收到零字节包 → FACK(绕过 ACK MERGE,立即 ACK)→ 事务完成 → TcreditArrived 事件
  3. 源芯片 CDMA 收到 tcredit → TCreditWait 线程转 Ready → 仲裁胜出后执行 Send
  4. 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_NSdatapath 带宽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_packetsacked_packets。每收到一个包的 ACK,acked_packets++。全部完成时:

  • 释放 OST
  • 根据 op_type 生成 DataArrived(Transfer/Send)或 TcreditArrived(Receive)事件

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
MPSMaximum Payload Size4096B
MAX_PAYLOADRC Link 最大包负载1344B

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权重分类
Bank01qp_id & 3 == 0
Bank11qp_id & 3 == 1
Bank21qp_id & 3 == 2
Bank31qp_id & 3 == 3
MUL256多播

仲裁决策流程

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 后:

  1. 检查重传计数是否超过 max_retry (15)
  2. 将该 (dst, qp_id) 所有 WaitAck Slot 回退到 WaitGrant
  3. push_front 到 VC 队列头部(优先重传)
  4. 重传计数 +1

另设 retry_timeout (50 μs):WaitAck 超时未收到 ACK,视同 NAK 处理。

RX 收包处理

ACK MERGE:需求驱动的累积 ACK 汇聚。收包时更新 max_contiguous_psn,轮询触发时生成一个 ACK 覆盖所有已收包。减少 ACK 包数量。

参数

参数含义默认值
TYPE1_OSTSlot 池大小512
HEADER_OVERHEAD每包头部50B
CREDIT_SIZECBFC 信用粒度256B
CREDIT_UF_LIMIT信用下限保留1
MAX_RETRYGo-Back-N 最大重传次数15
RETRY_TIMEOUT_NS重传超时50000
CC_WINDOW_NSRate Control 窗口1000
LENGTH_THR窗口内最大字节数86016
MERGE_DEPTHACK MERGE 深度64
POLL_CYCLE_NSACK MERGE 轮询周期4.0
CREDIT_RETURN_DELAY_NScredit 返还延迟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:

  1. Request:未匹配的 ingress 向有数据的 egress 发请求
  2. Grant:每个 egress 用 RR 指针选择一个 ingress
  3. Accept:每个 ingress 用 RR 指针接受一个 grant,更新双方指针

默认 2 轮迭代,8 端口下可达 ~99% 吞吐。时间槽 = frame_size / port_bandwidth。

优先级分类

流量类型优先级说明
tcredit / write_done3 (High)控制消息优先
allreduce / transfer2 (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
ALPHADT 系数2.0
ECN_KMIN / ECN_KMAXECN 阈值0.5 / 0.8
ISLIP_ITERATIONSiSLIP 迭代轮数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 分段按维度分组跨维度串行
P2P12Send + 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 路由匹配。


接口定义

事件类型

事件携带数据触发行为
CdmaWakechip_id触发 CDMA try_arbitrate()
RcPackDonechip_id, slot_idx, dst, wire_bytes, qp_id包打包完成,提交到 InterconnectTopology
C2CLinkDonesrc_chip, arrived_at_node, final_dst, slot/psn/txn/vc/ecn物理传输完成,按节点类型分派
SwitchTickswitch_idSwitch 执行 iSLIP 调度
AckMergePollchip_id, src_chip, qp_idRX 端 ACK 汇聚轮询
AckArrivedchip_id, from_chip, ack_psn, is_nak, qp_idACK/NAK 到达 TX 端
CreditReturnchip_id, from_chip, vc_id, countCBFC credit 返还
RcLinkWakechip_idRC Link TX 仲裁唤醒
DataArrivedsrc/dst_chip, cmd_id, threads, op_type, data_bytes事务完成通知 CDMA
TcreditArrivedchip_id, from_chip, from_threadtcredit 到达
RetryTimeoutchip_id, dst, qp_idGo-Back-N 重传超时
CnpReceivedchip_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=46 步串行,总指令 24 条
P2P 包级全链路tcredit → Send → ACK → DataArrived
CBFC credit 耗尽Slot 阻塞等待 CreditReturn
Go-Back-NNAK → 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_routing Dijkstra 预计算后传入仿真。
  • [2026-04-08] DCQCN 调速框架已部分实现(CnpReceived、DcqcnTimeTimer 事件和 on_cnp/on_dcqcn_timer 回调),但未完整闭环。
  • [2026-04-07] 初始 CBFC credit 硬编码为 1024。