trace

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 3, 2026 License: MIT Imports: 12 Imported by: 0

Documentation

Overview

Package trace 提供 ChampSim trace 文件的读取功能

ChampSim 使用二进制 trace 格式记录程序执行的指令序列。 每条指令包含 PC、分支信息、寄存器和内存操作数。

Trace 格式支持两种变体: - input_instr: 标准格式 (2 个目标操作数) - cloudsuite_instr: CloudSuite 格式 (4 个目标操作数 + ASID)

Index

Examples

Constants

View Source
const (
	// DefaultBufferSize 默认批量读取大小
	DefaultBufferSize = 128

	// DefaultRefreshThreshold 默认刷新阈值
	DefaultRefreshThreshold = 1
)
View Source
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) Close

func (r *BufferedTraceReader) Close() error

Close 关闭reader

func (*BufferedTraceReader) EOF

func (r *BufferedTraceReader) EOF() bool

EOF 返回是否已到达trace末尾

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) Close

func (r *BulkTraceReader) Close() error

Close 关闭 trace 文件

func (*BulkTraceReader) EOF

func (r *BulkTraceReader) EOF() bool

EOF 返回是否已到达 trace 末尾

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) Close

func (r *SharedTraceReader) Close() error

Close 关闭reader

func (*SharedTraceReader) EOF

func (r *SharedTraceReader) EOF() bool

EOF 返回是否到达末尾

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
)

func (TraceFormat) InstrSize

func (tf TraceFormat) InstrSize() int

InstrSize 返回该格式下每条指令的字节大小

func (TraceFormat) String

func (tf TraceFormat) String() string

String 返回格式的字符串表示

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)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL