好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

模拟分支预测器实验报告.docx

6页
  • 卖家[上传人]:re****.1
  • 文档编号:533757770
  • 上传时间:2023-07-05
  • 文档格式:DOCX
  • 文档大小:22.14KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 模拟分支预测器实验报告、实验目标:使用 puter Architecture: A Quantitative roach (Fourth Edition) 光盘 history.t_t 文件,模拟分支预测器的行为该文件格式和题目要求如第2 章 Case Study 2 所示二、实验要求:写一段程序对一个64 个入口的简单四状态转移目标缓存建模需完成以下目 标:求出BTB的总体命中率为多少求出冷启动的总体转移预测错误率为多少找出最常见的转移对该转移的正确预测在预测正确的总数中占多少统计转移预测器遇到了多少次容量缺失的情况比较冷启动和热启动的效果使用相同的输入数据建立历史表,并收集统计 信息冷启动BTB4次,BTB大小为16,32和64得出导致的5个预测错误率,并得 出 5 个命中率提交经过注释的、完成的代码三、程序设计与实现:本程序我打算采用进行编写,因为能够很好地体现面向对象编程的优点将BTB定义为一个类,然后将对它的属性的操作看做该类本身的行为,这样不但能够起到数据隐藏的效果,而且实现起来也比较方便因此,首先定义BTB类如下:class BTB {int prediction; // 预测是否发生, 1 表示转移, 0 表示不转移。

      int addr_of_br; // 转移指令的地址int br_target; // 转移目标int hits; // 命中次数int misses; // 缺失次数}此外还需要定义一个测试类对BTB的方法进行测试,以及完成一些初始化工 作public class BTBTest {public static final int M = 1;public static final int N = 2;public static final int MA__BTB_LEN = 1024;// 最大的 BTB数目public static final long MA_ITERS = 100000;public static int correct_predictions, mispredictions, tot_brs, btb_len;public static int msbraddr, msbraddr_hits, msbraddr_misses;public static HashSet set = new HashSet;// 不同的指令条数static BTB btbs[] = new BTB[MA__BTB_LEN];static File f1, f2;当生成该测试类的时候,同时对BTB进行初始化。

      public BTBTest {for (int i = 0; i = 2) {correct_predictions++;return true;} else {mispredictions++;return false;}case 0:if (btbs[inde_].prediction 3)btbs[inde_].prediction = 3;break;case 0:btbs[inde_].prediction--;if (btbs[inde_].prediction < 0)btbs[inde_].prediction = 0;break;default:}}通过读入 history.t_t 文件来读入指令序列,每读入一条指令,便获取其索引字段,然后在BTB中进行查找,然后通过check_prediction 方法进行判断该转 移是否命中,同时根据结果调用update_table来更新BTB表void run_btb throws IOE_ception {int t_or_nt = 0, addr_br_instr = 0, br_target = 0, btb_inde_ = 0;// 读取 history.t_t 文件BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f1)));String st;for (tot_brs = 0; tot_brs < MA_ITERS; tot_brs++) {String sts[];st = br.readLine; if (st == null) break;sts = st.split( “ ” );for (int i = 0; i < sts.length; i++) {sts[i] = sts[i].trim; }addr_br_instr = Integer.parseInt(sts[0].substring(2), 16);br_target = Integer.parseInt(sts[1].substring(2), 16);t_or_nt = Integer.parseInt(sts[2], 10);btb_inde_ = get_btb_inde_(addr_br_instr);// 检查是否命中if ((check_prediction(t_or_nt, btb_inde_) (addr_br_instr ==msbraddr))) {msbraddr_hits++;} else {msbraddr_misses++;}//更新BTB表update_table(t_or_nt, btb_inde_, addr_br_instr, br_target);}}我在程序中采用了一种比较巧妙的方法来统计强制缺失数,因为在Set 中,键不能重复,因此我采用了一个HashSet 来装载指令,用指令的地址作为键,这样就能够统计出不同的指令数目,从而统计出强制缺失数。

      而容量缺失的统计则通过总缺失数 - 强制缺失数求出具体如下所示:/__容量缺失统计容量缺失=总缺失数- 强制缺失数@throws IOE_ception_/void capacity_misses throws IOE_ception {int i, total_misses, total_pulsory;total_misses = 0;// 强制缺失数目通过统计程序中不同的指令数目,即每条指令第一次出现的数目来获得// 此处将不同的指令存放在一个集合Set 中,因此通过获取集合的元素数目即可获得强制缺失数目total_pulsory = set.size;// 通过查找 btb 数组,累加所有btb 项的缺失数目来获得总的缺失数目for (i = 0; i < btb_len; i++)total_misses += btbs[i].misses;System.out.printf( “强制缺失数: n”,total_pulsory);System.out.printf( “\t 总缺失数 : d. ” , total_misses);if (total_misses < total_pulsory) {dump_table;// 如果总的缺失数目小于强制缺失数目,则说明统计出错,将BTB表转储error( “ something screwy in capaci ty_misses, tot misses < pulsories ” );} else {System.out.printf(“容量缺失=总缺失数-强制缺失数n”,total_misses - total_pulsory);}}四、结果分析Ap :默认状态下设置BTB的大小为1024,即假如在执行程序的时候不在命令行中 通过参数动态修改BTB的大小,则BTB为1024。

      在默认情况下测试 BTB对 history.t_t 文件的命中率如图所示:其中BTB中命中数为1697次,而总转移数为1792次, 命中率为:94.7预 测错误数 : 95 次,错误率为 5.3 在此基础上找出最常见的转移,如图所示:最常见的分支转移指令为:0_4012c681,该转移出现的次数为637次,总转 移次数为,1792次,该转移占总转移的35.5 , 对该转移的正确预测数为 634次 ,总正确预测数为 1697 次,即该转移的正确预测在预测正确的总数中占 37.4然后进一步统计强制缺失数和容量缺失数,结果如下图所示:强制缺失数为 95 次,总缺失数也为 95 次 ,则说明容量缺失为0在这种情况下没有发生容量缺失冷启动BTB BTB大小分别为1, 2, 4, 8, 16, 32和64分别统计预测的缺 失率如下BT以小缺失率192.2433222.65625410.37946487.310268165.859375325.636161645.580357从结果可以看出,当BTB大小为1时,缺失率十分大,造成这种结果的原因 在于此时的容量缺失数十分大,BTB中只能存放一条预测指令。

      而随着 BT耿小的 增加,缺失率不断下降,可见随着 BTB大小的增加,容量缺失数会不断的减少,而 强制缺失数是相对稳定的,因此总缺失数便会随着BTB容量大小的增加而减少但可以看出,当BTB大小增长到16以后,随着BTB大小的增加,缺失率下降的程度 会十分缓慢,缺失率变化不大,这说明当BTB大小增长到16的时候,容量缺失所占的比例已经很小了,因此此时单方面增加BTB大小并不能很好地降低缺失率。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.