sim-outorder 5级超标量流水线模拟器介绍

来源:互联网 发布:排名前十的网络作家 编辑:程序博客网 时间:2024/06/10 05:51

 sim-outorder的五级流水线

sim-outorder 是一个具有完整功能的模拟程序,在sim-outorder中使用了几乎所有的模拟资源。

具体乱序执行策略:
有五种很重要的功能单元支持sim-outorder对指令序列的乱序执行:保留站与重定序缓冲(RUU)、Load/Store队列(LSQ)、取指队列、输入输出相关链和寄存器忙闲表。它们在simplescalar中是通过五种数据结构来实现的。

RUU单元实现寄存器的同步和通讯功能,它将再定序缓冲和保留站统一起来,作为一个循环队列来管理。RUU队列记录了指令的操作类型、源操作数、数据有效性标识。其中的数据项在指令发射时分配,在提交时回收;当寄存器数据和存储器数据相关性满足时,实现乱序流出;

Load/Store队列处理存储器的相关性问题。如果store操作是猜测执行的,其值就被放入队列中。当所有之前的写入地址都已知之后,Load操作就可以访存。如果地址匹配,load操作可以在存储系统或者Load/Store队列中以前的store值的允许下进行。

取指队列是由取指段建立,在调度段译码并调度的指令队列;没有被调度的指令仍留在其中。它是用一个结构数组来实现的。

所谓输入输出相关链,即是用来记录前一条指令的输出数据(结果操作数)与后几条指令的输入数据(源操作数)的相关性的链表。

所谓寄存器忙闲表,即是用来记录当前各个寄存器被哪一条指令占用的结构数组。

Sim-outorder的具体的乱序过程如下:

A.取指段(Fetch):根据配置的各种参数的要求,从一级指令Cache里预取指令,加入到取指队列里。如果在一级cache里找不到指令,同时配置了二级cache,就试图从二级cache里再找,否则就从存储器里寻找。
1. 根据分支预测的要求、cache 容量的支持、事先配置的取指队列的大小,确定预取多少条指令。
2. 在地址有效的条件下,取出指令,并根据一级指令CACHE的延时和一级指令TLB的延时计算出其取指延时的大小。
3. 若是分支指令,则要根据事先配置的分支预测策略预测下一条指令地址;若不是,指令地址自加一。
4. 把这一条指令加入取指队列里,更新取指队列。

B.调度段(Dispatch):从取指队列调度指令。指令首先被译码,然后为其分配RUU资源,判断是否存在数据相关性。如果不存在就可以发射出去,存在的话仍旧留在RUU队列里等待发射。若是访存指令则分配LSQ资源,最后更新输入输出的相关链。

C.发射执行段(Issue):检查从调度段发射出来的指令所需的功能部件是否可用(结构相关性),如果可用则将其发射执行。
1. 查看指令所需数据、功能部件是否准备好;
2. 如果是 store 指令,执行之。由于数据可先存在LSQ队列中,执行时间为零,实际的访存操作在 ruu_commit() 中执行。其他指令则需先查看无功能部件。
3. 如果是 load 指令,要确定 cache 访问的延时,先扫描LSQ队列看其前是否无访存地址相同的 store 指令。如果确实没有,那么store 指令存的数据就是 load 指令要取的数据,因而访存延时为一周期;如果没就并行访问数据 cache 和数据TLB,访存延时为二者中较大者。
4. 如果是非访存指令,操作时间为其功能部件的执行时间;不需功能部件的指令,操作时间为一个周期。如果是空指令操作时间为零。

D.LSQ队列更新:此过程是找出下一条数据相关性被满足了的指令,并将其发射。而这是通过检查LSQ队列,查找存储器阻塞的情况来实现的。

E.写回段(Writeback):完成把功能部件的输出数据(结果操作数)写入RUU(register update unit) 的任务。就这点来说,模拟器根据正在完成的指令的输出数据,确定取指队列中的后续指令的输入数据是否与其相关,如果是这样,将把这条指令从取指队列中调度出来进行发射。

F.提交段(Commit):这个阶段把已经完成的结果从RUU和LSQ提交到寄存器文件中,并且LSQ中的store 指令将把其存储数据提交到数据 cache 中。
1. RUU和LSQ中结果可提交,就执行提交。
2. 让LSQ中的 store 指令把其存储数据提交到数据 cache 中并计算其操作时间,其中要考虑TLB的延时。
3. 按序把已经完成的结果从RUU和LSQ提交到寄存器文件中,并更新RUU和LSQ。

统计量说明:
sim_num_insn 总共提交的指令数
sim_num_refs 总共提交的装载/存储指令数
sim_num_loads 总共提交的装载指令数
sim_num_stores 总共提交的存储指令数
sim_num_branches 总共提交的分支指令数
sim_elapsed_time 总共的模拟时间(秒)
sim_inst_rate 模拟速度(指令数/秒)
sim_total_insn 总共执行的指令数
sim_total_refs 总共执行的装载/存储指令数
sim_total_loads 总共执行的装载指令数
sim_total_stores 总共执行的存储指令数
sim_total_branches 总共执行的分支指令数
sim_cycle 总共的模拟时间(周期数)
sim_IPC 每周期提交指令数
sim_CPI 单位指令占用周期数
sim_exec_BW 每周期执行(误推断+提交)指令数
sim_IPB 每分支占用指令数
IFQ_count 累计取指令队列占用指令数
IFQ_fcount 累计取指令队列满载次数
ifq_occupancy 平均取指令队列占用指令数
ifq_rate 平均取指令队列分配速率
ifq_latency 平均取指令队列延时
ifq_full 平均每周期取指令队列为满占用时间
RUU_count 累计寄存器更新单元占用指令数
RUU_fcount 累计寄存器更新单元满载次数
ruu_occupancy 平均寄存器更新单元占用指令数
ruu_rate 平均寄存器更新单元分配速率
ruu_latency 平均寄存器更新单元延时
ruu_full 平均每周期寄存器更新单元为满占用时间
LSQ_count 累计装载/存储队列占用指令数
LSQ_fcount 累计装载/存储队列满载次数
lsq_occupancy 平均装载/存储队列占用指令数
lsq_rate 平均装载/存储队列分配速率
lsq_latency 平均装载/存储队列延时
lsq_full 平均每周期装载/存储队列为满占用时间
sim_slip 节省的周期数
avg_sim_slip 平均每条指令发射与递交间节省的周期数
bpred_bimod.lookups 分支预测查询次数
bpred_bimod.updates 分支预测器更新次数
bpred_bimod.addr_hits 地址预测命中次数
bpred_bimod.dir_hits 方向预测命中次数 (含地址预测命中)
bpred_bimod.misses 分支预测器未命中次数
bpred_bimod.jr_hits JR指令的地址预测命中次数
bpred_bimod.jr_seen JR指令出现次数
bpred_bimod.jr_non_ras_hits.PP 非返回地址栈的JR指令的地址预测命中次数
bpred_bimod.jr_non_ras_seen.PP 非返回地址栈的JR指令出现次数
bpred_bimod.bpred_addr_rate 分支地址预测率 (i.e., addr-hits/updates)
bpred_bimod.bpred_dir_rate 分支方向预测率 (i.e., all-hits/updates)
bpred_bimod.bpred_jr_rate JR地址预测率 (i.e., JR addr-hits/JRs seen)
bpred_bimod.bpred_jr_non_ras_rate.PP 非返回地址栈的JR地址预测率 (ie, non-RAS JR hits/JRs seen)
bpred_bimod.retstack_pushes 压入返回地址栈的地址总数
bpred_bimod.retstack_pops 弹出返回地址栈的地址总数
bpred_bimod.used_ras.PP 采用的返回地址栈预测数
bpred_bimod.ras_hits.PP 返回地址栈命中数
bpred_bimod.ras_rate.PP 返回地址栈预测率 (i.e., RAS hits/used RAS)
il1.accesses 一级指令缓存访问次数
il1.hits 一级指令缓存命中次数
il1.misses 一级指令缓存未命中次数
il1.replacements 一级指令缓存替换次数
il1.writebacks 一级指令缓存写回次数
il1.invalidations 一级指令缓存失效次数
il1.miss_rate 一级指令缓存未命中率
il1.repl_rate 一级指令缓存替换率
il1.wb_rate 一级指令缓存写回率
il1.inv_rate 一级指令缓存无效率
dl1.accesses 一级数据缓存访问次数
dl1.hits 一级数据缓存命中次数
dl1.misses 一级数据缓存未命中次数
dl1.replacements 一级数据缓存替换次数
dl1.writebacks 一级数据缓存写回次数
dl1.invalidations 一级数据缓存失效次数
dl1.miss_rate 一级数据缓存未命中率
dl1.repl_rate 一级数据缓存替换率
dl1.wb_rate 一级数据缓存写回率
dl1.inv_rate 一级数据缓存无效率
ul2.accesses 二级缓存访问次数
ul2.hits 二级缓存命中次数
ul2.misses 二级缓存未命中次数
ul2.replacements 二级缓存替换次数
ul2.writebacks 二级缓存写回次数
ul2.invalidations 二级缓存失效次数
ul2.miss_rate 二级缓存未命中率
ul2.repl_rate 二级缓存替换率
ul2.wb_rate 二级缓存写回率
ul2.inv_rate 二级缓存无效率
itlb.accesses 指令快速查找表访问次数
itlb.hits 指令快速查找表命中次数
itlb.misses 指令快速查找表未命中次数
itlb.replacements 指令快速查找表替换次数
itlb.writebacks 指令快速查找表写回次数
itlb.invalidations 指令快速查找表失效次数
itlb.miss_rate 指令快速查找表未命中率
itlb.repl_rate 指令快速查找表替换率
itlb.wb_rate 指令快速查找表写回率
itlb.inv_rate 指令快速查找表无效率
dtlb.accesses 数据快速查找表访问次数
dtlb.hits 数据快速查找表命中次数
dtlb.misses 数据快速查找表未命中次数
dtlb.replacements 数据快速查找表替换次数
dtlb.writebacks 数据快速查找表写回次数
dtlb.invalidations 数据快速查找表失效次数
dtlb.miss_rate 数据快速查找表未命中率
dtlb.repl_rate 数据快速查找表替换率
dtlb.wb_rate 数据快速查找表写回率
dtlb.inv_rate 数据快速查找表无效率
sim_invalid_addrs 总计的非推断无效地址
ld_text_base 程序代码段基地址
ld_text_size 程序代码段大小
ld_data_base 程序数据段基地址
ld_data_size 程序数据段大小
ld_stack_base 程序堆栈段基地址
ld_stack_size 程序堆栈段大小
ld_prog_entry 程序入口点
ld_environ_base 程序环境基地址
ld_target_big_endian 是否大端模式
mem.page_count 内存分配的总页数
mem.page_mem 分配的内存页总大小
mem.ptab_misses 一级页表未命中数
mem.ptab_accesses 一级页表访问数
mem.ptab_miss_rate 一级页表未命中率

注:
返回地址栈/预测器(return address stack/predictor,RAS):用于存储/预测非直接跳转的目标地址。过程调用时压入,过程返回时弹出。现代处理器的RAS多用队列结构。
JR指令:无条件跳转至该寄存器地址。

1 0