Documentation
¶
Overview ¶
Package trace 提供 ChampSim trace 文件的读取功能
ChampSim 使用二进制 trace 格式记录程序执行的指令序列。 每条指令包含 PC、分支信息、寄存器和内存操作数。
Trace 格式支持两种变体: - input_instr: 标准格式 (2 个目标操作数) - cloudsuite_instr: CloudSuite 格式 (4 个目标操作数 + ASID)
Index ¶
- Constants
- type BufferedTraceReader
- type BulkTraceReader
- type CloudSuiteInstr
- type InputInstr
- type SharedTraceData
- type SharedTracePool
- type SharedTraceReader
- type TraceBlock
- type TraceFormat
- type TraceReader
- func NewBufferedTraceReader(filename string, cpuID uint8, format TraceFormat, preloadSize, refillSize int) (TraceReader, error)
- func NewSharedTraceReader(filename string, cpuID uint8, format TraceFormat) (TraceReader, error)
- func NewTraceReader(filename string, cpuID uint8, format TraceFormat) (TraceReader, error)
Examples ¶
Constants ¶
const ( // DefaultBufferSize 默认批量读取大小 DefaultBufferSize = 128 // DefaultRefreshThreshold 默认刷新阈值 DefaultRefreshThreshold = 1 )
const ( // BlockSize 每个trace块的大小(2MB) BlockSize = 2 * 1024 * 1024 // EstimatedInstrSize 每条指令的估计大小(字节) EstimatedInstrSize = 100 // InstrsPerBlock 每个块包含的指令数(约20000条) InstrsPerBlock = BlockSize / EstimatedInstrSize // LoadAhead 预加载块数 LoadAhead = 2 // MaxCachedBlocks 最大缓存块数 MaxCachedBlocks = 100 )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type BufferedTraceReader ¶
type BufferedTraceReader struct {
// contains filtered or unexported fields
}
BufferedTraceReader 大缓冲区trace读取器 预加载大量指令到内存,减少实时I/O和解压开销
func (*BufferedTraceReader) ReadInstruction ¶
func (r *BufferedTraceReader) ReadInstruction() (*instruction.OOOModelInstr, error)
ReadInstruction 读取下一条指令
func (*BufferedTraceReader) Warmup ¶
func (r *BufferedTraceReader) Warmup() error
Warmup 预热 trace reader,代理到底层 reader
type BulkTraceReader ¶
type BulkTraceReader struct {
// contains filtered or unexported fields
}
BulkTraceReader 批量 trace 读取器
使用批量读取和缓冲策略提升性能: - 一次读取 128 条指令到缓冲区 - 当缓冲区剩余 <= 1 条时触发下一次读取 - 自动设置分支目标地址
func (*BulkTraceReader) ReadInstruction ¶
func (r *BulkTraceReader) ReadInstruction() (*instruction.OOOModelInstr, error)
ReadInstruction 读取下一条指令
func (*BulkTraceReader) Warmup ¶
func (r *BulkTraceReader) Warmup() error
Warmup 预热 trace reader,提前加载第一批数据
type CloudSuiteInstr ¶
type CloudSuiteInstr struct {
// IP 指令地址
IP uint64
// IsBranch 指示该指令是否为分支
IsBranch uint8
// BranchTaken 分支是否跳转
BranchTaken uint8
// DestRegisters 目标寄存器编号 (最多 4 个, SPARC)
DestRegisters [instruction.NumInstrDestinationsSparc]uint8
// SrcRegisters 源寄存器编号 (最多 4 个)
SrcRegisters [instruction.NumInstrSources]uint8
// DestMemory 写内存地址 (最多 4 个)
DestMemory [instruction.NumInstrDestinationsSparc]uint64
// SrcMemory 读内存地址 (最多 4 个)
SrcMemory [instruction.NumInstrSources]uint64
// ASID 地址空间标识符 [虚拟ASID, 物理ASID]
// 用于支持虚拟化和多地址空间模拟
ASID [2]uint8
}
CloudSuiteInstr 定义 CloudSuite trace 格式的指令
CloudSuite 是一组云计算基准测试,其 trace 格式扩展了标准格式: - 支持 SPARC 架构的 4 个目标操作数 - 包含 ASID (Address Space ID) 用于多地址空间模拟
布局 (74 字节总计):
- IP: 8 字节
- IsBranch, BranchTaken: 各 1 字节
- DestRegisters: 4 字节
- SrcRegisters: 4 字节
- DestMemory: 32 字节
- SrcMemory: 32 字节
- ASID: 2 字节
type InputInstr ¶
type InputInstr struct {
// IP 指令地址 (Program Counter)
IP uint64
// IsBranch 指示该指令是否为分支
// 注意: ChampSim 会根据寄存器读写模式重新识别分支类型
IsBranch uint8
// BranchTaken 分支是否跳转 (仅对分支指令有效)
BranchTaken uint8
// DestRegisters 目标寄存器编号 (最多 2 个)
// 0 表示无寄存器
DestRegisters [instruction.NumInstrDestinations]uint8
// SrcRegisters 源寄存器编号 (最多 4 个)
// 0 表示无寄存器
SrcRegisters [instruction.NumInstrSources]uint8
// DestMemory 写内存地址 (最多 2 个)
// 0 表示无内存操作
DestMemory [instruction.NumInstrDestinations]uint64
// SrcMemory 读内存地址 (最多 4 个)
// 0 表示无内存操作
SrcMemory [instruction.NumInstrSources]uint64
}
InputInstr 定义标准 ChampSim trace 格式的指令
这是 ChampSim 最常用的 trace 格式,对应 trace_instruction.h 中的 input_instr。 每个字段都是固定大小,适合二进制读取。
布局 (64 字节总计):
- IP: 8 字节
- IsBranch, BranchTaken: 各 1 字节
- DestRegisters: 2 字节
- SrcRegisters: 4 字节
- DestMemory: 16 字节
- SrcMemory: 32 字节
type SharedTraceData ¶
type SharedTraceData struct {
// contains filtered or unexported fields
}
SharedTraceData 共享的trace数据
func (*SharedTraceData) RegisterReader ¶
func (s *SharedTraceData) RegisterReader(reader *SharedTraceReader)
RegisterReader 注册reader
type SharedTracePool ¶
type SharedTracePool struct {
// contains filtered or unexported fields
}
SharedTracePool 全局trace池
func (*SharedTracePool) GetOrCreateSharedTrace ¶
func (p *SharedTracePool) GetOrCreateSharedTrace(filename string, format TraceFormat) (*SharedTraceData, error)
GetOrCreateSharedTrace 获取或创建共享trace
func (*SharedTracePool) ReleaseSharedTrace ¶
func (p *SharedTracePool) ReleaseSharedTrace(filename string, reader *SharedTraceReader) error
ReleaseSharedTrace 释放共享trace引用
type SharedTraceReader ¶
type SharedTraceReader struct {
// contains filtered or unexported fields
}
SharedTraceReader 每个CPU的trace读取器
func (*SharedTraceReader) ReadInstruction ¶
func (r *SharedTraceReader) ReadInstruction() (*instruction.OOOModelInstr, error)
ReadInstruction 读取下一条指令 热路径:完全本地操作,无锁,无原子操作,无循环,无除法
func (*SharedTraceReader) Warmup ¶
func (r *SharedTraceReader) Warmup() error
Warmup 预热 trace reader,提前加载第一个数据块 这样第一次 ReadInstruction() 时不会因为解压而阻塞
type TraceBlock ¶
type TraceBlock struct {
// contains filtered or unexported fields
}
TraceBlock 表示一个2MB的trace数据块(只读,可共享)
type TraceFormat ¶
type TraceFormat int
TraceFormat 定义 trace 文件的格式类型
const ( // FormatStandard 标准 input_instr 格式 FormatStandard TraceFormat = iota // FormatCloudSuite CloudSuite 格式 FormatCloudSuite )
type TraceReader ¶
type TraceReader interface {
// ReadInstruction 读取下一条指令
// 返回 nil, io.EOF 表示 trace 结束
ReadInstruction() (*instruction.OOOModelInstr, error)
// EOF 返回是否已到达 trace 末尾
EOF() bool
// Close 关闭 trace 文件
Close() error
// Warmup 预热 trace reader,提前加载数据但不改变读取位置
// 用于避免第一次读取时的延迟(例如解压缩)
Warmup() error
}
TraceReader 定义 trace 读取器接口
Example ¶
ExampleTraceReader 演示如何使用 TraceReader
// 打开 trace 文件
reader, err := NewTraceReader("trace.champsimtrace.xz", 0, FormatStandard)
if err != nil {
fmt.Printf("Failed to open trace: %v\n", err)
return
}
defer reader.Close()
// 读取指令
for i := 0; i < 10; i++ {
instr, err := reader.ReadInstruction()
if err != nil {
fmt.Printf("Error reading instruction: %v\n", err)
break
}
fmt.Printf("IP: 0x%x, Branch: %v, Load: %v, Store: %v\n",
instr.IP, instr.IsBranch, instr.IsLoad(), instr.IsStore())
}
func NewBufferedTraceReader ¶
func NewBufferedTraceReader(filename string, cpuID uint8, format TraceFormat, preloadSize, refillSize int) (TraceReader, error)
NewBufferedTraceReader 创建大缓冲区trace读取器 preloadSize: 初始预加载指令数(默认100000) refillSize: 缓冲区低于此值时补充(默认50000)
func NewSharedTraceReader ¶
func NewSharedTraceReader(filename string, cpuID uint8, format TraceFormat) (TraceReader, error)
NewSharedTraceReader 创建共享trace读取器
func NewTraceReader ¶
func NewTraceReader(filename string, cpuID uint8, format TraceFormat) (TraceReader, error)
NewTraceReader 创建 trace 读取器
支持的文件格式:
- .champsimtrace (未压缩)
- .champsimtrace.gz (gzip 压缩)
- .champsimtrace.xz (xz 压缩, 需要系统安装 xz)
参数:
- filename: trace 文件路径
- cpuID: CPU 核心 ID
- format: trace 格式 (FormatStandard 或 FormatCloudSuite)