TraceSim 是一个面向研究用途的 trace-driven、乱序 CPU/内存模拟器。当前版本重点支持三类实验:
- 分支预测器
- Cache 预取器
- Cache 替换策略
它不是 gem5 或 ChampSim 的完整替代品,但已经具备做基础性能归因和基础预取评估所需的最小骨架:有状态 cache、在途 miss 跟踪、未来回填、可插拔组件接口,以及简化版 top-down 归因。
当前代码大致分成四块:
Frontend- 负责从 trace/ref model 取指
- 做 I-Cache 访问
- 做分支预测与 redirect / mispredict stall
TraceSim- 负责主循环
- 维护 ROB、IQ、寄存器 ready time
- 串起前端、后端、Profiler、MemSubsystem
LoadStoreUnit- 负责 load/store 发射
- 处理 store dependence 与 STLF
- 通过
MemSubsystem发起 D-Cache 访问
MemSubsystem- 统一管理 I-Cache / D-Cache / LLC
- 管理 prefetch queue
- 处理 request / merge / future return / fill
接口文件:
当前内置:
GSHAREALWAYS_TAKENALWAYS_NOT_TAKENPROBABILISTICPERFECT
其中:
PROBABILISTICPERFECT
属于 oracle 模式,不走真实 BPU 对象。
接口文件:
当前内置:
NONENEXT_LINEPC_STRIDE
预取器只生成候选地址,真正能不能发出、是否被过滤、是否会占用在途资源,交给 MemSubsystem 和 Cache 决定。
接口文件:
当前内置:
LRUFIFO
当前的存储层次已经不是“纯 hit/miss 固定延迟函数”,而是有状态模型:
- 维护 set / way / tag / valid
- 维护 replacement metadata
- 维护 in-flight request table
- 支持 demand miss merge
- 支持 prefetch request 走正常 request/fill 路径
- line 返回前不会被错误当成 hit
- 支持 useful / useless / late prefetch 这类基础统计
当前模型仍然是简化版,不等同于完整的现代处理器内存系统。比如现在还没有:
- 独立的 prefetch MSHR 配额
- 多级 prefetch 协同策略
- 很细的 bandwidth / port arbitration
当前 Profiler 输出的桶包括:
RetiringBad SpeculationFrontend BoundMemory BoundCore BoundOther/Bubbles
目前的核心口径是:
- 只要该周期有退休,归到
Retiring - 如果 ROB head 因 load 等内存,归到
Memory Bound - 其他后端停顿归到
Core Bound - 前端 stall 且原因是误预测,归到
Bad Speculation - 其他前端 stall 归到
Frontend Bound
这是一个有意简化过的、适合当前 trace 模型的实现,不是 Intel 原版 top-down 的完全复刻。
编译:
make -j4运行一个 trace 模式样例:
./a.out --mode trace binary/parser-125k.bin --max-insts 200000如果只想快速看默认配置下的统计,改 trace_sim/SimConfig.h 后重新编译即可。
- 架构总览:doc/Architecture.md
- 分支预测:doc/BranchPrediction.md
- 预取实现:doc/Prefetching.md
- 替换策略:doc/CachePolicy.md
- Top-down 归因:doc/TopDownGuide.md
- 扩展接口:doc/EXTENDING_COMPONENTS.md