实验3--SimpleScalar与程序优化_第1页
实验3--SimpleScalar与程序优化_第2页
实验3--SimpleScalar与程序优化_第3页
实验3--SimpleScalar与程序优化_第4页
实验3--SimpleScalar与程序优化_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上实验3 SimpleScalar与程序优化8 路志桐 计科二班1、 简介:SimpleScalar 是上世纪由威斯康辛大学发布的一款开源模拟器,具备良好的可移植性和可扩展性。 作为一款时钟精确的模拟器,SimpleScalar 采用执行驱动方式模拟,包含功能模拟和性能模拟。SimpleScalar 的指令集架构采用C 语言宏声明,目前3.0 版本主要支持PISA 指令集和Alpha 指令集。根据模拟的目的不同,SimpleScalar 包含多个模拟器实体,从最简单的Sim-fast 到最为复杂的Sim-outorder,可分别用于功能模拟、Cache 配置策略、流水线

2、、前瞻预测等体系结构问题的全面研究。2、 安装:1、首先从官网上下载相关的文件:Simpletools-2v0.tgz;Simplesim-3v0e.tar.gz;Simpleutils-.tar.gz;Gcc-2.7.2.3.ss_.tar.gz ;2、然后安装flex,build-essential$ sudo apt-get install flex;$ sudo apt-get install build-essential;本来还需要bison的,不过之前安装过了,略过。另外除此之外我们还需要配置一下环境变量安装目录:$ export IDIR=/home/my/simplescal

3、ar设置主机:$ export HOST=i686-pc-linux设置目的机器成小字段机器:$ export TARGET=sslittle-na-sstrix3、设置完环境之后我们便可以安装simpletools了进入到目的地址后,我们用tar xzvf命令将之前下载下来的simpletools解压;由于simplescalar需要Gcc2.7以上版本支持,所以我们需要通过rm命令移除原先电脑自带的Gcc。$ cd $IDIR$ tar xzvf simpletools-2v0.tgz$ rm -rf gcc-2.6.34、其次是simpleutils$ tar xzvf simpleut

4、ils-.tar.gz$ cd simpleutils-然后编译前要打开simpleutils-/ld下的文件ldlex.l并且将里面全部的yy_current_buffer替换成大写,否则代码将会报错。然后就可以进行编译$./configure -host=$HOST -target=$TARGET -with-gnu-as -with-gnu-ld -prefix=$IDIR$ make$ make install5、接下来安装simplesim3.0$ cd $IDIR$ tar xzvf simplesim-3v0e.tgz$ cd simplesim-3.0$ make config

5、-alpha$ make6、最后安装gcc2.7编译器套件$ cd $IDIR$ tar xzvf gcc-2.7.2.3.ss.tar.gz$ cd gcc-2.7.2.3$ export PATH=$PATH:/home/YOUR_USER_NAME/simplescalar/sslittle-na-sstrix/bin$ ./configure -host=$HOST -target=$TARGET -with-gnu-as -with-gnu-ld -prefix=$IDIR这里面有好几处代码需要修改,我们一一修改了相应的代码!修改代码:./MakefileLine130:增加-I/u

6、sr/include或-I./include > -I /usr/include!修改代码:./protoize.c$ sudo chmod +w protoize.c !修改权限#include <varargs.h> > #include <stdarg.h>!修改代码:./obstack.h$ sudo chmod +w obstack.h !修改权限*(void *)_o->next_free)+=(void *)datum); > *(void *)_o->next_free+)=(void *)datum);!复制补丁文件$ c

7、p ./patched/sys/cdefs.h ./sslittle-na-sstrix/include/sys/cdefs.h$ cp ./sslittle-na-sstrix/lib/libc.a ./lib/$ cp ./sslittle-na-sstrix/lib/crt0.o ./lib/!解压ar-ranlib.tar.gz到$IDIR/sslittle-na-sstrix/bin!修改ar及ranlib的权限$ sudo chmod +w ar ranlib$ sudo chmod +x ar ranlib$ cd $IDIR/gcc-2.7.2.3$ make!修改代码:./i

8、nsn-output.cLine 675/750/823:末尾增加 “”$ make !修改代码:./objc/sendmsg.c$sudo chmod +w objc/sendmsg.c !修改权限Line35:增加#define STRUCT_VALUE 0$ make LANGUAGES="c c+" CFLAGS="-O" CC="gcc"!若出错,修改./cxxmain.c,删掉 2978-2979 行,即:char * malloc ();char * realloc ();!若无cxxmain,返回上文./Makefil

9、e确认修改,再继续重复流程$ make LANGUAGES="c c+" CFLAGS="-O" CC="gcc"$ make install LANGUAGES="c c+" CFLAGS="-O" CC="gcc"最后安装完成之后随意写一个C语言代码进行测试。用如下命令编译$IDIR/bin/sslittle-na-sstrix-gcc -o 1 1.c然后运行$IDIR/simplesim-3.0/sim-safe 1发现可以运行,安装成功3、 代码优化:比较各种分支预

10、测技术的性能SimpleScalar分支预测的实现方法是:先确定是否采取分支,即进行分支方向探测,然后是生成分支地址,对于调用返回指令,就在RAS上直接作相关操作,普通分支指令则需要利用BTB来地址探测,如果命中的话则生成地址。然后对两步进行综合,地址命中且分支预测为采取,返回分支目标地址;地址不命中且分支预测为采取,返回1;只要分支预测为不采取,就返回0。包括在仿真器上运行的三个程序的结果统计数据表格,以及对各种分支预测方法的对比分析。每一列对应的运行参数分别为: (1) test-math./sim-bpred -bpred taken tests/bin.little/test

11、-math./sim-bpred -bpred nottaken tests/bin.little/test-math./sim-bpred -bpred bimod -bpred:bimod 512 tests/bin.little/test-math./sim-bpred -bpred bimod -bpred:bimod 1024 tests/bin.little/test-math./sim-bpred -bpred 2lev -bpred:2lev 1 1024 8 01 tests/bin.little/test-math./sim-bpred -bpred 2lev -bpred

12、:2lev 1 64 6 1 tests/bin.little/test-math./sim-bpred -bpred comb -bpred:comb 1024 -bpred:2lev 1 1024 8 0 -bpred:bimod 1024 tests/bin.little/test-math always takenalways not takenbimod(512)bimod(1024)2-level(1,1024,8,0)2-level(1,64,6,1)comb(1024)(1,1024,8,0)(1024)sim_total_insnsim_total_refs5689

13、7568975689756897568975689756897sim_num_branches38591385913859138591385913859138591sim_elapsed_time1111111sim_inst_ratesim_IPB5.53725.53725.53725.53725.53725.53725.5372bpred_bimod.lookups38591385913859138591385913859138591bpred_bimod.updates38591385913859138591385913859138591bpred_bimod.addr_hits2566

14、1219383369234237342422784435570bpred_bimod.dir_hits25661219383419534732347942838736011bpred_bimod.misses1293016653439638593797102042580bpred_bimod.jr_hits3543354335283528352835283528bpred_bimod.jr_seen3543354335433543354335433543bpred_bimod.jr_non_ras_hits.PP354335432828282828bpred_bimod.jr_non_ras_

15、seen.PP354335434141414141bpred_bimod.bpred_addr_rate0.66490.56850.87310.88720.88730.72150.9217bpred_bimod.bpred_dir_rate0.66490.56850.88610.90000.90160.73560.9331bpred_bimod.bpred_jr_rate1.00001.00000.99580.99580.99580.99850.9958bpred_bimod.bpred_jr_non_ras_rate.PP1.00001.00000.68290.68290.68290.682

16、90.6829bpred_bimod.retstack_pushes0035043504350435043504bpred_bimod.retstack_pops0035023502350235023502bpred_bimod.used_ras.PP0035023502350235023502bpred_bimod.ras_hits.PP0035003500350035003500bpred_bimod.ras_rate.PPError:divide by zeroError:divid by zero0.99940.99940.99940.99940.9994 根据得到的统计数据

17、得知,在上述的分支预测器配置中,复合式的地址预测命中率与分支方向预测命中率最高。代码分析在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

18、, 0, 0);    在sim_main函数中: while (TRUE)          regs.regs_RMD_REG_ZERO = 0;#ifdef TARGET_ALPHA      regs.regs_F.dMD_REG_ZERO = 0.0;#endif       /* 获取下一条指令*/      MD_

19、FETCH_INST(inst, mem, regs.regs_PC);      /* 指令计数 */      sim_num_insn+;      /* set default reference address and access mode */      addr = 0; is_write = FALSE;       /

20、* set default fault - none */      fault = md_fault_none;       /* 对指令译码 */      MD_SET_OPCODE(op, inst);       /* 执行指令 */      switch (op)#define DEFINST(OP,MSK,NAM

21、E,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3)                              case OP:              

22、0;                                                   &#

23、160;        SYMCAT(OP,_IMPL);                                       &#

24、160;                                 break;#define DEFLINK(OP,MSK,NAME,MASK,SHIFT)           &#

25、160;                                         case OP:        

26、0;                                                  

27、60;               panic("attempted to execute a linking opcode");#define CONNECT(OP)#define DECLARE_FAULT(FAULT)                   

28、;                                            fault = (FAULT); break; #include "machine.def

29、"                   default:                         panic("attempted to execute a bogus o

30、pcode");     if (fault != md_fault_none)fatal("fault (%d) detected 0x%08p", fault, regs.regs_PC);     if (MD_OP_FLAGS(op) & F_MEM)           sim_num_refs+;       

31、;    if (MD_OP_FLAGS(op) & F_STORE)             is_write = TRUE;              if (MD_OP_FLAGS(op) & F_CTRL)           

32、;         md_addr_t pred_PC;           struct bpred_update_t update_rec;            sim_num_branches+;            if (pr

33、ed)/ 如果分支预测器创建成功                            /* 获取预测的下条指令的地址 */               pred_PC = bpred_lookup(pred, 

34、0;                                        /* 分支地址*/regs.regs_PC,       

35、0;                                  /*目的地址 */target_PC,              &

36、#160;                           /* 指令操作码 */op,                     

37、60;                    /* call? */MD_IS_CALL(op),                           

38、;               /* return? */MD_IS_RETURN(op),                               

39、60;          /* stash an update ptr */&update_rec,                                  &#

40、160;       /* stash return stack ptr */&stack_idx);              /* 判断从分支预测器返回的下条指令地址是否合法 */             if (!pred_PC)/ 不合法,(当返回0时,表示采用分支不转移预测)  &

41、#160;                                     /* 分支不转移,pc直接加一 */           

42、0;         pred_PC = regs.regs_PC + sizeof(md_inst_t);                            /* 根据指令执行的实际结果,来更新分支预测器*/    

43、0;        bpred_update(pred,                                 /* 分支地址 */regs.regs_PC,      

44、                         /* resolved branch target */regs.regs_NPC,                   

45、0;           /* 分支是否转移 */regs.regs_NPC != (regs.regs_PC +                                 

46、                                 sizeof(md_inst_t),               

47、;                /* pred taken? */pred_PC != (regs.regs_PC +                            &#

48、160;                                    sizeof(md_inst_t),                               /* correct pred? */pred_PC = regs.regs_NPC,       

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论