SimpleScalar使用说明 1基本内容介绍
SimpleScalar是一组体系结构仿真器工具他可以模拟一个程序在某种体系结构机器上的具体执行过程给出该体系结构的功能和性能参数
SimpleScalar工具集的组成如下
fortran语言的代码先转成C语言的代码普通的C程序需要利用工具集中自带的gcc编译成二进制代码仿真器可以直接执行二进制代码
SimpleScalar仿真器的特点如下 指令格式可扩展能够支持多个指令集 可以运行在大多数类UNIX以及NT平台上 提供了大量参数来描述执行细节 包括多个仿真器 它们是 sim-fast
sim
-
safesim-cachesim-cheetahsim-profilesim-bpredsim-eio和sim-outorder
功能和特点如下
sim-fast 它是速度最快的仿真器但是作为代价它不进行指令的错误检查所以当运行过程中出现错误时你无法确定是仿真器本身出错还是指令出现了错误
sim-safe 是SimpleScalar所有仿真器中最简单的一个功能仿真器它进行指令错误检查
sim-profile 可以使用符号和地址来产生程序代码的简要分析
sim-cache 在这个仿真其中加入了cache用户可以对cache及 TLB 进行设置支持两级的cache和一级的TLB第一级cache和TLB均分为数据和指令两部分
sim-cheetah sim-cheetah是为了Cheetah而实现的一个仿真器驱动Cheetah是一个cache的仿真包它可以对一个程序的某一次运行中的多级cache的仿真进行有效的仿真此外它还可以对某一级的组相连和全相连cache进行仿真
sim-bpred它是一个分支预测机制的分析器
sim-eio 它是一个最简单的仿真器进行指令检查主要是追求程序执行再现的清晰性而不是执行的速度EIO trace and checkpoint generator external IO tracing module
sim-outorder 实现了对一个非常详细的支持乱序发射拥有一个二级的memory和推断执行的超标量处理器的仿真本身拥有很高的性能而且对整个程序执行期间流水线的状态都进行了记录基本上包括了以上各种仿真器的全部功能
SimpleScalar的仿真体系结构 指令集介绍
类MIPSDLX指令集增加了新的地址模式去掉了延迟槽的功能 同时支持大尾端小尾端两种格式 指令字长64位
16位用于指令说明和扩展8位寄存器描述符最多可支持256个通用寄存器 指令类型有控制指令loadstore指令整数算术逻辑指令浮点指令以及syscall等具体指令描述见实验指导书的附录
寄存器及虚拟内存的状态如下
寄存器的功能说明如下 仿真器使用方法
在linux环境中进入SimpleScalar的安装目录输入如下格式指令
sim-*** [-sim opts] program [-program opts] 相关的指令还有 编译一个C语言程序
sslittle-na-sstrix-gcc -g -O -o foo fooc -lm 编译一个FORTRAN程序
ssbig-na-sstrix-f77 -g -O -o foo foof -lm 编译一个SimpleScalar汇编语言程序
ssbig-na-sstrix-gcc -g -O -o foo foos –lm sim-outorder仿真器的使用 sim-outorder的指令执行流程
sim-outorder的动态调度方法基本上是加上了分支预测的Tomasulo算法它的关键部件是寄存器更新部件RUU和存取缓冲队列LSQ这两个部件的说明如下
RUU
RUU负责寄存器间的信息交换和同步它包含保留站和再定序缓冲的功能指令从Dispatch段进入分配RUU在commit段释RUU作到乱序发射顺序提交RUU被组织成一个循环队列之间通过总线交换信息
LSQ
LSQ负责存储器间的同步和信息交换它包含了LOADSTORE指令指令被分成有效地址计算指令和真正的存取原语指令前者位于RUU中
流水段描述
取指段fetchcache中取指令并把它放入IFQ中判断下一条指令是否是预测执行的指令同时接收其他段送来的预测失败信息
分派指令段 dispatch
从LSQ中取指令解码重命名寄存器分配RUU和LSQ支持早期的分支预测失败的探测
发射段schedule executionmem
指令执行输出寄存器/存储器写回事件 写回段write-back
执行写回事件发出操作数可用信息到总线触发分支预测失败的恢复事件 提交段commit
指令结束释放RUU和LSQ 指令执行时流水线状态描述
利用仿真器自带的PERL程序可以看outorder的流水线中每个cycle的状态记录方法如下
在执行时加入-ptrace 参数将结果存入file指定的文件中
用pipeviewpl 来浏览
sim-outorder中的设置选项及参数描述
sim-outorder包括了几乎所有的仿真器参数其他仿真器都是它的子集现对它的参数按类进行说明
使用格式sim-outorder -option executable_benchmark argument
option attributes default description -config 从一个文件中载入设置 -dumpconfig 将目前的设置写入文件中 -h turefalse false 打印帮助信息
-v turefalse false 详细地显示执行的所有指令的列表 -d turefalse false 显示调试信息 -I turefalse false 启动 Dlite 调试器 -seed 1 设置产生随机数的种子 -q turefalse false 进行初始化并立即结束 -chkpt 从一个文件中恢复 EIO 跟踪程序的执行 -redirsim 将仿真器的输入写入一个文件中
-redirprog 将benchmark程序的输入写入到一个文件中 -nice 0 设置仿真器的调度优先级 -inst 0 设置仿真器最多执行的指令条数 -fsstfwd 0 开始计时前跳过的指令的条数 -ptrace 生成流水线的状态信息
filenamestdoutstderr sim-outorder的程序执行统计参数描述
参数表示 参数说明 的指令条数
sim_num_insn 确认 committed
sim_num_loads
sim_num_refs 确认的 loadstore的个数
sim_num_stores
确认的load操作的个数 确认的store操作的个sim_elapsed_time 程
数 sim_num_branches 确认的分支操作的个数
序执行的时间 以秒为单位
sim_inst_rate 程序执行的速度 条指令秒
一共执行的指令的条数
sim_total_loads
sim_total_insn
sim_total_refs 一共执行的loadstore的次数
一共执行的load个数 sim_total_branches
sim_IPC
sim_total_stores 一共执行的store个数
sim_cycle 一共执
sim_CPI
平
一共执行的branch个数
行的周期数 平均每个周期执行的指令条数
sim_exec_BW
均每条指令执行的周期数 平均每个周期实际执行的指令
sim_IPB
平均多少条指
条数 包括分支预测错误时执行的无用的指令 令中有一条分支指令
IFQ_count cumulative IFQ occupancy
ifq_occupancy avg
IFQ_fcount cumulative IFQ full count
IFQ occupancy insts
ifq_latency
ifq_rate IFQ的平均发射速率 指令周期
ifq_fullRUU_count
avf IFQ occupant latency cycles
fraction of time cycles IFQ was full
RUU_fcount
ruu_occupancy
7404
ruu_rate RUU的平均发ruu_full
射速率 指令周期
ruu_latency
LSQ_count LSQ_fcount lsq_occupancy
lsq_latency
lsq_rate LSQ的平均发射速率 指令周期 lsq_full
sim_slip
avg_sim_slip
bpred_bimodlookups 一共进行了多少次分支预测
bpred_bimodaddr_hits
bpred_bimodupdates 分支预测表更新的次数
分支目标地址预测命中的次数 预测命中的次数
bpred_bimoddir_hirts 分支目标方向
bpred_bimodmisses 分支预测错误的次数
bpred_bimodjr_hits
JR型分支目标地址预测命中的次数
JR型分支出现的次数
non_RAS JR型分支目标地址预测命中的
non_RAS JR型分支出现的次数
bpred_bimodjr_seen
bpred_bimodjr_non_ras_hitsPP
次数
bpred_bimodjr_non_ras_seenPP
bpred_bimodbpred_addr_rate 分支目标地址预测的命中率 bpred_bimodbpred_dir_rate
分支目标方向预测的命中率
bpred_bimodbpred_jr_rate JR型分支目标地址预测的命中率
bpred_bimodbpred_jr_non_ras_ratePP non_RAS JR型分支目标地址预测的命中率
bpred_bimodretstack_pushes 向RAS中压入的地址的个数
bpred_bcom
bpred_bimodretstack_pops 从RAS中弹出的地址的个数
RAS 预测使用的总次数
bpred_bcom RAS 预测命中的次数
il1accesses
il1访问的
bpred_bcom RAS 预测的命中率 次数
il1hits
il1命中的次数 il1misses il1不命中的次数 il1writebacks il1写回的次数 il1miss_rate il1失效率 不命中
il1replacements il1替换的次数 il1invalidations il1无效的次数 次数访问次数
il1repl_rate il1替换率 替换次数访问次数
il1inv_rate
il1无效率
il1wb_rate il1写回率 写回次数访问次数 无效次数访问次数
dl1hits
dl1accesses dl1访问的次数
dl1命中的次数 dl1misses dl1不命中的次数
dl1writebacks dl1写回的次数 dl1miss_rate dl1失效率 不命中
dl1replacements dl1替换的次数 dl1invalidations dl1无效的次数 次数访问次数
dl1repl_rate dl1替换率 替换次数访问次数
dl1wb_rate dl1写回率 写回次数访问次数 无效次数访问次数
ul2hits
dl1inv_rate dl1无效率
ul2accesses ul2访问的次数
ul2命中的次数 ul2misses ul2不命中的次数
ul2writebacks ul2写回的次数 ul2miss_rate ul2失效率 不命中
ul2replacements ul2替换的次数 ul2invalidations ul2无效的次数 次数访问次数
ul2repl_rate ul2替换率 替换次数访问次数
ul2inv_rate
ul2无效率
ul2wb_rate ul2写回率 写回次数访问次数 无效次数访问次数
itlbaccesses itlb访问的次数
itlbmisses itlb不命中的次数
itlbwritebacks
itlb写回
itlbhits itlb命中的次数
itlbreplacements itlb替换的次数
的次数 itlbinvalidations itlb无效的次数 itlbmiss_rate itlb
失效率 不命中次数访问次数
次数
itlbwb_rate
itlbrepl_rate itlb替换率 替换次数访问itlb写回率 写回次数访问次数
itlbinv_rate itlb无效率 无效次数访问次数
dtlbaccesses dtlb访问的次数 dtlbmisses dtlb不命中的次数
dtlbwritebacks
dtlbhits dtlb命中的次数
dtlbreplacements dtlb替换的次数
dtlbinvalidations dtlb
dtlb写回的次数
无效的次数
dtlbmiss_rate dtlb失效率 不命中次数访问次数
dtlbwb_rate
dtlbrepl_rate dtlb替换率 替换次数访问次数 dtlb写回率 写回次数访问次数 次数访问次数
dtlbinv_rate dtlb无效率 无效
sim_invalid_addrs
ld_text_base 程序的代码段的基地址 ld_text_size 程序的代码段
的大小 ld_data_base 程序的数据段的基地址
ld_data_size 开始时
程序的数据端的大小
ld_stack_base 程序的堆栈的基地址 高端地址
ld_prog_entry 程序的
ld_stack_size 开始时程序的堆栈的大小 入口点 初始的 pc值
ld_environ_base 程序环境的基地址
ld_target_big_endian benchmark程序是小尾端还是大尾端 非零表示大围
mempage_count 一共分配的页数
memptab_misses
mempage_mem
程
端
序运行过程中分配内存的大小 的次数
访问第一级页表的失效memptab_miss_rate 第
memptab_accesses 访问页表的总次数
一级页表的失效率
因篇幅问题不能全部显示,请点此查看更多更全内容