G5 CDMA 建模设计规格
版本:1.6.0 状态:Accepted 创建日期:2026-04-21 最后更新:2026-06-01 作者:xiang.li 前置:互联通信G5仿真建模设计规格
变更历史
| 版本 | 日期 | 变更说明 |
|---|---|---|
| 1.6.0 | 2026-06-01 | 拆分 msg 同步指令体系到独立 spec,保留跨 chip 同步接口引用 |
| 1.5.0 | 2026-06-01 | 按 iforge-spec 规范重构文档结构(中文节名 / 名词定义 / 附录分层),设计语义不变 |
| 1.4.0 | 2026-05-19 | 新增指令流水化 inst_fifo + fence 同步语义 + fence_bit 集成字段,重写集合通信实现约束 |
| 1.3.0 | 2026-05-13 | 按 SG2262 CDMA spec v2.2 全面对齐硬件,新增硬件参数对照表 + 扩展数据指令族 + 原子指令族 |
| 1.2.0 | 2026-05-09 | 新增 multi-channel 拆分 + msg 指令体系 + 跨 chip 数据到达依赖 |
| 1.1.0 | 2026-04-29 | 新增 CDMA→PAXI 注入速率门控 + Transfer/Segment/Packet 数据分层 |
| 1.0.0 | 2026-04-21 | 初版:CHS/CFS 一致性模型、多 CDMAUnit 协调、Send/Receive 语义、仲裁机制、指令依赖与状态机 |
@tbl-spec-cdma-01 文档变更历史
概述
本 spec 定义 G5 仿真中 CDMA(Cross-Die DMA)的完整建模设计:硬件结构与线程模型、指令类型与依赖机制、CHS/CFS 内存一致性模型、仲裁与 datapath 调度、Send/Receive 握手协议、msg 同步指令体系、以及事件驱动的完整生命周期。CDMA 是 Tier 3 核级模块中负责跨芯片数据搬运的引擎,每个芯片包含多个 CDMAUnit,每个 CDMAUnit 含多个线程共享一个 datapath。
背景
总 spec 描述了 CDMA 的线程状态机和仲裁流程,缺少以下关键设计决策:
- CHS vs CFS 一致性模型:CHS 模式下线程不等远端 ACK 即可继续,CFS 模式下必须等 DataArrived,直接影响指令吞吐和有效延迟
- Send 的 datapath 提前释放:Send 发完数据后释放 datapath,bresp 收集独立进行,不阻塞其他线程
- CHS 下 Send 与 Transfer 的差异:CHS 只对 Transfer 触发 CdmaLocalComplete,Send 仍需等远端 ACK
- Receive 不消耗 Outstanding:影响 Outstanding 流控瓶颈的建模
- tcredit 池化机制:多个 tcredit 可积累,不是简单的二值信号
- 指令依赖模型(cmd_id_dep / sync_id):NO_DEP 特殊值、sync_id 更新时机
- 完成回调路径分类:on_remote_done / on_receive_done / notify_write_done 三种不同路径
- 事件驱动链路:从 CdmaWake 到完成的完整事件流
驱动力:CDMA 是仿真的指令发起层,其一致性模型决定指令级并行度,直接影响仿真吞吐预测。Send/Receive 是 P2P 通信的基础原语,tcredit 握手细节影响 P2P 延迟建模精度。
名词定义
下表钉死本 spec 用到的核心专有名词,后文统一语言。
| 名词 | 定义 | 与易混淆概念的区分 |
|---|---|---|
| CHS | post-write Hardware Sequence,硬件沿数据路径四级保序,Transfer 在本地 datapath 完成后即 retire,不等远端 ACK | 与 CFS 区别:CHS 由硬件保序对软件透明,CFS 需软件显式 Fence |
| CFS | Fence Sequence,Transfer/Send 必须等远端 ACK(DataArrived)才完成 | 见 CHS |
| tcredit | Receive 端发往 Send 端的传输信用,Send 仲裁前必须持有;硬件 CAM 池化,可积累 | 与 Outstanding 区别:tcredit 是跨 chip 配对许可,Outstanding 是本 Unit 并发上限 |
| OST (Outstanding) | 在飞事务并发上限,分三层:AXI burst OST(硬件物理上限 128 rd / 1024 wr512B / 512 wr256B)、CDMA 指令级 OST(MAX_OUTSTANDING,G5 默认 16 保守值)、PAXI 事务 OST(w_ost_limit=256)。三者粒度不同,详见硬件参数对照表 | Receive 不消耗 OST;tcredit 与 OST 是两套独立计数 |
| cmd_id | 每条指令的全局唯一递增 ID,由集合通信展开函数分配 | 与 sync_id 区别:cmd_id 是指令身份,sync_id 是线程进度 |
| sync_id | 每个队列维护,记录"最后一条已完成指令的 cmd_id" | sendq / rcvq 各维护一份,彼此不互推 |
| cmd_id_dep | 每条指令声明的前置依赖 cmd_id;u32::MAX 即 NO_DEP(无依赖) | 与跨 chip 数据到达依赖(remote_chip_id, remote_cmd_id)正交,AND 关系 |
| msg_central | 维护 (msg_id → accumulated_count) 状态的硬件单元,每 chip 4 个 × 256 slot = 1024;完整状态机与命名空间规则见 G5-CDMA-msg同步体系设计规格 | 与 tcredit CAM 区别:msg_central 是累计计数,tcredit 是配对许可 |
| QP_id | 提交到 PAXI/RC Link 的队列对 ID,等于 global_thread_id;G5 建模引入的跨层映射约定,非 SG2262 CDMA spec 原生字段 | per-(dst, qp_id) 的 PSN/DCQCN 实际为 per-(dst, thread) |
| Datapath | CDMAUnit 内全线程共享的数据通路,64 GB/s per CDMA unit,同一时刻只服务一个 Transfer/Send | 共享 datapath 意味着多线程不增带宽,仅掩盖延迟 |
| CDMAUnit | 一个 CDMA 物理单元,含 N 个 CDMAThread + 1 datapath + 1 仲裁器 + 1 OST 计数器 + 1 tcredit CAM | 聚合带宽靠多 CDMAUnit,不靠单 Unit 多线程 |
| CDMAThread | CDMAUnit 内一条指令流,含独立 sendq + rcvq 双队列、状态机、per-queue sync_id、pending_count | thread 是逻辑并发维度;SRAM bank 是物理切片,非逻辑队列 |
| Transfer | 将数据从本芯片写入目标芯片的基础数据指令,可带 msg_en/atm_en/reduce_en/compress_en | 与 Send 区别:Transfer 无需 tcredit,CHS 下本地 retire |
| Send | 配对发送指令,需先收到 tcredit 才能仲裁;自带 fence 语义,CHS/CFS 均等 DataArrived | 见 Transfer |
| Receive | 配对接收指令,提交零字节 tcredit 包给 Send 端;不消耗 OST | 不传输数据,不占 datapath |
| Fence | 线程内执行屏障,等本 thread pending_count==0 后完成 | 只等本 thread bresp,不等价"数据写入 receiver memory" |
| Segment | Transfer 按 MPS (4096B) 切出的分段,进入 PAXI segment_queue | 上一层是 Transfer,下一层是 Packet |
| Packet | RC Link TYPE1 报文,max_payload (1344B),带 PSN 需 ACK | 一个 Segment = M 个 Packet |
| sideband (write_done) | Send/Receive 协议中与数据 ACK 独立的 sideband 信号,receiver 收 last beat 后发 | 比数据 ACK 多一个 sideband round (RTT/2);集成 msg 依赖它 |
| WRR | Weighted Round-Robin,硬件 sendq 仲裁算法,每线程独立 weight + 三切换条件 | G5 Phase 1 用等权简单 RR 替代 |
| disp_fifo | datapath 入口最浅缓存,深度 1,单 cmd 占位 | 与 inst_fifo 区别:disp 是入口,inst 是内部流水 |
| inst_fifo | datapath 内部流水缓存,深度 4,允许 4 条 cmd 同时驻留不同流水级 | 见 disp_fifo |
| channel (multi-channel) | 一组独立集合通信实例,处理总数据 1/C 份,在 1 个 CDMA 上完整执行 | 与 num_chunks 正交:channel 是空间并行,chunk 是时间流水 |
| CHS/CFS 保序窗口 | 目标芯片侧保序链第 4 级,保证写入目标内存的顺序;含 32 组 base_addr_region | 仿真层不建模硬件配置(Non-Goal),假定软件正确配置 |
目标与非目标
目标:
- G1:定义 CHS/CFS 两种内存一致性模型及其对各指令类型的影响
- G2:定义四种指令类型的完整行为(资源消耗、状态变化、完成路径)
- G3:定义 Send/Receive 握手协议(配对规则、tcredit 池化、write_done 语义)
- G4:定义指令依赖模型(cmd_id_dep / sync_id / NO_DEP)
- G5:定义多 CDMAUnit 协调(线程映射、deferred wake、tcredit 广播)
- G6:定义事件驱动的完整生命周期(从 CdmaWake 到所有完成事件)
- G7:定义 CDMA→PAXI 注入速率门控(datapath 按 MPS 分段匀速提交到 PAXI,而非瞬间全量提交)
- G8:定义 multi-channel 并行策略(通过
num_channels配置生成多组独立集合通信实例,每个 channel 在 1 个 CDMA 上完整执行,利用多 CDMA 填满链路带宽) - G9: msg 同步指令体系 —— 详见 G5-CDMA-msg同步体系设计规格
- G10:定义 CDMA 指令流水化语义——指令切换不保证前置搬运完成(对齐 SG2262 spec 指令流水化段),datapath 流水化并发模型(inst_fifo 多笔 in-flight),fence 在流水化下作为本 thread 屏障的 pending_count 扣减规则与等待条件
- G11:定义软件 emit Fence 与 fence_bit 集成字段的契约——软件何时应当 emit Fence cmd(本 thread 同地址数据 hazard),fence_bit 作为硬件 decode 阶段等效展开的优化形式,collective 实现约束(所有跨 chip 同步必须走 write+msg 或 send/receive 路径,禁止依赖本 thread 本地 cmd 完成事件)
非目标:
- Tier 3 其他引擎(TIU/DMA/SDMA/HAU)的建模
- CDMA 到 PAXI 的 NoC 内部延迟(当前不建模,视为零延迟)
- 保序窗口硬件机制(CHS 硬件保序链的第 4 级,仿真中不涉及)
- Memory Protect 地址空间保护
- Bresp CAM 合并机制(PAXI 层行为,不在 CDMA 层建模)
用例说明
硬件结构概览
下图展示单个芯片内 CDMA 子系统的硬件结构,包含多个 CDMAUnit 和共享 GMEM 数据通路。各物理参数的硬件 spec 上限见 §详细设计 硬件参数对照表:
Send/Receive 握手的完整生命周期
下图展示一次 Send/Receive 配对从 tcredit 握手到数据传输完成的完整时序:
详细设计
硬件结构与线程模型
CDMAUnit 结构
每个 CDMAUnit 包含:
- N 个 CDMAThread:每个线程含独立的 sendq + rcvq 双指令队列、状态机、sync_id (per-queue)、pending_count。硬件上限 17(含 1 条对端发起请求线程)
- 1 个共享 Datapath:硬件物理带宽 = 64 GB/s per CDMA unit,同一时刻只能服务一个 Transfer/Send 指令;sendq 和 rcvq 共享此 datapath
- 1 个仲裁器:WRR (Weighted Round-Robin) 在 Ready 线程间选择(详见 仲裁机制)
- 1 个 Outstanding 计数器:所有线程共享,硬件上限取决于写宽度——128 读 / 1024 写 (512B) / 512 写 (256B)
- 1 个 tcredit CAM:硬件 32 深度,键为 (chipid, cdmaid);所有线程共享访问
具体配置值由 chip YAML 提供,G5 Phase 1 默认值与硬件物理上限的偏差见硬件参数对照表。
硬件参数对照表
硬件物理参数是仿真建模必须遵守的上限。下表对照 SG2262 硬件 spec 物理上限与 G5 仿真当前默认值,标注偏差类型(Phase 2 实现 roadmap 见附录 B 实现说明):
| 参数 | 硬件 spec 物理上限 / 值 | G5 Phase 1 默认 | 偏差类型 |
|---|---|---|---|
| Datapath 带宽 | 64 GB/s (per CDMA unit) | 64 GB/s | 一致 (无偏差) |
| Thread per CDMA | 17 (含 1 个对端发起请求 thread) | 16 (用户级) | 一致 (G5 暴露用户级 16,不建模 hw-internal 1) |
| Outstanding (rd) | 128 | 128 | 一致 (无偏差) |
| Outstanding (wr 512B) | 1024 | 1024 | 一致,按 cmd.data_bytes >= 512 动态选 |
| Outstanding (wr 256B) | 512 | 512 | 一致,按 cmd.data_bytes < 512 动态选 |
| tcredit 容量 | 32 深度 CAM per CDMA | 32 + back-pressure (重调度而非 drop) | 一致 |
| tcredit 键 | (chipid, cdmaid) | (chipid, cdmaid) | 一致 |
| Receive OST | 2 (第一条未退休时可发第二条 tcredit) | 2 + ReceiveOstWait | 一致 |
| sendq / rcvq 队列模型 | 双独立队列 per thread | 双队列 | 一致 |
| sys_tx / sys_rx | 两独立 msg 线程 | tx_threads + rx_threads | 一致 (Phase 2 collective 层不触发 sys_rx 路径) |
| msg 信号通道 | A4S 32-bit 独立接口 | A4S 模块独立 | 一致 (复用 c2c_net 物理链路,独立 link 占用计算) |
| msg cnt 字段宽度 | 7-bit (msg_send/wait) / 16-bit (RemoteMsgSend) | 入口 assert | 假设值(硬件 spec 跨版本未冻结,详见 msg 子 spec) |
| msg_id 形式 | absolute (RemoteMsgSend) / relative + base_id (msg_send/wait) | base_id_csr 字段 + absolute 解析 | 假设值(同上,详见 msg 子 spec) |
| msg_central 容量 | 4 central × 256 slot = 1024 | 入口 assert | 一致 |
| 仲裁算法 | WRR (weight 配置 + 三切换条件) | 简单 RR (weight 相等) | 简化 (无 msg-trigger-switch / fence-trigger-switch) |
| disp_fifo 深度 | 1 (datapath 入口) | 未建模 (单笔 busy_until 占用) | 缺失 (单笔 busy_until) |
| inst_fifo 深度 | 4 (datapath 内部流水) | 未建模 (无流水化) | 缺失 (无流水化) |
| cmd_queue 深度 | 64 (总入栈) | Vec 无上限 | 缺失 (无 back-pressure) |
| send/rcv_cmd_queue | 64 × 4-bank 各一份 | 无独立队列 | 简化 (并发分流缺失) |
| Scatter / Scatter2 / Gather 指令 | 完整指令含 descriptor + mask + 集成字段 | 缺失 (用 Transfer 模拟) | 简化 (MoE dispatch 缺失批处理) |
| RemoteAtomic 指令 | 完整指令 (start_pe + pe_step + pe_num + atomic_idx + s16_val) | 缺失 (用 RemoteMsgSend 近似) | 简化 |
| Transfer/Send 可选集成字段 | msg_en / atm_en / reduce_en / compress_en | 不支持 | 缺失 (wire bytes 压缩偏差 + 集成 msg 仲裁开销偏高) |
| write_done sideband | 与数据 ACK 独立,多 RTT/2 延迟 | 合并到 DataArrived | 简化 (Send/Receive 时序偏低) |
| base_addr_region | 32 组,region 31 保留 | 无概念 | Non-Goal (仿真层不涉及硬件配置) |
| 多余线程 PIO/DES | DES only | 无区分 | Non-Goal |
@tbl-spec-cdma-hw-vs-g5 硬件参数对照表:参数 / 硬件 spec / G5 Phase 1 / 偏差
OST 的三个层次:上表 Outstanding 行的 128/1024/512 是 AXI burst 层物理上限;参数表的
MAX_OUTSTANDING=16是 CDMA 指令级保守默认值(两者粒度不同,不冲突);§CDMA→PAXI 注入速率门控 (G7) 的w_ost_limit=256是 PAXI 事务层并发(源自 PAXI spec)。
spec 约束:实施层选择的默认值不得超过硬件物理上限。当 G5 默认值小于硬件上限时(如 OST 16 < 128),仿真器表现为偏保守(提前 stall);当大于硬件上限时(如默认值若误配为 80 GB/s 超过物理 64 GB/s),仿真结果偏快,必须修正。
线程到 Unit 的映射
unit_idx = global_thread_id / threads_per_cdma
local_thread_id = global_thread_id % threads_per_cdma
每芯片总 CDMAUnit 数 = max(cdma_spec.total_cdma_units, program.c2c_ports_per_chip)。当 c2c_ports_per_chip 超过配置值时自动扩展。
QP ID 映射
qp_id = global_thread_id。提交到 PAXI/RC Link 时,qp_id 直接使用线程 ID,使得 per-(dst, qp_id) 的 PSN 空间和 DCQCN 状态实际上是 per-(dst, thread)。QP 是 RC Link/RDMA 层概念,SG2262 CDMA spec 无此名词;此映射是 G5 建模的跨层约定。
指令类型
CDMA 完整指令集分为四组:基础数据指令、msg 同步指令、扩展数据指令、原子指令。下表列出全部指令及其 G5 实施状态:
| 指令 | 用途 | 方向 | 范围 |
|---|---|---|---|
| 基础数据指令 | |||
| Transfer | 将数据从本芯片写入目标芯片 (含 msg_en / atm_en / reduce / compress 可选字段) | src → dst | 基础 / Phase 1 |
| Send | 配对发送(需先收到 tcredit) | src → dst | 基础 / Phase 1 |
| Receive | 配对接收(发送 tcredit 给 Send 端) | dst → src(零字节 tcredit) | 基础 / Phase 1 |
| Fence | 线程内执行屏障 | 无数据传输 | 基础 / Phase 1 |
| msg 同步指令 (详见 G5-CDMA-msg同步体系设计规格) | |||
| MsgSend | 向本 chip msg_central 累计指定 msg_id 的 send_cnt | 无 wire 传输 | Phase 1 |
| MsgWait | 阻塞 thread 直到本 chip msg_central 中 msg_id 累计达 wait_cnt | 无 wire 传输 | Phase 1 |
| RemoteMsgSend | 向远端 chip(s) 的 msg_central 累计 msg_id | src → dst(s)(msg packet) | Phase 1 (pe_num=1 单点) / Phase 2 (pe_num>1 群发) |
| 扩展数据指令 (详见 扩展数据指令族) | |||
| Scatter | 按 descriptor 链表向多个目标地址离散写入 (dst_list 可跨多 chip) | src → dst(s) | Phase 2 |
| Scatter2 | 按 start_pe + pe_step + pe_num 群发离散写入 (PE 范围版 Scatter) | src → pe_num × dst | Phase 2 |
| Gather | 按 descriptor 链表从远端多源聚合 | src(s) → dst | Phase 2 |
| 原子指令 (详见 原子指令族) | |||
| RemoteAtomic | 按 start_pe + pe_step + pe_num 向远端 atomic 索引发起 atomic_add | src → pe_num × dst | Phase 2 |
@tbl-spec-cdma-02 指令类型:指令,用途
msg 三种指令的详细语义、msg_central 状态机、msg packet 传输契约见 G5-CDMA-msg同步体系设计规格。扩展数据指令与原子指令的详细语义见扩展数据指令族与原子指令族。基础数据指令(Transfer / Send)的可选集成字段(msg_en / atm_en / reduce_en / compress_en)的语义见基础数据指令的可选集成字段。
指令依赖模型
cmd_id 与 sync_id
- cmd_id:每条指令的全局唯一递增 ID,由集合通信展开函数分配
- sync_id:每个线程维护,记录"最后一条已完成指令的 cmd_id"
- cmd_id_dep:每条指令声明的前置依赖。值含义:
cmd_id_dep == u32::MAX (NO_DEP):无依赖,立即可执行cmd_id_dep <= sync_id:依赖满足,可参与仲裁cmd_id_dep > sync_id:依赖未满足,线程留在 Idle
依赖检查流程
线程在 Idle 状态下尝试获取下一条指令时,需通过依赖检查确认前序指令已完成:
sync_id 更新时机
sync_id 在指令"完成"时更新为该指令的 cmd_id。不同指令的完成时机不同:
| 指令 | CHS 模式完成时机 | CFS 模式完成时机 |
|---|---|---|
| Transfer | CdmaLocalComplete (datapath_end + 5ns) | DataArrived (远端 ACK) |
| Send | DataArrived (远端 ACK) | DataArrived (远端 ACK) |
| Receive | on_receive_done (tcredit ACK 到达远端) | on_receive_done |
| Fence | pending==0 时立即完成 | pending==0 时立即完成 |
@tbl-spec-cdma-03 sync_id 更新时机:指令,CHS 模式完成时机
Phase 1 偏差:上表 CHS Transfer 行的 CdmaLocalComplete (datapath_end + 5ns) 是 Phase 2 目标语义;G5 Phase 1 实际在 PAXI on_remote_done(远端 ACK)推进,影响本 thread Transfer 链的串行化程度,详见附录 B 实现说明。
注意:CHS 下只有 Transfer 触发 CdmaLocalComplete,Send 仍需等 DataArrived。设计依据:Send 自带 fence 语义(见 §CHS/CFS 内存一致性模型)。
跨 chip 数据到达依赖
集合通信算法(如 Ring AR/AG/RS)需要在 chip A 完成发送给 chip B 的数据后,触发 chip B 上后续指令的执行。CDMA 指令模型支持除同 chip cmd_id_dep 之外的"跨 chip 数据到达依赖":
- 一条指令可声明依赖另一 chip 上某个 cmd 完成事件(形式:(remote_chip_id, remote_cmd_id) 元组引用)
- 依赖满足条件:本 chip 收到来自 remote_chip_id 的 remote_cmd_id 同步信号到达事件
- 与同 chip cmd_id_dep 是 AND 关系:两个依赖都满足才能进入 Ready
跨 chip 依赖的接收方状态在 chip 范围内有效(所有 unit 共享),与同 chip cmd_id_dep 的 per-thread sync_id 不同。
物理映射(SG2262 硬件):SG2262 硬件提供两条跨 chip 同步路径:
| 同步路径 | 指令组合 | 同步触发机制 |
|---|---|---|
| send/receive 协议 | CDMA_send + CDMA_receive | sender 数据写完毕后自动写一笔 write_done sideband 信号到 receiver cdma,receiver Receive 指令通过 write_done 退休 |
| write + 显式 msg 指令 | CDMA_write + CDMA_remote_msgsend + CDMA_msg_wait | CDMA_write 不带自动同步("芯片间同步应由软件中断完成");需通过独立的 CDMA_remote_msgsend 向远端 msg_central 发同步信号,receiver CDMA_msg_wait 等待 msg_central 上的 message_id 累计达到 wait_cnt |
仿真器实现跨 chip 依赖时需对应两条硬件路径之一。CDMA_write 本身不应自动触发对端同步事件——这是 SG2262 硬件设计约束。
collective 实现约束
集合通信算法在跨 step 数据依赖结构上分为两类,对跨 chip 同步路径的要求不同。
跨 step 数据依赖型
step k 发出的数据依赖 step k-1 从远端接收的数据(数据传染形态)。包括:
- Ring AllReduce / AllGather / ReduceScatter(每 step 转发 reduce / gather 结果)
- Recursive Halving-Doubling / Recursive Doubling(每 round 交换累加结果)
- Bruck AllToAll(step j+1 打包 step j 收到的 reroute chunks)
- Hierarchical 各层若采用上述算法的 collective
此类算法必须采用上表两条硬件同步路径之一表达跨 chip 数据到达依赖:
- send/receive 协议(CDMA_send + CDMA_receive 自带 write_done sideband)
- write+msg 三指令组合(CDMA_write + CDMA_remote_msgsend + CDMA_msg_wait)
禁止依据"本 chip 上一 Transfer 完成"作为跨 chip 到达语义:
- 本 chip Transfer 的 sync_id 推进(CHS 模式下 CdmaLocalComplete 或 CFS 模式下 DataArrived)表达的是本 chip 视角的完成事件
- CHS 模式下 CdmaLocalComplete 仅表示本 chip datapath 释放,数据可能仍在 wire 上未到 receiver
- 即使 CFS 模式下 DataArrived 表示远端 ACK,receiver 上的后续指令也需要通过 msg_central 或 receive 配对机制感知到达,仅靠 sender 端 sync_id 无法触达
算法层独立型
每个 transfer 发出的数据事先在本 chip 内存中准备好,与之前任何 step 接收的数据无关。包括:
- Pairwise AllToAll:第 $r$ 轮 chip $i$ 发往 $(i+r)\bmod N$ 的 chunk $c[i][(i+r)\bmod N]$ 在 collective 开始前已在 chip $i$ 内存中就绪(参见 集合通信文档 算法一)。$N(N-1)$ 个 transfer 在算法层互相独立,可任意顺序、任意并发 dispatch
- Ring AllToAll:与 Pairwise 等价的 chunk 调度,仅路径走 Ring 拓扑相邻链路(参见 集合通信文档 算法二)
此类算法不要求 step 间跨 chip 数据到达同步——每个 Transfer 可独立 dispatch(cmd_id_dep = NO_DEP),由 hardware 层多 CDMA 并发处理以饱和链路带宽。但 collective 完成时需要 end-of-collective barrier(由调用方保证:等所有参与 chip 的所有 transfer 数据到达 receiver memory,可通过最终 Fence 或 collective 结束时的 sync_id 全员对齐实现)。
典型反例
| 算法 | 错误做法 | 后果 |
|---|---|---|
| Bruck AllToAll | 各 step 间只用同 thread 内 cmd 完成依赖(本 chip 视角),未声明跨 chip 数据到达依赖元组 | step j+1 发送的数据依赖 step j 远端写入本 chip,仅靠同 thread 完成依赖无法感知远端到达 |
正确实现:
- 跨 step 数据依赖型 collective 每个跨 chip 数据传输由 MsgWait + Transfer + RemoteMsgSend 三指令组合表达(Transfer 在指令字段中声明跨 chip 数据到达依赖元组 (remote_chip_id, remote_cmd_id));或
Send + Receive配对 - 算法层独立型 collective 直接 emit Transfer(
cmd_id_dep = NO_DEP)即可,由 multi-CDMA 并发饱和链路带宽;spec 公式 $\href{/interconnect/集合通信/all-to-all}{\text{(4.106)}}$ $(N-1)\alpha + (N-1)M/(N\beta)$ 描述的是该形态的 latency 极限
线程状态机
每个 CDMA 线程在以下状态间转换,Idle 为初始态:
Receive 和 Fence 的特殊路径:这两种指令不进入 Executing 状态。Receive 提交零字节包后直接回到 Ready(有后续)或 Idle(无后续)。Fence 根据 pending_count 进入 FenceWait 或直接完成。
仲裁机制
CdmaWake 触发仲裁
CdmaWake 事件触发后,遍历芯片上所有 CDMAUnit 执行仲裁:
关键仲裁规则
- Transfer/Send 独占 datapath:执行后立即 break,一次仲裁最多服务一个数据传输指令
- Receive/Fence 不占 datapath:执行后 continue,同一轮仲裁可连续处理多个 Receive/Fence
- Outstanding 是全 Unit 共享的:一个 Unit 的 outstanding 达到上限,该 Unit 所有线程都被阻塞
- RR 指针在每次 select_ready_thread 调用时前进:即使未选中也前进,确保公平性
硬件 WRR 仲裁与 G5 简化
SG2262 硬件 sendq 仲裁采用 WRR (Weighted Round-Robin),每个线程有独立的 weight 计数器(软件配置)。当前优先级保持不变,直到下列三条件之一触发优先级切换:
| 切换条件 | 触发动作 |
|---|---|
| weight 耗尽 | 当前优先级线程的 weight 计数器递减到 0,切换到下一优先级 |
| msg 指令 a4s 发出 | 当前线程的 msg 指令通过 A4S 接口发出(注意:是 a4s 发包,不是 retire),立即切换优先级 |
| fence 指令 | 当前线程的 fence 指令到达,且 rcvq 已空(receive 全部完成),切换优先级 |
msg-trigger-switch 的设计目的:让 msg 同步成为线程切换点,避免一个线程长期独占 datapath 阻塞其他线程的 msg 通信。
G5 Phase 1 用等权简单 RR 替代 WRR(详见附录 B 实现说明)。
指令流水化 inst_fifo
硬件 datapath 在 idu 输出后含两级 fifo 流水(SG2262 CDMA spec 设计目标):
- disp_fifo:深度 1,硬件层 datapath 入口最浅缓存,单 cmd 占位
- inst_fifo / inst_info_fifo:深度 4(datapath 内部),允许 4 条 cmd 同时驻留在 datapath 不同流水级
注:硬件层 inst_fifo 深度方案 SG2262 spec 自身未冻结(原文为"考虑做成指令流水形式")。本节 depth 4 取自项目 spec 假设值,待硬件 spec 确认后修订。
流水化并发模型
datapath 接受同时在飞的 cmd 数上限为 inst_fifo_depth = 4。背靠背 cmd 入栈的语义:
| cmd 进入时机 | 约束 |
|---|---|
| disp_fifo 入栈 | 上一笔 disp_fifo 中的 cmd retire 后才允许下一笔入栈 |
| inst_fifo 入栈 | inst_fifo 中在飞 cmd 数 < inst_fifo_depth 时允许 |
| cmd retire | 该 cmd 在 datapath 的最后一笔请求发出后,对应 fifo 槽位释放 |
指令切换不保证前置搬运完成(对齐 SG2262 spec 指令流水化段):sync_id 推进时机由 sync_id 更新时机表格定义——CHS 模式下 Transfer 在 datapath 完成时刻(CdmaLocalComplete = datapath_end + 5ns)推进,不等远端 bresp 收齐。后续 cmd 的 cmd_id_dep 满足条件按 sync_id 推进时机判断,因此 inst_fifo 内可同时驻留多条已 sync_id 推进但 bresp 未收齐的 Transfer。
与 fence 的协同语义
fence 与流水化协同工作如下:
- fence 进入仲裁路径时(无论独立 Fence 指令或
fence_bit集成字段触发):- inst_fifo / disp_fifo 中所有在飞 cmd 必须 retire 完毕(其 sync_id 已推进),且本 thread 所有 pending 写类操作的完成事件已收齐(pending_count == 0)后,fence 才完成
- pending_count 的扣减时机由 sync_id 更新时机表定义:CHS 模式下 Transfer 在 CdmaLocalComplete 时扣减(bresp 与后续写的保序由保序窗口硬件承担,fence 不重复等 bresp),Send 仍需 DataArrived(bresp 收齐才扣减);CFS 模式下所有写类 op 均在 DataArrived(bresp 收齐)时扣减
- fence 阻塞本 thread,不阻塞 datapath 自身——其他 thread 的 cmd 可继续进入 inst_fifo
- fence 完成后,本 thread 后续 cmd 可重新进入 inst_fifo 流水
G5 Phase 1 用单一 datapath_busy_until_ns 表示 datapath 占用,不建模 inst_fifo 流水(详见附录 B 实现说明)。
指令队列深度
硬件层 CDMA 指令前端含独立的 cmd_queue (per-thread 实例):
| 队列 | 物理参数 | 用途 |
|---|---|---|
| cmd_queue | depth 64 × width 128 | 总入栈队列,接收所有指令类型 (单读单写场景) |
| send_cmd_queue | depth 64 × width 128 × SRAM 4-bank | 分流后的 send 类指令 (sendq) |
| rcv_cmd_queue | depth 64 × width 128 × SRAM 4-bank | 分流后的 receive 类指令 (rcvq) |
sendq / rcvq 在执行层的并发模型与 msg_id 命名空间见 G5-CDMA-msg同步体系设计规格 §sendq / rcvq 双队列模型。本节聚焦队列物理实现(深度、bank 切片),执行层语义不重复展开。
bank 语义 (SRAM 物理切片,非逻辑并发队列)
send_cmd_queue / rcv_cmd_queue 的 "bank 4" 是 SRAM 物理实现细节 — 单端口 SRAM 一个周期只能服务 1 个读或 1 个写,写端 (cmd_queue 写入) + 读端 (WRR 仲裁器读取) 同周期访问需要 ≥2 物理 bank 交错避免端口冲突。4-bank 是更宽裕配置,业界主流 multi-bank SRAM FIFO 即此设计。
逻辑上 send_cmd_queue / rcv_cmd_queue 是单 FIFO,bank 间交错由 SRAM controller 处理,对上层透明。WRR 仲裁器看到的是线程级单 FIFO 队列头,不感知 SRAM bank。
cmd 进入 sendq 的逻辑分组是线程 (thread) 维度(每个线程一个独立的 cmd_buff = 1 个 cmd_queue + 1 个 send_cmd_queue + 1 个 rcv_cmd_queue):输入由软件配置地址决定指令进入哪个线程的 cmd_buff,同一线程的 cmd 在 send_cmd_queue 内严格 FIFO 保序。
cmd 之间的依赖语义(同 thread cmd 完成依赖 / 跨 chip 数据到达依赖元组 (remote_chip_id, remote_cmd_id))由 thread 级 sync_id 推进保证,不下沉到 SRAM bank 层。
simulation 层每个线程的 sendq 与 rcvq 各用一条 VecDeque<CDMACommand> 独立建模(双队列模型,详见附录 B / 附录 C)。
Datapath 时序模型
时间计算
datapath 占用时间由以下公式定义(CHS / CFS 模式下的时序对比见 §CHS vs CFS 时序对比):
$$\begin{equation} T_{\text{startup}} = \text{STARTUP\_LATENCY\_NS} \label{eq:cdma-startup-latency} \end{equation}$$ $$\begin{equation} T_{\text{transfer}} = \text{data\_bytes} / \text{BANDWIDTH\_BYTES\_PER\_NS} \label{eq:cdma-transfer-time} \end{equation}$$ $$\begin{equation} T_{\text{ready\_at}} = \text{now} + T_{\text{startup}} \label{eq:cdma-ready-at} \end{equation}$$ $$\begin{equation} T_{\text{datapath\_end}} = T_{\text{ready\_at}} + T_{\text{transfer}} \label{eq:cdma-datapath-end} \end{equation}$$- datapath 在 [ready_at, datapath_end] 期间忙,其他线程不可使用
- PAXI 注入速率门控 (G7):数据不是在 ready_at 瞬间全量提交给 PAXI,而是按 MPS (4096B) 分段,以 CDMA 带宽 (bandwidth_bytes_per_ns) 为速率匀速注入。具体机制见下方 "CDMA→PAXI 注入速率门控" 一节
STARTUP_LATENCY_NS / BANDWIDTH_BYTES_PER_NS 等魔数取值见 §详细设计 参数;魔数来由见附录 B 实现说明。
CHS vs CFS 时序对比
同一笔 Transfer 在两种一致性模式下的时序差异:
注入速率门控说明:CDMA datapath 以 64GB/s (=64 bytes/ns) 从 GMEM 读数据并推送给 PAXI。8192B 数据被拆为 2 个 MPS 段 (4096B/段),段间间隔 = 4096/64 = 64ns。第一段在 ready_at=200ns 提交,第二段在 264ns 提交。PAXI 收到每个段后独立做 RC Link 封包和传输。
CHS/CFS 内存一致性模型
CHS (post-write Hardware Sequence)
CHS 模式下,硬件沿数据路径每一级保证请求处理顺序不被打乱。四级硬件保序链:
| 级别 | 环节 | 保序行为 |
|---|---|---|
| 1 | CDMA | 按指令顺序发出写请求 |
| 2 | MAC | MAC 接收请求后按序传递给下游 |
| 3 | Switch | 同 src macid + 同 dst macid + 同 hash 的报文严格保序 |
| 4 | 目标芯片 | 保序窗口保证写入目标内存的顺序 |
@tbl-spec-cdma-04 CHS (post-write Hardware Sequence):级别,环节
仿真行为:Transfer 指令在 datapath 完成后 + 5ns 触发 CdmaLocalComplete 事件,调用 on_remote_done(),更新 sync_id,释放 outstanding。线程立即可仲裁下一条指令,不等待 DataArrived。(此为 Phase 2 目标语义;G5 Phase 1 实际在 PAXI on_remote_done 远端 ACK 推进,见附录 B。)
CHS 对 Send 的特殊处理:Send 指令不触发 CdmaLocalComplete,即使在 CHS 模式下。设计原因:Send 自带 fence 语义(设计文档明确规定 "send 指令自带 fence 功能:必须收集所有 bresp 后才能 retire"),CHS 下虽然 bresp 为 early resp(收集很快),但 Send 仍需在 bresp 收齐后发送 write_done,再等 write_done 的 bresp 返回才能 retire。CHS 下 write_done 与前置 write_send 的保序由保序窗口硬件保证。
网络约束:CHS 要求同 (src, dst, hash) 的报文走相同路径,不支持 ECMP 多路径。仿真中使用预计算单路径路由,天然满足此约束。
CFS (Fence Sequence)
CFS 模式下,Transfer/Send 指令必须等待远端 ACK(DataArrived 事件)才完成。线程在 DataArrived 到达后调用 on_remote_done(),更新 sync_id,释放 outstanding。
对比总结
| 行为 | CHS | CFS |
|---|---|---|
| Transfer 完成时机 | datapath_end + 5ns (本地) | DataArrived (远端 ACK) |
| Send 完成时机 | DataArrived (远端 ACK) | DataArrived (远端 ACK) |
| Transfer 有效并行度 | 高(线程快速回收) | 低(等 RTT) |
| Outstanding 占用时间 | Transfer:短;Send:长 | 均长 |
@tbl-spec-cdma-05 对比总结:行为,CHS
四种指令的完整行为
Transfer
Transfer 指令的执行流程:从仲裁胜出到数据分段提交 PAXI:
Send
Send 指令在仲裁胜出后先消耗 tcredit,再执行数据传输:
Receive
Receive 指令不传输数据,仅向 PAXI 提交零字节请求触发 tcredit 发送:
Fence
Fence 指令等待当前线程所有 pending 操作完成后才继续:
pending_count 扣减时机:流程图节点 E 的 "递减 pending" 触发点由 sync_id 更新时机表定义——CHS 模式 Transfer 在 CdmaLocalComplete 时扣减(bresp 与后续写的保序由保序窗口承担),CHS Send 仍需 DataArrived(bresp 收齐),CFS 模式所有写类 op 均在 DataArrived 时扣减。流程图统一表达 "pending_count == 0 才完成",扣减点的差异不在图上展开。
软件 emit Fence 触发条件
Fence 是软件可见的同步原语,硬件 decode 不会自动插入。软件(mapping / collective 展开层)需在以下场景显式 emit Fence cmd 或在前序数据指令上启用 fence_bit 集成字段:
| 触发场景 | 说明 |
|---|---|
| 同 thread 同地址 W→R 依赖 | 本 thread 内连续两条数据指令,cmd2 读取 cmd1 在本 chip 写过的地址。指令切换不保证前置搬运完成(SG2262 spec 指令流水化段),cmd2 读可能拿到旧数据 |
| 同 thread 同地址 W→W 依赖 | 本 thread 内连续两条写同一本 chip 地址的数据指令,需保证最终值由后写决定。datapath 流水化下两次写可能乱序提交到 DDR |
| 同 thread 同地址 R→W 依赖 | 本 thread 内 cmd1 读本 chip 地址,cmd2 写同地址。需保证 cmd1 读完成(数据已搬出)后 cmd2 才写 |
| CFS 模式下软件保序点 | CFS 模式(non-post-write)下软件需在保序位置插 Fence。CHS 模式由硬件保序窗口承担,软件不需插 Fence |
| sendq / rcvq 队列间同步 | sendq 与 rcvq 物理上并行执行,需用 msg 或 Fence 同步(nop 为 SG2262 硬件保留指令,G5 Phase 1 不建模)。优先用 msg 表达跨队列事件依赖,Fence 用于本队列内同步 |
反例(不应 emit Fence 的场景,避免误用):
| 误用场景 | 正确机制 | 理由 |
|---|---|---|
| 等远端 chip 数据到达本 chip | 走跨 chip 数据到达依赖(write+msg 或 send/receive) | Fence 仅等本 thread 的 bresp,bresp 表达"wire 离开 sender",不等价"数据写入 receiver memory" |
| 跨 chip collective 各 step 间屏障(Ring / Bruck 等跨 step 数据依赖型) | 走跨 chip 数据到达依赖 collective 实现约束 | 同上 |
| 同 thread 不同地址的连续 Transfer(无数据依赖) | 不需要任何同步 | datapath 流水化下两条 Transfer 可并发,无正确性问题 |
fence_bit vs 独立 Fence 的选择:
- 优先使用
fence_bit集成字段(数值等价但省一次指令仲裁开销,SG2262 CDMA spec fence-bit 译码段 硬件设计意图) - 独立 Fence cmd 适用于以下场景:
- 多条前序数据指令的共同屏障(fence_bit 仅依附单条指令)
- 跨指令族屏障(如 Send + Transfer 后统一屏障)
- sendq / rcvq 队列间同步(Fence 是双队列共享的同步原语,fence_bit 仅作用于本指令所在队列)
软件 emit Fence 的判定责任层
[NEEDS CLARIFICATION: mapping 层是否做 hazard 检测(W-R / W-W / R-W 同地址依赖扫描自动 emit Fence),还是由 collective / 算子展开层根据算法语义显式 emit。前者通用但实现重,后者简单但要求每个展开实现负责。当前 G5 collective 全部使用跨 chip 数据到达依赖路径,无本 thread 同地址依赖场景,因此该问题在 Phase 1 可暂不裁定,待 mapping 层出现本 thread 同地址依赖场景时回头确认。]
基础数据指令的可选集成字段
Transfer / Send / Scatter 等数据指令在硬件 spec 中含一组可选集成字段,使数据传输完成时附带同步、原子加、压缩、归约等次级动作。这些字段是数据指令字段集的一部分,启用时不消耗独立指令周期。
| 字段 | 启用时行为 | 互斥关系 |
|---|---|---|
msg_en | 数据指令尾 beat 触发 1 次 RemoteMsgSend (idx 16-bit absolute, val 16-bit send_cnt). 详见 G5-CDMA-msg同步体系设计规格 §write + 内嵌 msg_en 集成路径 | 与 atm_en 互斥 |
atm_en | 数据指令尾 beat 触发对端 atomic_add (idx 16-bit, val 16-bit 加数). 详见原子指令族 | 与 msg_en 互斥 |
reduce_en | 启用 ARE Reduce:数据写入前与 receiver 端已有数据按 reduce_op (SUM / PROD / MAX / MIN / MAC) 归约,可选 psum_op (WO 覆盖 / RW 读改写) 和 const_scale | 与 compress_en 独立 |
compress_en | 启用 CPS Compress:数据按 compress_dtype (INT8 / FP6E3) 压缩后上 wire,实际 wire bytes 减少 | 与 reduce_en 独立 |
fence_bit | 数据指令完成后,本 thread 进入 FenceWait 等本 thread 所有前置写类操作的完成事件收齐(pending_count == 0)。硬件 decode 阶段 (SG2262 CDMA spec fence-bit 译码段) 等效展开为"该数据指令 + 独立 Fence"两条 micro-op,省独立 Fence 指令的额外仲裁开销 | 见下方 NEEDS CLARIFICATION(与 msg_en / atm_en 同时启用时的时序) |
reduce_en + compress_en 同时启用时,顺序为:先 compress wire 传输,receiver 解压后 reduce 写入。这种组合下 wire 带宽节省与 reduce 计算 overlap。
fence_bit 适用于 Transfer / Send / Scatter / Scatter2 / Gather / RemoteAtomic 等非 sys/fence/send 类指令——sys/fence/send 指令默认携带 fence 语义(SG2262 CDMA spec fence 语义段),不需要 fence_bit。
[NEEDS CLARIFICATION: fence_bit 与 msg_en / atm_en 同时启用时的时序——硬件 spec 未明示。推荐语义:msg_en/atm_en 触发时机在数据指令尾 beat(数据写入瞬间触发对端事件),fence_bit 等本 thread bresp 收齐让本 thread 后续 cmd 继续,两者作用于不同时刻,可同时启用。待硬件 spec 确认。]
扩展数据指令族
Scatter (Phase 2)
按 descriptor 链表向多个目标地址离散写入。每个 descriptor 含 dst_addr + bytes (+ 可选 dst_chipid)。
| 维度 | 语义 |
|---|---|
| 字段 | descriptor 链表地址 (本地),表项数 N,可选 msg_en/atm_en/reduce_en/compress_en, pe_group_mask + pe_group_size (group 形式) |
| 链表存储 | 必须存在本地芯片,不支持 FP20 数据格式 |
| msg 触发 | 启用 msg_en 时,每完成一个 descriptor 传输触发一笔 msg send (N 个 descriptor 触发 N 笔 msg) |
| 完成时机 | 所有 descriptor 数据 ACK 收齐后 |
Scatter2 (Phase 2)
PE 范围版 Scatter,用 start_pe + pe_step + pe_num 寻址而非 descriptor 链表。
| 维度 | 语义 |
|---|---|
| 字段 | start_pe, pe_step, pe_num, dst_addr, bytes,可选 msg_en/atm_en/reduce_en/compress_en, pe_group_mask + pe_group_size |
| 行为 | 对每个目标 chip[k] = (start_pe + k × pe_step) % num_chips (k ∈ [0, pe_num)),写入相同数据到 dst_addr(% num_chips 为仿真层 chip_id 环绕约定,硬件伪代码无取模) |
| 完成时机 | 所有 pe_num 个目标 ACK 收齐后 |
Gather (Phase 2)
按 descriptor 链表从远端多源聚合数据到本地。
| 维度 | 语义 |
|---|---|
| 字段 | descriptor 链表地址 (本地),表项数 N,每项含 src_chipid + src_addr + bytes |
| 链表存储 | 必须存在本地芯片,不支持 FP20 数据格式 |
| 完成时机 | 所有 descriptor 远端读+本地写完成后 |
原子指令族
RemoteAtomic (Phase 2)
按 PE 范围向远端 atomic 索引发起 atomic_add 操作。
| 维度 | 语义 |
|---|---|
| 字段 | start_pe, pe_step, pe_num, atomic_idx (索引),s16_val (16-bit 有符号加数) |
| 行为 | 对每个目标 chip[k] = (start_pe + k × pe_step) % num_chips,通过 A4S 接口向远端 atomic 单元发起 atomic_add(atomic_idx, s16_val)(% num_chips 为仿真层 chip_id 环绕约定,硬件伪代码无取模) |
| 完成时机 | fire-and-forget (本 chip 视角);远端按 atomic 操作排队执行 |
| pe_num 上限 | 1024 chip |
Transfer / Scatter 集成 atomic
数据指令字段 atm_en = 1 时,尾 beat 触发对端 atomic_add. 字段:
atomic_idx: 16-bit, atomic 单元索引atomic_val: 16-bit 有符号加数
与独立 RemoteAtomic 等价 (数值上累加一次),节省独立指令仲裁开销。同一数据指令 msg_en 与 atm_en 互斥 (硬件二选一)。
write_done sideband 时序模型
SG2262 send/receive 协议中,write_done 是与数据 ACK 独立的 sideband 信号:
| 信号 | 触发时机 | 路径 | 用途 |
|---|---|---|---|
| 数据 ACK | wire 上数据 packet 写完成 | PAXI VC | 通知 sender outstanding 释放 |
| write_done sideband | receiver 收到 last beat 后 (last = 1) | 独立 sideband 信号 | 通知 sender 端 CDMA,触发第二次跨 chip 写 (例如 message center) |
时序上 write_done 比数据 ACK 多一个 sideband round (硬件 RTT/2 量级)。集成路径 (msg_en / atm_en) 的 msg 信号触发依赖 write_done 而非数据 ACK;独立 RemoteMsgSend / RemoteAtomic 不依赖 write_done (走 A4S 独立路径)。
地址保序窗口
SG2262 硬件提供 32 组 base_addr_region (region 0..31) 用于地址级保序监测:
| 字段 | 用途 |
|---|---|
| base_addr_region 0..30 | 软件可配置的地址范围,用于将特定地址(如 message center)列入保序窗口,确保数据写完成后再触发后续 msg 信号 |
| base_addr_region 31 | 保留,不允许配置 (硬件强制保持全 0) |
集成路径 (msg_en / atm_en) 的保序前提是数据指令的 dst_addr 与 message center / atomic 单元的地址都已纳入 base_addr_region 0..30 中的一个;否则 receiver 可能在数据写入完成前就处理 msg/atomic,导致同步语义错误。
仿真层不建模 base_addr_region 配置,假定软件正确配置保序窗口(Non-Goal)。
CDMA 多余线程操作模式 (Non-Goal)
SG2262 硬件中,超出基础 thread 池 (16 个) 的额外线程只支持 DES (descriptor-based) 模式,不支持 PIO (programmed I/O) 模式。该约束属于硬件配置接口层面,仿真层不区分 PIO/DES,对仿真结果无影响。
G5 永久 Non-Goal:不建模 PIO/DES 区分。
完成回调路径
三种不同的完成回调,触发条件和行为各不相同:
| 回调 | 触发者 | 触发条件 | 作用于 | 行为 |
|---|---|---|---|---|
| on_remote_done | DataArrived 或 CdmaLocalComplete | Transfer/Send 全链路完成 | 源端线程 | outstanding--, pending--, sync_id 更新 |
| on_receive_done | TxnComplete (Receive 类型) | Receive 的 tcredit 被远端 ACK | 源端线程 | pending--, sync_id 更新 (不减 outstanding) |
| notify_write_done | DataArrived (Send 类型) | Send 数据全部到达目标端 | 目标端线程 | pending--;若 FenceWait 且 pending==0 → Ready |
@tbl-spec-cdma-06 完成回调路径:回调,触发者
Send/Receive 配对规则
Thread 级一对一配对
| 规则 | 描述 |
|---|---|
| Send 配对 | 每个 CDMA Thread 的 Send 只能与一个对端 Chip 的一个 CDMA Thread 配对 |
| Receive 配对 | 每个 CDMA Thread 的 Receive 只能与一个对端 Chip 的一个 CDMA Thread 配对 |
| 跨芯片灵活性 | 同一 CDMA Thread 的 Send 和 Receive 可与不同芯片配对 |
| 一对多限制 | 不支持一对多发送 |
@tbl-spec-cdma-07 Thread 级一对一配对:规则,描述
Descriptor 配对
Send 和 Receive 指令通过 remote_thread_id 互相指向对方:
Receive(chip=1, thread=T1): remote_thread_id = T0 (指向 Send 端线程)
Send(chip=0, thread=T0): remote_thread_id = T1 (指向 Receive 端线程)
tcredit 到达 Send 端时,通过 (from_chip, from_thread) 匹配到对应的 tcredit 池条目。write_done 到达 Receive 端时,通过 dst_thread 匹配到对应的 Receive 线程。
多 tcredit 收集
一个 Send Thread 可同时持有来自不同 Receive Chip 的 tcredit:
- 每个 tcredit 通过 (from_chip, from_thread) 唯一标识
- write_done 需分别发送到各 Receive Chip
- 这不意味着一对多通信——每个 tcredit 仍代表一次独立的 thread 级一对一配对
tcredit 机制
tcredit 硬件结构
SG2262 硬件 tcredit 单元的物理结构:
- CAM 结构 (per CDMA, 32 深度):从 receive 侧到达的 tcredit 写入 CAM,键为 (chipid, cdmaid),标识"哪个远端 CDMA 实例发来了 tcredit"
- back-pressure:CAM 满时拒绝新 tcredit 写入,receive 侧需重发或排队
- 键粒度对齐:硬件以 cdmaid(CDMA 单元级)寻址,不区分到具体 thread;同一 CDMA 内多 thread 共享 tcredit 池
tcredit 仲裁规则
- 每收到一个 TcreditArrived,对应条目 +1
- Send 仲裁时检查 (dst_chipid, dst_cdmaid) 的计数 > 0,通过则消耗一个(-1)
- 计数归零时从 CAM 中移除条目
- 多个 tcredit 可积累,用于后续多次 Send
receive 2-OST 提前发 tcredit
receive 侧支持最多 2 个 outstanding 的 tcredit 发起:
- 第一条 receive 指令的 tcredit 写入完成(receive 端 CAM 写入 OK)后,第二条 receive 可立即开始(无需等第一条 send 数据到达)
- 即"已完成 tcredit 写入"是第二条 receive 的解锁条件,而不是"数据到达"
- 该机制让 receive 侧能持续供应 tcredit,避免 send 侧饿死
仿真层抽象:receive 指令的 outstanding 上限为 2(与数据 OST 计数分离)。
tcredit 广播与唤醒
tcredit 到达后的广播和线程唤醒流程:
CDMA->PAXI 注入速率门控 (G7)
硬件背景
硬件 spec(SG2262 C2C 方案)明确规定"每个 CDMA 做 64GB/s 带宽上限"。CDMA datapath 以此速率从 GMEM 读数据并通过 AXI 写接口推送给 PAXI。
真实硬件数据流:
CDMA datapath (64GB/s)
→ 发出 AXI write bursts (CDMA AXI master 侧 burst 粒度, 最多 256/1024 笔 OST)
→ PAXI 聚合: 多笔 AXI burst 累积到 MPS (4096B) 上限或 WLAST → 打包成一个 frame
→ RCLink: 512 slot 队列 + CBFC 流控, frame 内部按 max_payload (1344B) 切 packet 仅用于 retry
→ MAC → SerDes → 物理链路 (字节级 line_rate pipeline)
CDMA 到 PAXI 是流水线式的——读一点推一点,不是全部读完再一次性推。PAXI 按 §2.1.1 Flit Rules 把整个 AXI burst(或累积到 MPS 上限的多笔 burst)打包成单个 frame 后下发到 RCLink("Paxi packages the entire write or read burst into a single frame")。因此数据注入网络的速率应被 CDMA 的 64GB/s 带宽门控。
粒度说明:CDMA AXI master 侧的 burst 大小由 AXI 协议参数决定(与 AWLEN/ARLEN 相关,最大 16 beats × 数据位宽),与 PAXI 的 MPS frame 大小独立。一个 PAXI frame 可以聚合多笔 AXI burst(直到累积到 MPS 上限或遇到不同 DA/VC)。G5 简化为按 MPS 切分 frame,不显式建模 CDMA AXI 侧的逐笔 burst 边界。
数据分层:Transfer / Segment / Packet
G5 模型对上述硬件行为做了以下抽象:
| 层级 | 大小 | 硬件对应 | G5 模型抽象 |
|---|---|---|---|
| Transfer | 任意 (e.g. 600KB) | 一条 CDMA 搬运指令 | 一次 paxi.submit() = 1 个 OST + 1 个 TxnTracker |
| Segment | MPS (4096B) | AXI 4KB boundary 内的多笔 AXI burst | PAXICore MPS 分段,每段进入 segment_queue |
| Packet | max_payload (1344B) | RC Link TYPE1 报文 | RC Link TX slot,带 PSN,需要 ACK |
@tbl-spec-cdma-08 数据分层:Transfer / Segment / Packet:层级,大小
MPS 名词区分:此处 MPS=4096B 指 PAXI DAXI 分段大小(PAXI spec DAXI_MPS 默认值),区别于 CDMA AXI burst 的 256B 生成粒度。
关系:1 Transfer = N segments = N * M packets
$$\begin{equation} N_{\text{seg}} = \lceil \text{data\_bytes} / \text{MPS} \rceil \label{eq:spec-g5-cdma-seg-count} \end{equation}$$ $$\begin{equation} M_{\text{pkt/seg}} = \lceil \text{MPS} / \text{max\_payload} \rceil \label{eq:spec-g5-cdma-pkt-per-seg} \end{equation}$$G5 模型中的 w_ost_limit=256 是 PAXI 事务层 OST(见 §名词定义),限制 PAXI 同时追踪的事务数;一条 Transfer 对应 1 个 PAXI 事务(1 个 TxnTracker)。不可拆分 submit 调用,否则会破坏 OST/TxnTracker 的一致性。
设计:Segment 级时间门控
核心思路:保持 paxi.submit(full_bytes) 一次性调用不变(维持 1 个 OST + 1 个 TxnTracker),但为每个 segment 标记 earliest_ready_ns,RC Link TX 仲裁时检查此时间约束。
为什么不拆分 submit 调用:paxi.submit() 内部分配 OST 并创建 TxnTracker 追踪所有 packet 的 ACK。拆分为 N 次 submit(seg_bytes) 会创建 N 个独立 TxnTracker 和 OST 占用,破坏"一条 Transfer = 1 事务"的完成追踪一致性(DataArrived 需所有 packet ACK 收齐)。
各 segment 的最早就绪时间由注入带宽和 MPS 决定:
$$\begin{equation} T_{\text{seg\_interval}} = \text{MPS} / \text{bandwidth\_bytes\_per\_ns} \label{eq:spec-g5-cdma-seg-interval} \end{equation}$$ $$\begin{equation} T_{\text{earliest\_ready}}(i) = T_{\text{submit}} + i \times T_{\text{seg\_interval}}, \quad i = 0, 1, \ldots, N_{\text{seg}}-1 \label{eq:spec-g5-cdma-seg-ready-time} \end{equation}$$实现机制:
schedule_via_paxi()仍调用paxi.submit(dst, full_bytes, ...),同时传入injection_rate_bytes_per_ns(CDMA 带宽)PAXICore::create_segments()为每个 SegmentInfo 计算并设置earliest_ready_nsPAXIBridge::feed_rc_link()或 RC Link TXtry_arbitrate()在选择 segment 时检查now >= earliest_ready_ns,不满足则跳过(调度唤醒事件在earliest_ready_ns重新仲裁)- CHS CdmaLocalComplete 调度时机不变(仍在
datapath_end + 5ns) - OST/TxnTracker/ACK/DataArrived 全部不变
数值示例
Transfer 600KB, CDMA 64GB/s, MPS=4096B:
| 参数 | 值 |
|---|---|
| N_seg | ceil(600000 / 4096) = 147 |
| T_seg_interval | 4096 / 64 = 64ns |
| segment[0] earliest_ready | submit_time = 200ns |
| segment[1] earliest_ready | 200 + 64 = 264ns |
| segment[146] earliest_ready | 200 + 146 * 64 = 9544ns |
| datapath_end | 200 + 600000/64 = 9575ns |
| CHS complete | 9575 + 5 = 9580ns |
@tbl-spec-cdma-09 数值示例:参数,值
每个 segment 就绪后,其内部的 4 个 packet(ceil(4096/1344)=4)可按 RC Link 线速(50GB/s/LG)立即发出。网络看到的注入速率 = 64GB/s(匀速),而非 400GB/s(瞬时爆发)。
零字节特殊处理
Receive 指令提交零字节 tcredit 包,强制 1 个 segment,earliest_ready_ns = submit_time,无时间门控。
对现有行为的影响
| 场景 | 总时间变化 | 中间行为变化 |
|---|---|---|
| CHS 单 Transfer | 不变 | 网络从瞬时爆发变为匀速流 |
| CHS AllReduce (ring) | 不变 | 链路利用率更真实 |
| CFS 单 Transfer | 增加(网络传输时间变长) | 更准确 |
| 多芯片并发 | 可能略有变化 | 拥塞模式更真实 |
@tbl-spec-cdma-10 对现有行为的影响:场景,总时间变化
CDMA Unit 资源分配 (G8)
硬件背景
CDMA spec v2.2 明确规定每个 CDMA 内部多个线程共享一条 datapath,通过 WRR/RR 仲裁轮流使用:
"每个CDMA支持8个线程,可以支持8个不同的指令流分时执行,共享同一个执行单元轮流执行" "支持通过多线程掩盖访问延迟,多线程间切换依照WRR/RR方式在待发射线程间仲裁"
因此,同一 CDMA 上开多个线程不增加带宽,仅掩盖延迟。要获得更高的聚合带宽,必须将数据分布到不同 CDMA(不同 datapath)上。
SG2262 每 chip 8 个 CDMA,总 CDMA 带宽 512 GB/s,大于 C2C 链路有效带宽 (~400 GB/s)。用 7 个 CDMA 并行即可打满链路。
设计:Multi-channel 前置拆分
核心概念:Channel
Channel 是一组独立的集合通信实例。每个 channel 处理总数据的 1/C 份额,在 1 个 CDMA 上完整执行所有步骤。C 个 channel 在 C 个不同 CDMA 上并行执行。
与已有的 num_chunks(流水线分段)概念正交:
| 概念 | 含义 | 维度 |
|---|---|---|
num_channels (C) | 跨 CDMA 的并行实例,不同 CDMA 上独立执行 | 空间并行(多 datapath) |
num_chunks (P) | 同一 channel 内的流水线分段,同一 CDMA 上顺序执行 | 时间流水(掩盖延迟) |
@tbl-spec-cdma-12 设计:Multi-channel 前置拆分:概念,含义
num_channels=4, num_chunks=2 表示 4 个 CDMA 各跑独立 Ring,每个 Ring 内 2 段流水线。
Channel 数量
$$\begin{equation} C = \min\left(N_{\text{cdma\_units}},\ \left\lceil \frac{B_{\text{link}}}{B_{\text{cdma}}} \right\rceil\right) \label{eq:cdma-num-channels} \end{equation}$$其中:
- $N_{\text{cdma\_units}}$:芯片上可用的 CDMA Unit 总数
- $B_{\text{link}}$:链路带宽(GB/s)
- $B_{\text{cdma}}$:单个 CDMA datapath 带宽(64 GB/s)
C 在评估时从链路带宽和 CDMA 带宽自动计算,不随消息大小变化,因此不产生跳变。示例:
- C2C 400 GB/s: C = min(8, ceil(400/64)) = 7
- Ethernet 400G (~50 GB/s): C = min(8, ceil(50/64)) = 1
每 channel 数据量
$$\begin{equation} \text{channel\_data\_bytes} = \left\lceil \frac{\text{data\_bytes}}{C} \right\rceil \label{eq:cdma-channel-data} \end{equation}$$每个 channel 以 channel_data_bytes 作为输入,独立执行完整的集合通信算法(Ring/HD/DBT/AllToAll 等)。
Thread_id 分配
每个 channel 内的算法可能使用 1 个或多个 CDMA Unit(如 2-port Ring 使用 2 个 Unit)。设单 channel 内使用 $U$ 个 Unit,则 channel $c$ 的 thread_id 偏移为:
$$\begin{equation} \text{thread\_id\_offset}(c) = c \times U \times \text{threads\_per\_cdma} \label{eq:cdma-channel-thread-offset} \end{equation}$$示例(2-port Ring, C=2, threads_per_cdma=8):
- Channel 0: CW=unit 0 (tid=0), CCW=unit 1 (tid=8)
- Channel 1: CW=unit 2 (tid=16), CCW=unit 3 (tid=24)
$U$ 从单 channel 扩展结果中自动推断(max unit_idx + 1),无需显式配置。
依赖模型
- Channel 内:保持原有的
cmd_id_dep链(如 Ring step N -> step N+1) - Channel 间:完全独立,无依赖。不同 channel 的指令在不同 CDMA 上并行执行
- 无需 Fence 同步
不适用 multi-channel 的场景
| 场景 | 原因 |
|---|---|
| Hierarchical collective | 每个维度的 sub-group 通常较小,单 CDMA 足够;多维度间依赖链复杂 |
| P2P Send/Receive | 需要对端 thread 配对,channel 化会增加配对协议复杂度 |
| num_channels = 1 | 退化为当前行为,无 channel 包装开销 |
@tbl-spec-cdma-13 设计:Multi-channel 前置拆分:场景,原因
数值示例
Ring AllReduce 4 chip,数据量 2.4MB, num_channels=7:
| 参数 | 值 |
|---|---|
| channel_data_bytes | ceil(2.4MB / 7) = 351KB |
| 每步每 channel | 351KB / 4 = 87.75KB |
| 单 CDMA 搬运时间 | 87.75KB / 64GB/s = 1371ns |
| 聚合带宽 | 7 x 64 = 448 GB/s,受限于链路 ~400 GB/s |
| 有效搬运时间 | 2.4MB / 400GB/s = 6000ns |
| 对比 num_channels=1 | 2.4MB / 4 / 64GB/s = 9375ns per step |
| 加速比 | ~6.8x |
@tbl-spec-cdma-14 数值示例:参数,值
与 G7 的协同
每个 channel 的每条 Transfer 仍然受 G7 注入速率门控约束。每条 Transfer 通过 paxi.submit() 提交时携带 injection_rate_bytes_per_ns = CDMA_BW(64 GB/s),segment 按该速率匀速注入。C 个 channel 各自独立注入,聚合注入速率 = C x 64 GB/s,受限于 C2C 链路带宽。
msg 同步指令体系接口引用 (G9)
msg 同步指令体系(MsgSend / MsgWait / RemoteMsgSend、msg_central 状态机、(central_idx, msg_id) 命名空间分配、sendq/rcvq 双队列与 sys_tx/sys_rx 两线程、A4S 独立信号路径)的完整设计见 G5-CDMA-msg同步体系设计规格。本 spec 的跨 chip 数据到达依赖约束(见 §详细设计 跨 chip 数据到达依赖)依赖该体系:「write + 显式 msg 指令」同步路径(CDMA_write + CDMA_remote_msgsend + CDMA_msg_wait)由 msg 体系提供 receiver 侧可感知的到达信号,核心引擎不重复定义 msg 指令字段与 msg_central 状态机细节。
多 CDMAUnit 协调
CdmaWake 遍历所有 Unit
CdmaWake 事件触发后,遍历芯片上所有 CDMAUnit,每个 Unit 独立执行 try_arbitrate。各 Unit 的仲裁结果独立提交到 PAXI。
Deferred Wake
当所有 Unit datapath 都处于忙碌状态时,CdmaWake 延迟到最早空闲时刻重新触发:
设计目的:避免忙等轮询。当所有 Unit 的 datapath 都忙时,仅调度一次延迟唤醒到最早释放时刻。
tcredit 和事件广播
| 事件 | 广播范围 | 处理方式 |
|---|---|---|
| TcreditArrived | 所有 Unit | 每个 Unit 的 notify_tcredit 都被调用,内部按 thread 匹配 |
| CdmaLocalComplete | owning Unit | 仅 owns_thread() 返回 true 的 Unit 处理 |
| DataArrived | owning Unit | 仅 owns_thread() 返回 true 的 Unit 处理 |
@tbl-spec-cdma-15 tcredit 和事件广播:事件,广播范围
事件驱动完整链路
从 CdmaWake 出发的所有事件路径:
参数
| 参数 | 含义 | 默认值 |
|---|---|---|
| CDMA_COUNT_PER_DIE | 每 Die 的 CDMAUnit 数 | 4 |
| THREADS_PER_CDMA | 每 CDMAUnit 线程数 | 8 |
| MAX_OUTSTANDING | 共享 Outstanding 上限 | 16 |
| BANDWIDTH_BYTES_PER_NS | datapath 带宽 | 64.0 (64 GB/s) |
| STARTUP_LATENCY_NS | 指令启动延迟 | 50 |
| consistency_mode | 一致性模式 (CHS/CFS) | CHS |
| NUM_CHANNELS | 集合通信 multi-channel 并行数 | 7 (C2C); 1 (Ethernet) |
@tbl-spec-cdma-16 参数配置
魔数取值来由(如 5ns 为 MAC early resp 近似值)见附录 B 实现说明。
备选方案
CHS vs CFS
| 维度 | CHS (默认) | CFS |
|---|---|---|
| Transfer 吞吐 | 高(本地 5ns 完成) | 低(等 RTT,数百 ns) |
| Send 吞吐 | 与 CFS 相同(都等 ACK) | 基准 |
| 网络要求 | 路径唯一,不支持 ECMP | 无保序要求,可多路径 |
| 小数据效率 | 高(14KB all2all 几乎零同步开销) | 低(每次 fence 等 RTT) |
| 硬件复杂度 | 需要四级保序链 + 保序窗口 | 仅需 fence 计数器 |
| 正确性保证 | 硬件保证,对软件透明 | 软件显式 fence |
@tbl-spec-cdma-17 CHS vs CFS:维度,CHS (默认)
选择理由:CHS 作为默认模式,因为仿真场景主要是 AI 集合通信,数据量从几 KB(MoE expert)到数百 MB(AllReduce),CHS 在 Transfer 主导的场景中有性能优势。CFS 保留作为配置选项用于对比分析。
多 CDMA 并行策略
| 维度 | 方案 A: post-hoc Transfer 拆分 | 方案 B: multi-channel 前置拆分 (选定) | 方案 C: CDMA 硬件模型自动分配 |
|---|---|---|---|
| 建模真实性 | 低:单条 Transfer 被拆成 K 条子 Transfer,业界无此行为 | 高:每个 channel 是独立集合通信实例,匹配 NCCL channel 模式 | 低:硬件不做自动分配 |
| 延迟曲线 | 阶梯跳变:K 在消息大小阈值处离散跳变 | 线性:C 由链路带宽决定,不随消息大小变化 | 取决于实现 |
| 覆盖范围 | 仅大 Transfer(data_bytes > min_split_bytes) | 所有集合通信算法统一处理 | 全覆盖但不真实 |
| 依赖处理 | 复杂:需要跨步依赖重映射(remap table) | 简单:channel 间无依赖,channel 内保持原有依赖链 | N/A |
@tbl-spec-cdma-18 多 CDMA 并行策略
选择理由:方案 A 导致延迟曲线阶梯跳变,且行为不匹配业界实践。方案 B 匹配 NCCL multi-channel 模式,延迟曲线线性,依赖处理更简单。业界实践对照见附录 A 业界调研。
fence 同步原语:fence_bit vs 独立 Fence cmd
| 维度 | 方案 A:fence_bit 集成字段(选定) | 方案 B:独立 Fence cmd |
|---|---|---|
| 仲裁开销 | 0(数据指令尾自动转 FenceWait,省一次额外仲裁) | 1 次额外仲裁 + dispatch |
| 适用范围 | 仅依附单条数据指令(Transfer / Send / Scatter 等) | 任意位置插入,可作多条前序数据指令的共同屏障 |
| 跨队列屏障 | 仅作用于本指令所在队列 (sendq 或 rcvq) | sendq / rcvq 共享原语,可作跨队列同步点 |
| 硬件 spec 依据 | SG2262 CDMA spec fence-bit 译码段 | SG2262 CDMA spec 独立 Fence cmd 段 |
| 软件复杂度 | 软件只需在数据指令上置 bit | 需独立 emit Fence cmd 并管理依赖 |
@tbl-spec-cdma-fence-bit-vs-cmd fence_bit vs 独立 Fence
选择理由:两者互补而非互斥——fence_bit 适用于"单条数据指令完成后立即屏障"的简单 hazard,独立 Fence 适用于"多条前序数据指令共同屏障"或"跨 sendq/rcvq 同步"。spec 同时支持两者,由软件层根据 hazard 类型选用。详见 §详细设计 软件 emit Fence 触发条件。
inst_fifo 深度方案
| 维度 | 方案 A:depth 4(选定,项目假设) | 方案 B:depth 2 | 方案 C:depth 8 |
|---|---|---|---|
| 数据来源 | 项目 spec 假设值(SG2262 inst_fifo 深度段未冻结) | 保守值 | 激进值 |
| burst 短 cmd 吞吐 | 4 cmd in-flight,覆盖典型 datapath 流水级数 | 2 cmd,可能成为瓶颈 | 8 cmd,过 datapath 实际流水级数无收益 |
| 仿真状态空间 | 中等 | 小 | 大 |
@tbl-spec-cdma-inst-fifo-depth inst_fifo 深度方案
选择理由:depth 4 是项目 spec 假设值,匹配业界 DMA datapath 典型流水级数(fetch / decode / segment / wire)。待 SG2262 硬件 spec inst_fifo 深度段冻结后修订。深度 2 / 8 作为敏感性分析的对照值保留。
非功能性需求
| 维度 | 本 spec 的考虑 |
|---|---|
| 性能 (Performance) | datapath 带宽预算 64 GB/s per CDMA unit,聚合带宽靠 multi-channel(C × 64 GB/s,受限于 C2C 链路 ~400 GB/s);CHS 模式 Transfer 本地 5ns retire 提升 Transfer 主导场景的有效并行度;G7 注入门控让网络看到的注入速率匹配 CDMA 物理带宽而非瞬时爆发 |
| 可靠性 (Reliability) | CHS 提前 retire 使 Transfer 仿真延迟偏乐观,提供 CFS 模式对照与 RC Link 诊断计数器监控实际瓶颈;tcredit 池化允许积累,硬件 CAM 深度 32 满时 back-pressure 重调度而非 drop;Outstanding 满触发本 Unit 全线程 stall |
| 兼容性 (Compatibility) | num_channels=1 退化为无 channel 包装的当前行为(向后兼容),去掉 split 逻辑后与旧行为一致 |
Security / Privacy / Observability 维度省略:本 spec 是仿真内部建模,不涉及鉴权、用户数据收集或对外 metrics 暴露。
局限与后续工作
局限 (本设计的代价)
| 风险 / 局限 | 影响 | 缓解措施 |
|---|---|---|
| CHS 提前 retire 可能掩盖实际带宽瓶颈 | Transfer 的仿真延迟偏乐观 | 提供 CFS 模式对照;通过 RC Link 诊断计数器监控实际传输瓶颈 |
| CHS 下 Send 仍等 ACK | Send 延迟不受 CHS 优化 | 设计如此(Send 自带 fence 语义,见 §CHS/CFS 内存一致性模型) |
| Receive 不消耗 Outstanding | 大量 Receive 可能导致 pending 累积 | pending 无上限,且 Receive 不产生数据流量 |
| tcredit 池化允许无限积累 | 内存使用与通信模式相关 | 实际场景中 tcredit 很快被消费,硬件 tracker 深度 32 per CDMA |
| CDMA → PAXI 零延迟 | 忽略 NoC 内部延迟 | 对总延迟影响较小(ns 级 vs 数百 ns 级链路延迟) |
| Multi-channel 增加指令总数 | C 个 channel 各生成完整指令序列 | 各 channel 独立,无额外同步开销 |
| Hierarchical 不支持 multi-channel | 大规模多维集合通信仅用 1 个 CDMA | sub-group 通常较小,单 CDMA 足够;后续可扩展 |
| Send/Receive 不支持 multi-channel | P2P 通信仅用 1 个 CDMA (64 GB/s) | tcredit 配对协议需重新设计,列入后续工作 |
| OQ-1: fence_bit 与 msg_en / atm_en 同时启用时序未定 | 数据指令同时启用 fence_bit + msg_en/atm_en 的端到端延迟在硬件 spec 未明示前为推荐语义 | 推荐语义:msg_en/atm_en 触发在尾 beat,fence_bit 等本 thread bresp 收齐,两者作用于不同时刻可同时启用;Phase 2 实现前需硬件 spec 确认 |
| OQ-2:软件 emit Fence 判定责任层未裁定 | mapping 层做 hazard 检测自动 emit vs collective 层显式 emit 的分工待定 | Phase 1 G5 collective 全走 write+msg 路径,无本 thread 同地址 hazard 场景,暂不裁定;待 mapping 层出现该场景时回头确认 |
| inst_fifo 深度方案未冻结 | depth 4 为项目假设值(SG2262 spec inst_fifo 深度段未冻结),实际 cmd 流水化吞吐可能与硬件 RTL 偏差 | 见备选方案 inst_fifo 深度方案;待硬件 spec 确认后修订 |
@tbl-spec-cdma-19 风险与缓解措施
后续工作 (后续扩展方向)
| 方向 | 优先级 | 前置条件 |
|---|---|---|
| Hierarchical multi-channel | 中 | 确认大规模多维拓扑下单 CDMA 是否成为瓶颈 |
| Send/Receive multi-channel | 中 | 需要重新设计 tcredit 配对协议,支持多线程配对 |
| 保序窗口建模 | 低 | 需要目标端 MAC MST 出口的地址匹配模型 |
| CDMA NoC 延迟建模 | 中 | 需要 Tier 4 BusModel 的 CDMA→PAXI 路径 |
| 动态 Outstanding 上限 | 低 | 可根据拓扑和延迟自动调整 |
| tcredit tracker 深度限制 | 低 | 硬件限制 32 per CDMA,当前未建模 |
@tbl-spec-cdma-21 未来方向
验收标准
| 场景 | 指标 | 目标值 | 测试方法 |
|---|---|---|---|
| CHS Transfer | 线程释放时间 | datapath_end + 5ns | 检查 CdmaLocalComplete 时间和 sync_id 更新 |
| CFS Transfer | 线程释放时间 | DataArrived 时间 | 检查 DataArrived 后 sync_id 更新 |
| CHS Send | 线程释放时间 | DataArrived 时间(非 CdmaLocalComplete) | 确认 CHS 下 Send 不调度 CdmaLocalComplete |
| Send datapath 释放 | 后续线程可仲裁时间 | datapath_end 后立即 | 检查另一线程的仲裁时间 <= datapath_end |
| Receive 资源消耗 | Outstanding 计数 | Receive 后 outstanding 不变 | 执行 Receive 前后检查 outstanding_count |
| tcredit 握手全链路 | 事件顺序 | Receive → tcredit ACK → TcreditArrived → Send → DataArrived | 端到端仿真,检查事件顺序 |
| Fence 多线程隔离 | 其他线程阻塞 | FenceWait 期间其他线程正常仲裁 | 一个线程 Fence 期间检查其他线程的仲裁调用 |
| 指令依赖 | 执行顺序 | cmd_id_dep > sync_id 的指令不执行 | 检查依赖未满足时线程保持 Idle |
| Deferred wake | 唤醒时机 | datapath 释放时自动唤醒 | 检查 CdmaWake 调度时间 == busy_until |
| Multi-channel 数据分配 | 每 channel 数据量 | channel_data = ceil(total / C) | num_channels=4, 1MB -> 每 channel 256KB |
| Multi-channel thread_id | CDMA Unit 分离 | channel c 的 offset = c * U * tpc | 2-port C=2: ch0=unit0/1, ch1=unit2/3 |
| Multi-channel 并行度 | 多 CDMA 同时执行 | C 个 channel 的 datapath 同时 busy | 检查各 channel 的 Unit busy_until 时间重叠 |
| Multi-channel 聚合带宽 | 链路利用率 | C x 64 GB/s (上限为链路带宽) | C=7:聚合 448 GB/s,受限于链路 400 GB/s |
| Multi-channel 无跨 channel 依赖 | cmd_id_dep | 不同 channel 的指令 cmd_id_dep 不交叉 | 检查 channel 间无 dep 引用 |
| Multi-channel 延迟单调性 | 消息大小 vs 延迟 | Dense sweep 32KB~4MB 延迟单调递增 | 无阶梯跳变 |
| num_channels=1 退化 | 向后兼容 | 等价于无 channel 包装 | 检查与旧行为一致(除去 split 逻辑) |
| 流水化 inst_fifo 并发 | datapath 同时在飞 cmd 数 | ≤ inst_fifo_depth(项目假设 4) | burst 短 cmd 序列下 datapath 不立即 retire 单条,多笔 cmd 并发 in-flight |
| fence_bit 集成字段等价独立 Fence | 时序数值 | fence_bit 触发的 FenceWait 完成时刻 ≈ "Transfer + 独立 Fence" 两条 cmd 完成时刻(差异 ≤ 单次仲裁 startup) | 同一数据指令分别用 fence_bit=1 与 emit 独立 Fence,对比端到端延迟 |
| sync_id 推进时机偏差 (Phase 1 vs Phase 2 对照) | CHS Transfer 完成时机 | Phase 2: datapath_end + 5ns (CdmaLocalComplete);Phase 1: PAXI on_remote_done (远端 ACK)。对照测试需识别该偏差 | 同一 cmd 在两种推进时机下后续 cmd 的 ready 时间差应等于 PAXI 一跳 RTT |
@tbl-spec-cdma-20 验收标准
附录
附录 A:业界调研
业界不拆分单条 DMA transfer,而是在软件层面生成多条独立 transfer 并行执行。拆分决策在通信库或编译器层面完成,单条指令在单个 DMA 引擎上完整执行,硬件不自动拆分:
| 平台 | 机制 | 说明 |
|---|---|---|
| NVIDIA NCCL | Channel | 每个 channel 是独立的 Ring/Tree 实例,绑定到一组 SM 或 Copy Engine。数据按 channel 数均分,各 channel 独立跑 Ring 步骤 |
| AMD MI300X | sDMA 引擎 | 16 个 sDMA 引擎,集合通信拆成多条独立 copy command,back-to-back 调度。多条独立 command 可并发执行 |
| TPUPerf SG2260 | 单 CDMA | 每芯片仅 1 个 CDMA,不存在多 DMA 调度。AllReduce 用 pseudo alpha-beta 公式直接算延迟 |
@tbl-spec-cdma-11 业界实践:平台,机制
本模块的差异化设计:G8 multi-channel 前置拆分匹配 NCCL channel 模式(每 channel 独立集合通信实例),区别于 post-hoc Transfer 拆分(业界无此行为,延迟曲线阶梯跳变)。
参考文献:
- "Demystifying NCCL: An In-depth Analysis" (2025) -- arxiv
- Pati et al. "DMA Collectives for Efficient ML Communication Offloads" (2025) -- arxiv
- "NCCL 2.28 Copy Engine Collectives" -- NVIDIA blog
附录 B:实现说明
记录 spec 与实际实现的偏差事实,以及硬件参数对照表中各偏差项的 Phase 2 实施 roadmap。
实现与 spec 的偏差
- [2026-04-21] CHS 模式下 CdmaLocalComplete 的延迟在代码中为 datapath_end + 5ns,5ns 为 MAC early resp 的近似值,非精确硬件测量值。
- [2026-04-21] total_cdma_units 的计算使用 max(config, c2c_ports_per_chip),当 c2c_ports_per_chip > config 时会自动扩展。
- [2026-04-21] CHS 下只有 Transfer 触发 CdmaLocalComplete,Send 不触发。这与设计文档中 Send 自带 fence 语义一致:Send 需收集 bresp 后发 write_done,CHS 下 write_done 通过保序窗口保序。
- [2026-05-13] 硬件 tcredit tracker 深度 32 per CDMA:已建模为 32 + back-pressure(重调度而非 drop)。一次通信最大 30 条指令的限制仍未建模。
- [2026-05-14] 集合通信展开层 (Ring AR / HD AR / RD AG / RH RS / DBT) 的跨 chip pair 同步采用 write+msg 显式同步路径:每个跨 chip pair 由 (前序 MsgWait,仅 round_idx>0 时) + Transfer + RemoteMsgSend 三条指令组成,对应硬件
CDMA_write + CDMA_remote_msgsend + CDMA_msg_wait组合。Transfer 不声明跨 chip 数据到达依赖,由后续 RemoteMsgSend 声明 (remote_chip_id, remote_cmd_id) 元组显式向对端 msg_central 累加。msg_id 复用 round_idx (8-bit slot,限制 round_idx<128)。
Phase 1 实现偏差与 Phase 2 roadmap
- sync_id 推进时机:G5 Phase 1 的 Transfer sync_id 在 PAXI on_remote_done(远端 ACK)触发,与详细设计 sync_id 更新时机表的 CHS 规范(CdmaLocalComplete = datapath_end + 5ns)存在偏差,影响本 thread Transfer 链串行化程度。Phase 2 计划修正至表格规范。
- WRR 仲裁:Phase 1 用等权简单 RR 替代 WRR,仲裁切换条件只有"datapath busy + outstanding 满",无 msg-trigger-switch / fence-trigger-switch。该简化对单 Ring/HD 通信路径影响有限(单 thread 串行执行)。Phase 2 计划实现 WRR 三切换条件,配合 chip YAML 线程级 weight 配置。
- inst_fifo 流水化:Phase 1 用单一
datapath_busy_until_ns表示 datapath 占用,不建模 inst_fifo 流水。burst 短指令场景数值偏低(缺失流水化吞吐收益),大消息场景影响可忽略。Phase 2 计划加入 disp_fifo depth 1 + inst_fifo depth 4 流水级。 - cmd_queue 深度:Phase 1 用
Vec<CDMACommand>无队列深度上限,simulation 层每线程 sendq / rcvq 各用一条VecDeque<CDMACommand>独立建模,不复现 SRAM 多 bank 端口冲突避免机制。Phase 2 计划实现 cmd_queue depth 64 上限 + back-pressure。 - 可选集成字段:Phase 1 未建模 msg_en / atm_en / reduce_en / compress_en / fence_bit。影响:AllReduce in-place reduce 用独立指令(数值无差,reduce 计算时间通常忽略);压缩场景 wire bytes 偏高(按未压缩计算);msg_en / fence_bit 集成与独立指令数值等价但时序略偏慢(多一次仲裁/startup)。Phase 2 计划加入这 5 个可选字段到 Transfer / Send / Scatter / Scatter2 / Gather / RemoteAtomic。
- 扩展数据指令族:Phase 1 未实现 Scatter / Scatter2 / Gather,MoE dispatch / combine 用多条 Transfer / Send 模拟,数据量与延迟近似正确,但缺失 descriptor 链表批处理开销、pe_group_mask 群发、集成开销节省。Phase 2 计划完整实现。
- 原子指令族:Phase 1 未建模 RemoteAtomic,atomic 类操作用 RemoteMsgSend 近似(atomic 包大小与 msg packet 相近,都走 A4S)。Phase 2 计划实现 RemoteAtomic + Transfer/Scatter 集成 atomic。
- write_done sideband:Phase 1 将数据 ACK(DataArrived)与 write_done 合并为一个 DataArrived 事件,不建模额外 sideband round。Send/Receive 协议时序数值偏低;Transfer + 独立 RemoteMsgSend 路径不受影响(msg 走独立路径)。Phase 2 计划加入独立 write_done sideband 事件。
- base_addr_region 保序窗口:Phase 1 不建模配置,仿真层假定软件正确配置(Non-Goal)。Phase 2 不计划建模,因仿真层不涉及硬件配置接口。
附录 C:完整接口签名 / 数据结构 / 字段位宽表
msg 指令字段位宽(MsgSend / MsgWait / RemoteMsgSend、base_id CSR、msg_central slot)见 G5-CDMA-msg同步体系设计规格 附录 A。本附录保留
msg_en集成字段的位宽(与其它集成字段同表),但 msg_en 触发的 msg 语义见子 spec。
可选集成字段完整定义
| 字段 | 位宽 / 取值 | 互斥关系 |
|---|---|---|
msg_en | 1-bit;触发 msg_idx (16-bit absolute) + msg_val (16-bit send_cnt) | 与 atm_en 互斥 |
atm_en | 1-bit;触发 atomic_idx (16-bit) + atomic_val (16-bit 有符号) | 与 msg_en 互斥 |
reduce_en | 1-bit;reduce_op (SUM/PROD/MAX/MIN/MAC) + 可选 psum_op (WO/RW) + const_scale | 与 compress_en 独立 |
compress_en | 1-bit;compress_dtype (INT8 / FP6E3) | 与 reduce_en 独立 |
fence_bit | 1-bit;数据指令完成后本 thread 进入 FenceWait | 见 OQ-1 |
扩展数据指令 / 原子指令字段
| 指令 | 字段 |
|---|---|
| Scatter | descriptor 链表地址 (本地),表项数 N,可选 msg_en/atm_en/reduce_en/compress_en, pe_group_mask + pe_group_size |
| Scatter2 | start_pe, pe_step, pe_num, dst_addr, bytes,可选集成字段,pe_group_mask + pe_group_size |
| Gather | descriptor 链表地址 (本地),表项数 N,每项含 src_chipid + src_addr + bytes |
| RemoteAtomic | start_pe, pe_step, pe_num, atomic_idx, s16_val (16-bit 有符号加数),pe_num 上限 1024 chip |
数据分层公式参数
| 符号 | 含义 | 取值 |
|---|---|---|
| MPS | Segment 大小 | 4096 B |
| max_payload | Packet 大小 | 1344 B |
| w_ost_limit | PAXI 事务 OST,源自 PAXI DAXI_W_OST 默认 256 | 256 |
完成回调签名
| 回调 | 触发者 | 作用于 | 行为 |
|---|---|---|---|
| on_remote_done | DataArrived / CdmaLocalComplete | 源端线程 | outstanding--, pending--, sync_id 更新 |
| on_receive_done | TxnComplete (Receive) | 源端线程 | pending--, sync_id 更新(不减 outstanding) |
| notify_write_done | DataArrived (Send) | 目标端线程 | pending--;若 FenceWait 且 pending==0 → Ready |
G7 注入门控接口
| 接口 | 说明 |
|---|---|
schedule_via_paxi() | 调用 paxi.submit(dst, full_bytes, ...),传入 injection_rate_bytes_per_ns(CDMA 带宽) |
PAXICore::create_segments() | 为每个 SegmentInfo 计算并设置 earliest_ready_ns |
PAXIBridge::feed_rc_link() / RC Link TX try_arbitrate() | 选 segment 时检查 now >= earliest_ready_ns,不满足则跳过并调度唤醒 |
simulation 层数据结构
| 结构 | 说明 |
|---|---|
| sendq / rcvq | 每线程各一条 VecDeque<CDMACommand> 独立建模(双队列模型) |
| tcredit pool | Phase 1: HashMap<(from_chip, from_thread), u32>;Phase 2 改为 (chipid, cdmaid) 键 + 上限 32 + back-pressure |
| CDMACommand.remote_cdma_id | tcredit 键粒度对齐字段 |