08 - 设计文档与实现差异分析
对比 g5-simulator-design/ 的 6 篇设计文档与 perf_model/L4_evaluation/g5/ 的实际实现, 列出所有差异、缺失项和需要修改的地方。
分析日期: 2026-02-25
总览
实现覆盖率
| 设计文档 | 实现状态 | 覆盖率 |
|---|---|---|
| 01-memory-subsystem | 仅 budget 校验, 无时序模型 | ~10% |
| 02-multicore-interconnect | Bus 完整, C2C/CDMA 未实现 | ~40% |
| 03-command-parser | L3 层指令生成存在, 二进制解析部分 | ~50% |
| 04-integration | 结果适配器完整, API 端点待确认 | ~60% |
| 05-implementation-plan | Phase 1-2 完成, Phase 3-6 部分完成 | ~55% |
| 06-statistics-framework | Phase 1 完整, Phase 2 未开始 | ~70% |
文件对照表
| 设计中的模块 | 设计中的文件路径 | 实际文件路径 | 状态 |
|---|---|---|---|
| EventScheduler | core/event_scheduler.py | kernel/sim_kernel.py | 完整 (路径不同) |
| Signal/Port | core/signal.py | 不存在 | 未实现 (用 callback 替代) |
| FIFO/Semaphore | core/ | 不存在 | 未实现 (不需要) |
| TIU Engine | engines/tiu_engine.py + tiu_delay.py | tiu.py | 合并为单文件 |
| DMA Engine | engines/dma_engine.py + dma_delay.py | dma.py | 合并为单文件 |
| SDMA Engine | - | sdma.py | 实现 (设计中未单独规划) |
| HAU Engine | - | hau.py | 实现 (设计中未单独规划) |
| LMEM Model | memory/lmem.py | memory.py | 仅 budget 校验 |
| DDR Model | memory/ddr.py | 不存在 | 未实现 |
| Cache Model | memory/cache.py | 不存在 | 未实现 |
| SAM | memory/address_map.py | 不存在 | 未实现 |
| Bus Model | interconnect/bus.py | chip/bus.py | 完整 (路径不同) |
| C2C Link | interconnect/c2c.py | interconnect.py (空 stub) | 未实现 |
| CDMA | interconnect/cdma.py | 不存在 | 未实现 |
| Binary Parser | command/binary_parser.py | L3 层 binary_parser.py | 部分实现 |
| Instruction Gen | command/instruction_gen.py | L3 层 instruction_emitter.py | 部分实现 |
| Single Core | top/single_core.py | top/single_chip.py | 重命名, 已完整 |
| Multi Core | top/multi_core.py | 不存在 | 未实现 |
| Profiler | profiler/profiler.py | 集成到 kernel/stats.py | 合并实现 |
| Gantt Adapter | profiler/gantt_adapter.py | adapter.py | 合并实现 |
| TPUPerf Backend | tpuperf_backend/ | 不存在 | 未实现 (已放弃方案 B) |
逐文档详细差异
01-memory-subsystem.md
LMEM 模型
设计要求:
- Bank conflict 检测 (16 banks per lane)
- Lane 映射计算 (addr → lane_idx → bank_idx)
- 延迟公式:
delay = base_delay + burst_delay + conflict_delay - 请求处理: 接收请求 → lane 映射 → bank 冲突检查 → 延迟计算
实际实现 (memory.py:15-59):
- 仅提供
lmem_budget_per_core()和validate_lmem_usage() - 无 bank conflict, 无 lane 映射, 无延迟计算
- 是纯校验函数, 不是时序模型
差异影响: 中等
- 对 LLM 推理场景, 内存访问模式较规则, bank conflict 影响 5-10%
- TIU 延迟公式中已预留
bank_conflict项但硬编码为 0
建议: 短期可接受。长期实现时, 在 _calc_mm2_nn() 中增加 bank conflict 估算。
DDR 模型
设计要求:
- DRAM 地址映射 (col/bank_group/bank/row)
- Bank conflict 检测 + row 切换惩罚
- Outstanding FIFO (read=128, write=128)
- 对齐惩罚 (nali_extra_lat=10 cycles)
- 参数: read_latency=150ns, bus_width=64B
实际实现: 不存在
差异影响: 低
- DMA 延迟已用
startup_latency + data_bytes / bandwidth近似建模 - DDR 内部行为对指令级仿真结果影响较小 (被 DMA pipeline 覆盖)
建议: 当前 DMA 简化模型已够用。DDR 详细建模放到优化阶段。
Cache 模型
设计要求: 4-way set-associative, LRU, miss 合并 实际实现: 不存在 差异影响: 低 (LLM 推理主要是大块连续数据, cache 命中率不是关键因素)
SAM 地址映射
设计要求: 地址解码 (LMEM/DDR/MMIO 地址空间) 实际实现: 不存在 差异影响: 无 (DMA/SDMA 指令已在 L3 层解码了地址, 不需要运行时解码)
02-multicore-interconnect.md
Bus 模型
设计要求:
- NxM master-slave, per-master-per-slave 延迟矩阵
- 距离延迟:
45 * (|x1-x2| + |y1-y2|) cycles - FCFS 仲裁
实际实现 (chip/bus.py:19-81):
- 2D mesh Manhattan 距离:
distance * latency_ns_per_hop - 统计注册 (total_transfers, total_bytes, hop_total)
- 无 FCFS 仲裁 (无队列, 即时计算延迟)
差异:
- 延迟单位: 设计用 cycles (
45 * distance), 实现用 ns (distance * latency_ns)- 不是错误: ns 更通用, 避免了与 bus_clock 的耦合
- 无仲裁: 设计要求 FCFS 仲裁, 实现为无竞争即时延迟
- 影响: 无法建模总线竞争导致的额外延迟
- 短期可接受: 多核 SDMA 竞争在 LLM 推理中不是主要瓶颈
- 无延迟矩阵: 设计要求 per-master-per-slave 矩阵, 实现用统一公式
- 影响: 无法建模非均匀拓扑
- 短期可接受: SG2262 8x8 mesh 是均匀的
建议: 当前实现功能正确, 仲裁和竞争建模可作为 Tier 2 扩展。
C2C Link
设计要求:
- 带宽受限链路:
delay = data_length / link_bw - ROB 有序提交
- 信用流控
- 参数: link_bw=11.2 GB/s, outstanding=128
实际实现 (interconnect.py): 空 stub (6 行注释)
差异影响: 高 (阻塞多芯片仿真) 建议: 由 07-chip-interconnect.md 的 PAXILink 模型替代实现。
CDMA
设计要求: SEND/RECV/FAKE_ALL_REDUCE, 信用流控, alpha-beta 模型 实际实现: 不存在 差异影响: 高 (阻塞多芯片仿真) 建议: 由 07-chip-interconnect.md 的 CDMA 引擎替代实现。
多核组装
设计要求:
- N 核 + Bus + DDR + C2C + CDMA
- 终止条件: 所有核 idle 100 cycles
实际实现 (top/single_chip.py:28-102):
- N 核 + Bus (无 DDR/C2C/CDMA)
- 终止条件: 事件队列为空
差异:
- 终止条件: 设计要求 idle 100 cycles, 实现用队列为空
- 实际影响很小: 当所有引擎完成, 不会再有新事件, 队列自然为空
- 100 cycles 保护是针对 SystemC 的, Python 版不需要
- 缺少 DDR/C2C/CDMA: 单芯片场景不需要, 多芯片时才需要
- 由 07 文档的 MultiChipSim 补充
03-command-parser.md
设计要求: 二进制 .BD/.GDMA 文件解析
实际实现: L3 层 instruction_emitter.py 直接生成指令对象, 不解析二进制文件
差异: 架构路线不同
- 设计: 从编译器输出的二进制文件解析指令
- 实现: 从模型配置自动生成指令 (更适合设计空间探索)
- 两条路线不冲突, 可以共存
建议: 当前路线正确。二进制解析作为备选后端保留。
04-integration.md
API 端点
设计要求: POST /api/instruction-simulate, 支持 binary/auto_generate 两种模式
实际实现: 通过 pipeline.py:run_g5_pipeline() 内部调用, 没有独立的 REST 端点
差异: API 层面未暴露指令级仿真作为独立端点 建议: 当前通过评估任务系统触发, 功能等价。独立端点可后续添加。
结果适配器
设计要求:
- per_instruction_events → step_metrics
- per_core_stats 聚合
- 瓶颈分析 (compute/memory/comm bound)
- 成本对接
实际实现 (adapter.py:31-177):
- 按 source_op_id 分组 SimRecord → StepMetrics: 完整
- t_compute (TIU+HAU), t_comm (SDMA), t_wait (span - compute - comm): 完整
- 瓶颈判断 (BW_BOUND / COMPUTE_BOUND): 完整
- MFU / MBU 计算: 完整
- trace_meta 包含 stats dump: 完整
差异: 无实质差异。实现完全覆盖设计要求。
一处细节: adapter 中瓶颈判断逻辑 (104-109 行) 有个边界问题:
# 当 comm_ns == 0 且 dma_total_ns > compute_ns 时, 应该是 BW_BOUND
# 但 elif 条件 "compute_ns > 0 and (compute_ns >= dma_total_ns or dma_total_ns <= 0)"
# 当 dma_total_ns > compute_ns > 0 时会落入 else: BW_BOUND, 结果正确
# 但 "dma_total_ns" 实际代表 DMA + idle 时间, 命名不准确
建议: 变量名 dma_total_ns 改为 other_ns 更清晰, 并增加 CDMA 引擎的统计。
文件组织
设计要求:
instruction_simulator/
core/ -> 实际: kernel/
engines/ -> 实际: 合并到根目录 tiu.py, dma.py, ...
memory/ -> 实际: memory.py (单文件)
interconnect/ -> 实际: chip/bus.py + interconnect.py (stub)
command/ -> 实际: L3 层
top/ -> 实际: top/ (一致)
profiler/ -> 实际: 合并到 adapter.py + kernel/stats.py
tpuperf_backend/ -> 不存在 (方案 B 未执行)
差异: 文件组织更扁平, 但功能等价。每个引擎一个文件而非 engine + delay 分离。 建议: 当前结构更简洁, 不需要调整。
05-implementation-plan.md
Phase 进度
| Phase | 计划 | 实际状态 | 说明 |
|---|---|---|---|
| Phase 0: TPUPerf 接入 | 3-5 周 | 未执行 | 选择了纯 Python 路线 |
| Phase 1: 仿真内核 | 3-4 周 | 完成 | SimKernel + SimObject + SimRecord + Stats |
| Phase 2: TIU/DMA 引擎 | 4-6 周 | 完成 | TIU (MM2_NN) + DMA + SDMA + HAU |
| Phase 3: 内存子系统 | 2-3 周 | 10% | 仅 LMEM budget 校验 |
| Phase 4: 多核互连 | 2-3 周 | 40% | Bus 完成, C2C/CDMA 待实现 |
| Phase 5: 指令生成器 | 3-4 周 | ~50% | Tiler + Emitter 框架存在 |
| Phase 6: 系统集成 | 2-3 周 | ~60% | Adapter 完成, API/前端待集成 |
验证策略
设计要求: 4 级验证 (单指令 → 单核 → 多核 → 端到端), 误差目标 <=1%
实际状态: 无自动化测试
- 没有与 TPUPerf 的对比验证
- 没有基准测试集
- 缺少回归测试
建议: 补充关键路径的单元测试 (TIU MM2_NN 公式验证, DMA 延迟验证)。
06-statistics-framework.md
Phase 1: Scalar + Vector Stats
设计要求: ScalarStat (inc, set_max, reset), VectorStat (inc, reset), StatGroup (嵌套)
实际实现 (kernel/stats.py:1-142): 完全匹配
逐项对照:
ScalarStat.inc(delta): 实现 (line 37-39)ScalarStat.set_max(v): 实现 (line 41-43)ScalarStat.reset(): 实现 (line 45-47)VectorStat.inc(label, delta): 实现 (line 67-69)VectorStat.reset(): 实现 (line 71-73)StatGroup.__init__(name, parent): 实现 (line 95-100)StatGroup.scalar(name, desc): 实现 (line 102-106)StatGroup.vector(name, desc): 实现 (line 108-112)StatGroup.dump(): 实现, 递归扁平化 (line 118-134)StatGroup.reset(): 实现, 递归重置 (line 136-141)
差异: 无
Phase 2: Distribution + Formula Stats
设计要求: DistributionStat (直方图), FormulaStat (派生指标) 实际实现: 未实现
差异影响: 低 (Phase 1 统计已满足当前需求) 建议: 按需实现。目前 VectorStat 可以近似 Distribution 功能。
模块集成
设计要求: 各引擎在执行指令时调用 stat.inc()
实际实现 (chip/core_subsys.py:74-149):
- CoreSubsys 注册了 core/tiu/dma/sdma/hau 五级 StatGroup
- TIU 统计: cmd_count, compute_cycles, init_cycles, total_flops, cycles_by_prec, cmd_by_op (line 86-100)
- DMA 统计: cmd_count, bytes_read, bytes_write, startup_ns, transfer_ns, bytes_by_dir (line 103-119)
- SDMA 统计: cmd_count, total_bytes, bus_latency_ns, transfer_ns, hop_total, cmd_by_type (line 122-136)
- HAU 统计: cmd_count, total_elements, total_cycles, cmd_by_op (line 139-149)
- Bus 统计: total_transfers, total_bytes, hop_total (bus.py line 43-54)
- Kernel 统计: total_events, total_sim_time_ns (sim_kernel.py line 30-36)
差异: 无。每个引擎的 stat 累加都在对应的 _try_issue_X 方法中正确调用。
需要修改/补充的项目
实现需要修改的地方
P1: adapter.py 增加 CDMA 引擎支持 (随 07 文档一起)
当前 adapter 只处理 TIU/DMA/SDMA/HAU 四种引擎。新增 CDMA 后需要:
# adapter.py, rec 分类处理中增加:
elif rec.engine == "CDMA":
cdma_duration_ns += duration
# CDMA 算作 comm 通信时间
同时 t_comm 应包含 SDMA + CDMA。
P2: TIU bank_conflict 项
tiu.py:93 的公式中有 bank_conflict 占位但未实际计算:
# 当前:
compute_cycles = m_iters * n_iters * k_iters
# 设计要求:
compute_cycles = m_iters * n_iters * (k_iters + bank_conflict)
短期可保持为 0, 长期需要基于操作数地址估算 bank conflict penalty。
P3: SimRecord 增加 engine="CDMA" 支持
kernel/sim_record.py 的 engine 字段需要接受 "CDMA" 值。
当前是 str 类型, 不需要改代码, 但需要在文档中记录合法值。
设计文档需要更新的地方
D1: 02-multicore-interconnect.md 添加引用
在 C2C / CDMA 章节添加引用:
> 注: C2C 和 CDMA 的详细建模已由 07-chip-interconnect.md (PAXI Link + Switch) 替代。
> 02 文档中的 alpha-beta 简化模型作为早期参考保留。
D2: 05-implementation-plan.md 更新进度
Phase 4 (多核互连) 的 C2C/CDMA 任务应引用 07 文档:
Phase 4 更新:
- Bus 模型: [已完成]
- C2C 链路: 由 07-chip-interconnect.md PAXILink 替代 [待实现]
- CDMA 引擎: 由 07-chip-interconnect.md CDMA Engine 替代 [待实现]
- 多芯片组装: 由 07-chip-interconnect.md MultiChipSim 替代 [待实现]
D3: 01-memory-subsystem.md 标注实现状态
在各章节标注当前实现状态:
2. LMEM 模型 [状态: 仅 budget 校验, 无时序模型]
3. DDR 模型 [状态: 未实现, DMA 简化模型替代]
4. Cache 模型 [状态: 未实现]
5. SAM 地址映射 [状态: 未实现, L3 层已解码地址]
D4: 04-integration.md 更新文件组织
更新文件组织章节, 反映实际结构:
实际文件组织 (与设计对比):
kernel/ (对应设计的 core/)
chip/ (对应设计的 interconnect/ 部分)
top/ (一致)
tiu.py, dma.py, sdma.py, hau.py (对应设计的 engines/, 合并为单文件)
memory.py (对应设计的 memory/, 简化为单文件)
adapter.py (对应设计的 profiler/gantt_adapter.py)
优先级排序
| 优先级 | 项目 | 类型 | 依赖 |
|---|---|---|---|
| P0 | PAXILink + CDMA 实现 (07 文档) | 新功能 | 无 |
| P0 | Switch 模型实现 (07 文档) | 新功能 | PAXILink |
| P0 | MultiChipSim 组装 (07 文档) | 新功能 | PAXILink + Switch |
| P1 | adapter.py 增加 CDMA 引擎 | 修改 | CDMA 实现 |
| P1 | 设计文档更新 (D1-D4) | 文档 | 无 |
| P2 | TIU bank_conflict 估算 | 增强 | 无 |
| P2 | Bus 仲裁 (FCFS) | 增强 | 无 |
| P3 | LMEM 时序模型 | 增强 | 无 |
| P3 | DDR 详细模型 | 增强 | 无 |
| P4 | Cache 模型 | 增强 | DDR 模型 |
| P4 | DistributionStat / FormulaStat | 增强 | 无 |
| P4 | 自动化测试 + 回归验证 | 质量 | 无 |