仿真实验方法¶
可信的仿真结论来自“问题—模型—校准—解释”的闭环。配置能跑通只是起点;真正困难的是确认模拟器测到的量与真实问题属于同一层抽象。
标准流程¶
flowchart LR
Q[提出可证伪问题] --> M[选择最小充分模型]
M --> W[固定 Workload 与 ROI]
W --> B[建立 Baseline]
B --> C[用微基准校准]
C --> S[单变量 Sweep]
S --> A[归因与敏感性分析]
A --> R[实机/另一模型交叉验证]
R -. 修正参数或假设 .-> M 1. 把问题写成可证伪假设¶
不写“研究更大的 L2”,而写:
在固定 A100-like 核心与 HBM 带宽时,把 L2 从 20 MB 增加到 40 MB,会因为减少目标 GEMM/Attention 的 HBM 流量而降低执行周期;若 L2 Miss 与 HBM 读流量没有下降,则假设不成立。
假设中应出现:工作负载、固定项、自变量、因变量与预期机制。
2. 固定 Workload 与 ROI¶
- 明确是完整应用、一个 iteration、一个 layer 还是单 kernel。
- 记录动态 shape、输入数据和控制流是否会改变 Trace。
- 区分冷启动、Warmup 与稳定阶段。
- 模型太慢时用采样/截取,但确认 ROI 仍代表目标瓶颈。
3. 先建立可以解释的 Baseline¶
Baseline 至少做三种守恒检查:
- 功能守恒:输出或指令数是否符合预期。
- 流量守恒:关键 Tensor 大小与各层读写量是否数量级一致。
- 时间守恒:总周期能否由计算、访存与 Stall 分类近似解释。
4. 用微基准校准单一机制¶
| 机制 | 微基准 | 校准指标 |
|---|---|---|
| 算术流水线 | 依赖链与独立指令流 | latency、reciprocal throughput |
| Cache | 不同 Working Set 与步长 | 容量拐点、命中率、延迟 |
| HBM/DDR | 顺序/随机、读/写、并发度 | 可达带宽、饱和点 |
| Warp/线程调度 | 改变 occupancy 与依赖 | Eligible Warp、Stall、IPC |
| NoC/互连 | 改变源宿与注入率 | 吞吐、拥塞、尾延迟 |
不要用一个端到端模型同时拟合十几个未知参数;那只能得到多组都“看似匹配”的配置。
5. Sweep 时保留完整上下文¶
推荐输出长表而不是只保存最终图片:
workload,shape,precision,sim_commit,config_hash,l2_mb,hbm_gbps,cycles,l2_miss,hbm_read_bytes
gemm,4096x4096x4096,fp16,<sha>,<hash>,20,1555,...,...,...
gemm,4096x4096x4096,fp16,<sha>,<hash>,40,1555,...,...,...
每次只改变一个主变量;如果做多因子设计,显式记录交互项,避免把频率、带宽和核心数同时扩大后仍声称是某一个因素导致提升。
常见陷阱¶
| 陷阱 | 为什么危险 | 修正方式 |
|---|---|---|
| 用默认配置代表某产品 | 参数可能来自不同代际或只是示例 | 对照官方规格和微基准逐项校准 |
| 只比较总周期 | 相同总周期可能来自不同瓶颈 | 同看流量、命中率、队列与 Stall |
| 把 Trace 当作可变程序 | Trace 固定了控制流与部分动态行为 | 改 ISA/输入时重新采集或换执行驱动模型 |
| 用峰值带宽作可达带宽 | 协议、访问粒度和并发都会打折 | 以匹配模式的实测微基准校准 |
| 把误差均值当可信度 | 正负误差会抵消 | 报 MAPE、分位数、最大误差和异常点 |
| 从一个模型推广到所有 AI | 算子形状与复用模式差异很大 | 建立覆盖 Compute/Memory/Control 的 workload suite |
最小结论模板¶
## 结论
- 问题与假设:
- Workload / ROI:
- Baseline 与校准误差:
- 自变量范围:
- 观测到的变化:
- 机制证据(流量/队列/Stall):
- 对真实硬件的适用边界:
- 尚未建模的因素:
- 下一步证伪实验: