收藏 分享(赏)

西安交通大学计算机系统结构第一次实验报告.pdf

上传人:weiwoduzun 文档编号:4240672 上传时间:2018-12-17 格式:PDF 页数:14 大小:515.89KB
下载 相关 举报
西安交通大学计算机系统结构第一次实验报告.pdf_第1页
第1页 / 共14页
西安交通大学计算机系统结构第一次实验报告.pdf_第2页
第2页 / 共14页
西安交通大学计算机系统结构第一次实验报告.pdf_第3页
第3页 / 共14页
西安交通大学计算机系统结构第一次实验报告.pdf_第4页
第4页 / 共14页
西安交通大学计算机系统结构第一次实验报告.pdf_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、 计算机系统结构课内实验报告(第一次) 动态分支预测实验 学生姓名 专业 /班级 计算机 11 班 学 号 所在学院 电信学院 提交日期 2014 年 4 月 10 日 目录 1. 实验目的 及要 求 1 2. 实验环境 1 3. 实验 内容 2 4. 实验 步骤 2 5. 实验结果 3 6. 总结 10 7. 附录 12 计算机系统结构课内实验(一) 动态分支预测技术 1.实验目的 及 要求 了解掌握动态分支 与推断执行 技术对流水线性能的改进效果 ( 1) 了解动态分支预测的基本技术; ( 2) 了解推断执行的基本过程; ( 3) 比较各种分支预测技术的性能 。 实验类型:综合验证; 必修

2、或选修:必修; 2.实验环境 实验平台: Linux、 SimpleScalar Tool Set、 SPEC 测试程序 针对条件分支指令的方向探测方法,主要有 6 种: 三种静态: always taken, always not taken, perfect; 三种动态: bimod, 2-level, comb。 静态的方法顾名思义,但其中 perfect 方式,按它的原意是不预测,直接把真正采取的下一条指令填入 npc,而且它确实不需要调用 pred-lookup 函数,但据有人说,这种方法有时性能不如 bimod,另外在 sim-pred 中好象也没加入这种方法,只是在 sim-ou

3、torder 中有实现。 对于三种动态方法,分别说明如下: ( 1) bimod 是最普通的,即采用一个 2bit 宽的分支方向预测表,按分支地址查找, 2bit 分支预测器的判断 和更新与课本上的一致。这种方式只有一个参数,就是分支预测表的长度。 ( 2) 2-level 要复杂一些,它采用两级表格式,第一级是分支历史表,存放各组分支历史寄存器的值,第二级是全局 /局部分支模式表,(全局或局部应是由表长相对于分支历史寄存器的长决定),它存放各分支历史模式的 2bit 预测器。在判断时用当前分支指令对应的历史寄存器值去索引二级表得到相应预测器值。更新时,把当前分支的方向左移入历史寄存器,并对使

4、用过的 2bit 预测器作更新。它有四个参数,前三个是一级表长度,二级表长度,历史寄存器宽度,最后一个是异或标 志。如果为 1,则将历史寄存器的值与当前分支指令地址异或,用其结果再去索引二级模式表。 ( 3) comb 方式则组合了以上两种方法,它再加入了一个 meta 表,这个表类似bimod 的预测表,只是它预测的是采取 bimod 还是 2-level,也采用 2-bit 预测器,被采取的预测方法被定为第一方向,未被采取的定为第二方向。更新时,如果第一方向与第二方向不同则更新 meta 表,否则只更新两种方法各自的表即可。它共有三组参数,前两组即 bimod 和 two-level 的参

5、数,第三组是关于 meta 表长度的说明。至于 BTB 的更新与 cache 的更新方式相同。 3.实验 内容 实验采用 linux 平台下的仿真软件 SimpleScalar,它 是 Todd Austin 开发的一个用于构建处理器模拟程序的开源系统软件框架,它提供用于模拟 CPU、缓存、存储器分层体系等计算机体系结构的工具集。他可以模拟一个程序在某种体系结构机器上的具体执行过程,给出该体系结构的功能和性能参数。 简单来说 ,本次实验就是利用不同的 预测算法来 进行指令调度,并且量化分析 它们的 性能。 4.实验 步骤 实验步骤具体如下: ( 1) 在 VM 虚拟机下下载解压 SimpleS

6、calar; ( 2) 进入 SimpleScalar 目录 (simplesim-3.0); ( 3) 用 sim-bpred 仿真器运行 tests/bin.little 目录下的三个测试程序(test-math, test-fmath, test-printf),分别采用五种不同的分支预测方法,即 bimod 方式, two-level adaptive 方式, always taken 方式,always not taken 方式, comb 方式,并对前两种分别使用下表中两种参数配置:分析仿真器输出的关于分支预测的统计参数集,填写表格,并对各仿真器的能力给出相应说明 。 命令格式为:

7、 ./sim-bpred -option executable_benchmark -argument 例: ./sim-bpred -bpred comb -bpred:comb 1024 -bpred:2lev 1 1024 8 0 -bpred:bimod 1024 tests/bin.little/test-math 下面对这个指令格式进行说明: comb 指定采用联合预测方法, 它再加入了一个 meta 表,这个表类似 bimod 的预测表,只是它预测的是采取 bimod 还是 2-level,也采用 2-bit 预测器,被采取的预测方法被定为第一方向,未被采取的定为第二方向。更新时

8、,如果第一方向与第二方向不同则更新 meta 表,否则只更新两种方法各自的表即可。它共有三组参数,前两组即 bimod 和 two-level 的参数,第三组是关于 meta 表长度的说明。至于 BTB 的更新与 cache 的更新方式相同。 其中, 8 指的是历史寄存器的位数。 5.实验结果 5.1 预测方法的 性能 表 1( 测试程序名 test.math) always not taken always taken bimod (516) bimod (1024) 2-level (1,1024,8,0) 2-level (1,64,6,1) comb (1024) (1,1024,8,

9、0) (1024) sim_total_insn 213688 213688 213688 213688 213668 213723 213723 sim_total_refs 56897 56897 56897 56897 56897 56900 56900 sim_num_branches 38591 38591 38591 38591 38591 38599 38599 sim_elapsed_time 1 1 1 1 1 1 1 sim_inst_rate 213688 213688 213688.0000 213688.0000 213688 213723 213723 sim_IP

10、B 5.5372 5.5372 5.5372 5.5372 5.5372 5.537 5.537 bpred_bimod.lookups 38591 38591 38591 38591 38591 38599 38599 bpred_bimod.updates 38591 38591 38591 38591 38591 38599 38599 bpred_bimod.addr_hits 21938 25561 34237 34237 34242 27961 35578 bpred_bimod.dir_hirts 21938 25561 34732 34732 34242 28514 36018

11、 bpred_bimod.misses 16653 12930 3859 3859 3797 10085 2581 bpred_bimod.jr_hits 3543 3543 3528 3528 3528 3529 3529 bpred_bimod.jr_seen 3543 3543 3543 3543 3543 3544 3544 bpred_bimod.jr_non_ras _hits.PP 3543 3543 28 28 28 28 28 bpred_bimod.jr_non_ras _seen.PP 3543 3543 41 41 41 41 41 bpred_bimod.bpred_

12、add r_rate 0.5685 0.6649 0.8872 0.8872 0.8873 0.7244 0.9217 bpred_bimod.bpre 0.56 0.66 0.9000 0.9000 0.9016 0.7387 0.9331 预 测 方 法 统 计 结 果 d_dir _rate 85 49 bpred_bimod.bpred_jr_r ate 1 1 0.9958 0.9958 0.9958 0.9958 0.9958 bpred_bimod.bpred_jr_n on_ras_rate.PP 1 1 0.6829 0.6829 0.6829 0.6829 0.6829 b

13、pred_bimod.retstack_pu shes 1 1 3504 3504 3504 3505 3505 bpred_bimod.retstack_po ps 0 0 3502 3502 3502 3503 3503 bpred_bimod.used_ras.PP 0 0 3502 3502 3502 3503 3503 bpred_bimod.ras_hits.PP 0 0 3502 3500 3500 3501 3501 bpred_bimod.ras_rate.PP 0 0 0.9994 0.9994 0.9994 0.9994 0.9994 表 2( 测试程序名 test.fm

14、ath) always not taken always taken bimod (516) bimod (1024) 2-level (1,1024,8,0) 2-level (1,64,6,1) comb (1024) (1,1024,8,0) (1024) sim_total_insn 53448 53448 53448 53448 53448 53482 53482 sim_total_refs 16342 16342 16342 16342 16342 16345 16345 sim_num_branches 10340 10340 10340 10340 10340 10347 1

15、0347 sim_elapsed_time 1 1 1 1 1 1 1 sim_inst_rate 53448 53448 53448 53448 53448 53482 53482 sim_IPB 5.1691 5.1691 5.1691 5.1691 5.1691 5.1688 5.1688 bpred_bimod.lookups 10340 10340 10340 10340 10340 10347 10347 bpred_bimod.updates 10340 10340 10340 10340 10340 10347 10347 bpred_bimod.addr_hits 5768

16、6839 8825 9021 8860 7574 9225 预 测 方 法 统 计 结 果 bpred_bimod.dir_hirts 5768 6839 9128 9315 9171 7888 9474 bpred_bimod.misses 4572 3501 1212 1025 1169 2459 873 bpred_bimod.jr_hits 832 832 815 815 815 816 816 bpred_bimod.jr_seen 832 832 832 832 832 833 833 bpred_bimod.jr_non_ras _hits.PP 832 832 4 4 4 4

17、4 bpred_bimod.jr_non_ras _seen.PP 832 832 19 19 19 19 19 bpred_bimod.bpred_add r_rate 0.5578 0.6614 0.8535 0.8724 0.8569 0.7320 0.8916 bpred_bimod.bpred_dir _rate 0.5578 0.6614 0.8828 0.9009 0.8869 0.7623 0.9156 bpred_bimod.bpred_jr_r ate 1 1 0.9796 0.9796 0.2105 0.9796 0.9796 bpred_bimod.bpred_jr_n

18、 on_ras_rate.PP 1 1 0.2105 0.2105 0.2105 0.2105 0.2105 bpred_bimod.retstack_pu shes 0 0 815 815 815 816 816 bpred_bimod.retstack_po ps 0 0 813 813 813 814 814 bpred_bimod.used_ras.PP 0 0 813 813 813 814 814 bpred_bimod.ras_hits.PP 0 0 811 811 811 812 812 bpred_bimod.ras_rate.PP 0 0 0.9975 0.9975 0.9

19、975 0.9975 0.9975 表 3( 测试程序名 test.printf) always not taken always taken bimod (516) bimod (1024) 2-level (1,1024,8,0) 2-level (1,64,6,1) comb (1024) (1,1024,8,0) (1024) sim_total_insn 1813877 1813877 1813877 1813877 1813877 1813914 1813914 sim_total_refs 516941 516941 516941 516941 516941 516947 516

20、947 sim_num_branches 401609 401609 401609 401609 401609 401623 401623 sim_elapsed_time 1 1 1 1 1 1 1 sim_inst_rate 1813877 1813877 1813877 1813877 1813877 1813914 1813914 sim_IPB 4.5165 4.5165 4.5165 4.5165 4.5165 4.5165 4.5165 bpred_bimod.lookups 401609 401609 401609 401609 401609 401623 401623 bpr

21、ed_bimod.updates 401609 401609 401609 401609 401609 401623 401623 bpred_bimod.addr_hits 233361 261363 372591 377458 373619 317099 384169 bpred_bimod.dir_hirts 233361 261363 374901 379761 375930 319444 386404 bpred_bimod.misses 168248 140246 26708 21848 25679 82179 15219 bpred_bimod.jr_hits 31998 319

22、98 30152 30152 30152 30153 30153 bpred_bimod.jr_seen 31998 31998 31998 31998 31998 31999 31999 bpred_bimod.jr_non_ras _hits.PP 31998 31998 363 363 363 363 363 bpred_bimod.jr_non_ras _seen.PP 31998 31998 2198 2198 2198 2198 2198 bpred_bimod.bpred_add r_rate 0.5811 0.6508 0.9277 0.9399 0.9303 0.7865 0

23、.9565 bpred_bimod.bpred_dir _rate 0.5811 0.6508 0.9335 0.9456 0.9361 0.7954 0.9621 bpred_bimod.bpred 1 1 0.942 0.942 0.9423 0.9423 0.9423 预 测 方 法 统 计 结 果 _jr_r ate 3 3 bpred_bimod.bpred_jr_n on_ras_rate.PP 1 1 0.1652 0.1652 0.1652 0.1652 0.1652 bpred_bimod.retstack_pu shes 0 0 29802 29802 29802 2980

24、3 29803 bpred_bimod.retstack_po ps 0 0 29800 29800 29800 29801 29801 bpred_bimod.used_ras.PP 0 0 29800 29800 29800 29801 29801 bpred_bimod.ras_hits.PP 0 0 29789 29789 29789 29790 29790 bpred_bimod.ras_rate.PP 0 0 0.9996 0.9996 0.996 0.9996 0.9996 5.2 参数意义说明 表 4 参数意义 参数表示 参数说明 sim_num_insn: 确认 (commi

25、tted)的指令条数 sim_num_refs 确认的 load/store 的个数 sim_num_loads 确认的 load 操作的个数 sim_num_stores 确认的 store 操作的个数 sim_num_branches 确认的分支操作的个数 sim_elapsed_time 程序执行的时间 (以秒为单位 ) sim_inst_rate 程序执行的速度 (条指令 /秒 ) sim_total_insn 一共执行的指令的条数 sim_total_refs 一共执行的 load/store 的次数 sim_total_loads 一共执行的 load 个数 sim_total_s

26、tores 一共执行的 store 个数 sim_total_branches 一共执行的 branch 个数 sim_cycle 一共执行的周期数 sim_IPC 平均每个周期执行的指令条数 sim_CPI 平均每条指令执行的周期数 sim_exec_BW 平均每个周期实际执行的指令条数(包括分支预测错误时执行的无用的指令 ) sim_IPB 平均多少条指令中有一条分支指令 IFQ_count cumulative IFQ occupancy IFQ_fcount cumulative IFQ full count ifq_occupancy avg IFQ occupancy(insts)

27、 ifq_rate IFQ 的平均发射速率 (指令 /周期 ) ifq_latency avf IFQ occupant latency(cycles) ifq_full fraction of time(cycles)IFQ was full ruu_rate RUU 的平均发射速率 (指令 /周期 lsq_rate LSQ 的平均发射速率 (指令 /周期 ) bpred_bimod.lookups 一共进行了多少次分支预测 bpred_bimod.updates 分支预测表更新的次数 bpred_bimod.addr_hits 分支目标地址预测命中的次数 bpred_bimod.dir_h

28、irts 分支目标方向预测命中的次数 bpred_bimod.misses 分支预测错误的次数 bpred_bimod.jr_hits JR 型分支目标地址预测命中的次数 bpred_bimod.jr_seen: JR 型分支出现的次数 bpred_bimod.jr_non_ras_hits.PP non_RAS JR 型分支目标地址预测命中的次数 bpred_bimod.jr_non_ras_seen.PP non_RAS JR 型分支出现的次数 bpred_bimod.bpred_addr_rate 分支目标地址预测的命中率 bpred_bimod.bpred_dir_rate 分支目标方

29、向预测的命中率 bpred_bimod.bpred_jr_rate JR 型分支目标地址预测的命中率 bpred_bimod.bpred_jr_non_ras_rate.PP non_RAS JR 型分支目标地址预测的命中率 bpred_bimod.retstack_pushes 向 RAS 中压入的地址的个数 bpred_bimod.retstack_pops 从 RAS 中弹出的地址的个数 bpred_bimod.used_ras.PP RAS 预测使用的总次数 bpred_bimod.ras_hits.PP RAS 预 测命中的次数 bpred_bimod.ras_rate.PP RAS

30、 预测的命中率 il1.accesses il1 访问的次数 il1.hits il1 命中的次数 il1.misses il1 不命中的次数 il1replacements il1 替换的次数 il1.writebacks: il1 写回的次数 il1.invalidations il1 无效的次数 il1.miss_rate il1 失效率 (不命中次数 /访问次数 ) il1.repl_rate il1 替换率 (替换次数 /访问次数 ) il1.wb_rate il1 写回率 (写回次数 /访问次数 ) il1.inv_rate il1 无效率 (无效次数 /访问次数 ) dl1.ac

31、cesses dl1 访问的次数 dl1.hits: dl1 命中的次数 ; dl1.misses: dl1 不命中的次数 ; dl1.replacements dl1 替换的次数 dl1.writebacks: dl1 写回的次数 dl1.invalidations dl1 无效的次数 dl1.miss_rate dl1 失效率 (不命中次数 /访问次数 ) dl1.repl_rate dl1 替换率 (替换次数 /访问次数 ) dl1.wb_rate dl1 写回率 (写回次数 /访问次数 ) dl1.inv_rate dl1 无效率 (无效次数 /访问次数 ) ul2.accesses

32、ul2 访问的次数 ul2.hits ul2 命中的次数 ul2.misses ul2 不命中的次数 ul2.replacements ul2 替换的次数 ul2.writebacks: ul2 写回的次数 ul2.invalidations ul2 无效的次数 ul2.miss_rate ul2 失效率 (不命中次数 /访问次数 ) ul2.repl_rate: ul2 替换率 (替换次数 /访问次数 ) ul2.wb_rate ul2 写回率 (写回次数 /访问次数 ) ul2.inv_rate ul2 无效率 (无效次数 /访问次数 ) itlb.accesses: itlb 访问的次数

33、 ; itlb.hits: itlb 命中的次数 ; itlb.misses: itlb 不命中的次数 itlb.replacements itlb 替换的次数 itlb.writebacks itlb 写回的次数 itlb.invalidations itlb 无效的次数 itlb.miss_rate itlb 失效率 (不命中次数 /访问次数 ) itlb.repl_rate itlb 替换率 (替换次数 /访问次数 ) itlb.wb_rate itlb 写回率 (写回次数 /访问次数 ) itlb.inv_rate itlb 无效率 (无效次数 /访问次数 ) dtlb.accesse

34、s: dtlb 访问的次数 dtlb.hits dtlb 命中的次数 ; dtlb.misses dtlb 不命中的次数 dtlb.replacements dtlb 替换的次数 dtlb.writebacks dtlb 写回的次数 dtlb.invalidations dtlb 无效的次数 dtlb.miss_rate dtlb 失效率 (不命中次数 /访问次数 ) dtlb.repl_rate dtlb 替换率 (替换次数 /访问次数 ) dtlb.wb_rate dtlb 写回率 (写回次数 /访问次数 ) dtlb.inv_rate dtlb 无效率 (无效次数 /访问次数 ) ld_

35、text_base: 程序的代码段的基地址 ; ld_text_size 程序的代码段的大小 ; ld_data_base 程序的数据段的基地址 ld_data_size 开始时程序的数据端的大小 ld_stack_base 程序的堆栈的基地址 (高端地址 ) ld_stack_size 开始时程序的堆栈的大小 ld_prog_entry 程序的入口点 (初始的 pc 值 ) ld_environ_base 程序环境的基地址 ld_target_big_endian: benchmark 程序是小尾端还是大尾端(非零表示大围端 ) mem.page_count: 一共分配的页数 mem.pag

36、e_mem 程序运行过程中分配内存的大小 mem.ptab_misses 访问第一级页表的失效的次数 mem.ptab_accesses 访问页表的总次数 mem.ptab_miss_rate 第一级页表的失效率 6.总结 本次实验进行较为顺利,在实验过程中,我就已经填写完成了 3 个程序分别对应的预测结果表。通过实验,我对分支预测技术有了更深入的理解。我认识到了几种分支预测技术的性能差异。并且,我了解并学习了 comb 这种联合的预测方法,这是课上没有提到的。因此,我在本次实验中受益匪浅。 最后,我要感谢实验指导老师和学长热心、细致的指导。 7.附录( 源程序清单) 为了进一步理解仿真软件的

37、工作原理,我查询了相关代码。 在 sim-bpred.c 中检查输入的动态预测方法选项 ,并创建相应的分支预测器 。在sim_check_options(struct opt_odb_t *odb, int argc, char *argv)函数定义下 : if (!mystricmp(pred_type, “taken“) /创建预测器实例 bpred = bpred_create(BPredTaken, 0, 0, 0, 0, 0, 0, 0, 0, 0); 在 sim-main 函数中 while (TRUE) regs.regs_RMD_REG_ZERO = 0; #ifdef TAR

38、GET_ALPHA regs.regs_F.dMD_REG_ZERO = 0.0; #endif /* 获取下一条指令 */ MD_FETCH_INST(inst, mem, regs.regs_PC); /* 指令计数 */ sim_num_insn+; /* set default reference address and access mode */ addr = 0; is_write = FALSE; /* set default fault - none */ fault = md_fault_none; /* 对指令译码 */ MD_SET_OPCODE(op, inst);

39、/* 执行指令 */ switch (op) #define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) case OP: SYMCAT(OP,_IMPL); break; #define DEFLINK(OP,MSK,NAME,MASK,SHIFT) case OP: panic(“attempted to execute a linking opcode“); #define CONNECT(OP) #define DECLARE_FAULT(FAULT) fault = (FAULT); break; #include “ma

40、chine.def“ default: panic(“attempted to execute a bogus opcode“); if (fault != md_fault_none) fatal(“fault (%d) detected 0x%08p“, fault, regs.regs_PC); if (MD_OP_FLAGS(op) if (MD_OP_FLAGS(op) if (MD_OP_FLAGS(op) struct bpred_update_t update_rec; sim_num_branches+; if (pred)/ 如果分支预测器创建成功 /* 获取预测的下条指令

41、的地址 */ pred_PC = bpred_lookup(pred, /* 分支地址*/regs.regs_PC, /* 目的地址 */target_PC, /* 指 令 操 作 码 */op, /* call? */MD_IS_CALL(op), /* return? */MD_IS_RETURN(op), /* stash an update ptr */ /* 判断从分支预测器返回的下条指令地址是否合法 */ if (!pred_PC)/ 不合法 ,(当返回 0时 ,表示采用分支不转移预测 ) /* 分支不转移 ,pc 直接加一 */ pred_PC = regs.regs_PC +

42、sizeof(md_inst_t); /* 根据指令执行的实际结果 ,来更新分支预测器 */ bpred_update(pred, /* 分支地址 */regs.regs_PC, /* resolved branch target */regs.regs_NPC, /* 分支是否转移 */regs.regs_NPC != (regs.regs_PC + sizeof(md_inst_t), /* pred taken? */pred_PC != (regs.regs_PC + sizeof(md_inst_t), /* correct pred? */pred_PC = regs.regs_N

43、PC, /* opcode */op, /* predictor update pointer */ /* check for DLite debugger entry condition */ if (dlite_check_break(regs.regs_NPC, is_write ? ACCESS_WRITE : ACCESS_READ, addr, sim_num_insn, sim_num_insn) dlite_main(regs.regs_PC, regs.regs_NPC, sim_num_insn, /* go to the next instruction */ regs.regs_PC = regs.regs_NPC; regs.regs_NPC += sizeof(md_inst_t); /* finish early? */ if (max_insts

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报