跳到主要内容

08 - 设计文档与实现差异分析

对比 g5-simulator-design/ 的 6 篇设计文档与 perf_model/L4_evaluation/g5/ 的实际实现, 列出所有差异、缺失项和需要修改的地方。

分析日期: 2026-02-25


总览

实现覆盖率

设计文档实现状态覆盖率
01-memory-subsystem仅 budget 校验, 无时序模型~10%
02-multicore-interconnectBus 完整, C2C/CDMA 未实现~40%
03-command-parserL3 层指令生成存在, 二进制解析部分~50%
04-integration结果适配器完整, API 端点待确认~60%
05-implementation-planPhase 1-2 完成, Phase 3-6 部分完成~55%
06-statistics-frameworkPhase 1 完整, Phase 2 未开始~70%

文件对照表

设计中的模块设计中的文件路径实际文件路径状态
EventSchedulercore/event_scheduler.pykernel/sim_kernel.py完整 (路径不同)
Signal/Portcore/signal.py不存在未实现 (用 callback 替代)
FIFO/Semaphorecore/不存在未实现 (不需要)
TIU Engineengines/tiu_engine.py + tiu_delay.pytiu.py合并为单文件
DMA Engineengines/dma_engine.py + dma_delay.pydma.py合并为单文件
SDMA Engine-sdma.py实现 (设计中未单独规划)
HAU Engine-hau.py实现 (设计中未单独规划)
LMEM Modelmemory/lmem.pymemory.py仅 budget 校验
DDR Modelmemory/ddr.py不存在未实现
Cache Modelmemory/cache.py不存在未实现
SAMmemory/address_map.py不存在未实现
Bus Modelinterconnect/bus.pychip/bus.py完整 (路径不同)
C2C Linkinterconnect/c2c.pyinterconnect.py (空 stub)未实现
CDMAinterconnect/cdma.py不存在未实现
Binary Parsercommand/binary_parser.pyL3 层 binary_parser.py部分实现
Instruction Gencommand/instruction_gen.pyL3 层 instruction_emitter.py部分实现
Single Coretop/single_core.pytop/single_chip.py重命名, 已完整
Multi Coretop/multi_core.py不存在未实现
Profilerprofiler/profiler.py集成到 kernel/stats.py合并实现
Gantt Adapterprofiler/gantt_adapter.pyadapter.py合并实现
TPUPerf Backendtpuperf_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 仲裁 (无队列, 即时计算延迟)

差异:

  1. 延迟单位: 设计用 cycles (45 * distance), 实现用 ns (distance * latency_ns)
    • 不是错误: ns 更通用, 避免了与 bus_clock 的耦合
  2. 无仲裁: 设计要求 FCFS 仲裁, 实现为无竞争即时延迟
    • 影响: 无法建模总线竞争导致的额外延迟
    • 短期可接受: 多核 SDMA 竞争在 LLM 推理中不是主要瓶颈
  3. 无延迟矩阵: 设计要求 per-master-per-slave 矩阵, 实现用统一公式
    • 影响: 无法建模非均匀拓扑
    • 短期可接受: SG2262 8x8 mesh 是均匀的

建议: 当前实现功能正确, 仲裁和竞争建模可作为 Tier 2 扩展。

设计要求:

  • 带宽受限链路: 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)
  • 终止条件: 事件队列为空

差异:

  1. 终止条件: 设计要求 idle 100 cycles, 实现用队列为空
    • 实际影响很小: 当所有引擎完成, 不会再有新事件, 队列自然为空
    • 100 cycles 保护是针对 SystemC 的, Python 版不需要
  2. 缺少 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.pyengine 字段需要接受 "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)

优先级排序

优先级项目类型依赖
P0PAXILink + CDMA 实现 (07 文档)新功能
P0Switch 模型实现 (07 文档)新功能PAXILink
P0MultiChipSim 组装 (07 文档)新功能PAXILink + Switch
P1adapter.py 增加 CDMA 引擎修改CDMA 实现
P1设计文档更新 (D1-D4)文档
P2TIU bank_conflict 估算增强
P2Bus 仲裁 (FCFS)增强
P3LMEM 时序模型增强
P3DDR 详细模型增强
P4Cache 模型增强DDR 模型
P4DistributionStat / FormulaStat增强
P4自动化测试 + 回归验证质量