benchmark 的执行参数可参照每个目录下的 runme_small.sh,注意文件扩展名要设为.sh),
分别采用五种不同的分支预测方法,即 bimod 方式,two‐level adaptive 方式,always taken
方式,always not taken 方式,comb 方式,并对前两种分别使用下表中两种参数配置; 分
析仿真器输出的关于分支预测的统计参数集,填写表格,并对各仿真器的能力给 出相应说
明。
注:为了方便,可在命令后追加重定向语句(> 【文件名】) ,以将程序的输出重定
向至 一文件。
各 benchmark 的执行文件及需要的参数:
Basicmath:
basicmath_small Bitcount:
bitcnts 75000 Qsort:
qsort_small input_small.dat Susan:
susan input_small.pgm output_small.smoothing.pgm ‐s
susan input_small.pgm output_small.edges.pgm ‐e
susan input_small.pgm output_small.corners.pgm ‐c
四、实验原理
SimpleScalar 分支预测的实现方法:先进行分支方向探测,即是否采取分支(当然跳
转指令和调用返回指令不用作这一步),接着是生成分支地址,对于调返指令,直接在 RAS
上作相关操作,普通分支指令则要利用 BTB 来进行地址探测,命中则生成地址。然后对两
步综合,地址命中且分支预测为采取,返回分支目标地址;地址不命中且分支预测为采取,
返回 1;只要分支预测为不采取,就返回 0。 重点分析针对条件分支指令的方向探测方法,
主要有 6 种,三种静态:taken,not tanken,perfect;三种动态:bimod,2‐level,comb。静态的
方法顾名思义,只是 perfect 这种,按 它的原薏是不预测,直接把真正采取的下一条指令
填入 npc,而且它确实不需要调用 pred‐lookup 函数,但据有人说,这种方法有时性能不
如 bimod,另外在 sim‐bpred 中好象也 没加入这种方法,只是在 sim‐outorder 中有实现。
对于三种动态方法,分别说明如下:
bimod 是普通的,即采用一个 2bit 宽的分支方向预测表,按分支地址查找,2bit 分 支
预测器的判断和更新与课本上的一致。这种方式只有一个参数,就是分支预测表的长度。
2-level 要复杂一些,它采用两级表格式,第一级是分支历史表,存放各组分支历史寄 存
器的值,第二级是全局/局部分支模式表,(全局或局部应是由表长相对于分支历史寄存 器
的长决定),它存放各分支历史模式的 2bit 预测器。在判断时用当前分支指令对应的历史
寄存器值去索引二级表得到相应预测器值。更新时,把当前分支的方向左移入历史寄存器,
并对使用过的 2bit 预测器作更新。它有四个参数,前三个是一级表长度,二级表长度,历
史寄存器宽度,后一个是异或标志。如果为 1,则将历史寄存器的值与当前分支指令地址 异
或,用其结果再去索引二级模式表。