《cache性能分析及优化实验报告(共19页).doc》由会员分享,可在线阅读,更多相关《cache性能分析及优化实验报告(共19页).doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实 验 报 告实验名称:计算机原理cache性能分析及优化实验学 员: 张英杰 学 号: 2 培养类型: 4+1军人 年 级: 任职培训队 专 业: 计算机科学与技术 所属学院: 计算机学院 指导教员: 唐玉华 职 称: 研究员 实 验 室:校计算机中心四号院机房 实验日期: 2010.12.12010.12.19国防科学技术大学训练部制实验报告填写说明1学员完成人才培养方案和课程标准要所要求的每个实验后,均须提交实验报告。2实验报告封面必须打印,报告内容可以手写或打印。3实验报告内容编排及打印应符合以下要求:(1)采用A4(21cm29.7cm)白色复印纸,单面黑字
2、打印。上下左右各侧的页边距均为3cm;缺省文档网格:字号为小4号,中文为宋体,英文和阿拉伯数字为Times New Roman,每页30行,每行36字;页脚距边界为2.5cm,页码置于页脚、居中,采用小5号阿拉伯数字从1开始连续编排,封面不编页码。(2)报告正文最多可设四级标题,字体均为黑体,第一级标题字号为4号,其余各级标题为小4号;标题序号第一级用“一、”、“二、”,第二级用“(一)”、“(二)” ,第三级用“1.”、“2.” ,第四级用“(1)”、“(2)” ,分别按序连续编排。(3)正文插图、表格中的文字字号均为5号。一 实验概述(一)实验目的1.掌握Cache的基本概念、基本组织结构
3、2. 掌握影响Cache性能的三个指标3. 了解相联度对Cache的影响4. 了解块大小对Cache的影响5. 了解替换算法对Cache的影响6. 了解Cache失效的分类及组成情况7. 了解一些基本的Cache性能优化方法(选做)(二)实验步骤1. 运行模拟器SimpleScalar2. 在基本配置情况下运行矩阵乘计算程序统计Cache失效次数,并统计三种 不同类型的失效3. 改变Cache容量,统计各种失效的次数,并进行分析4. 改变Cache的相联度,统计各种失效的次数,并进行分析5. 改变Cache块大小,统计各种失效的次数,并进行分析6. 改变Cache的替换策略,统计各种失效次数,
4、并分析7. 对给出的矩阵乘计算程序进行适当改写以优化cache性能。(选做)(三)实验平台Vmware 虚拟机,redhat 9.0 linux 操作系统,SimpleScalar模拟器 。(四)实验课时3课时(五)参考资料 计算机体系结构教材、SimpleScalar模拟器使用指南等二 背景知识(一) Cache基本知识(1) 可以从三个方面改进Cache的性能:降低失效率、减少失效开销、减少Cache命中时间;(2) 按照产生失效的原因不同,可以把Cache失效分为三类:1) 强制性失效(Compulsory miss)当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Ca
5、che,这就是强制性失效。这种失效也称为冷启动失效或首次访问失效。2) 容量失效(Capacity miss)如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生失效。这种失效称为容量失效。3) 冲突失效(Conflict miss)在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况。这就是发生了冲突失效。这种失效也称为碰撞失效(collision)或干扰失效(interference)。(3) 降低Cache失效率的方法:增加Cache块大小、提高相联度、
6、Victim Cache、伪相联Cache、硬件预取技术、由编译器控制的预取和编译器优化。(4) 替换算法 1) 先进先出法(FIFO)2) 随机法:为了均匀使用一组中的各块,这种方法随机地选择被替换的块。3) 最近最少使用法LRU(Least Recently Used):选择近期最少被访问的块作为被替换的块。但由于实现比较困难,现在实际上实现的LRU都只是选择最久没有被访问过的块作为被替换的块。(二) SimpleScalar简介及使用SimpleScalar 是上世纪由威斯康辛大学发布的一款开源模拟器,具备良好的可移植性和可扩展性。SimpleScalar 在学术界具有十分重要的影响力,
7、根据其官方网站统计,2000-2002 年体系结构顶级会议中有一半以上的研究者采用该模拟器来评估他们的研究成果。作为一款时钟精确的模拟器,SimpleScalar 采用执行驱动方式模拟,包含功能模拟和性能模拟。SimpleScalar 的指令集架构采用C 语言宏声明,目前3.0 版本主要支持PISA 指令集和Alpha 指令集。根据模拟的目的不同,SimpleScalar 包含多个模拟器实体,从最简单的Sim-fast 到最为复杂的Sim-outorder,可分别用于功能模拟、Cache 配置策略、流水线、前瞻预测等体系结构问题的全面研究。同时,随着SimpleScalar 一起发布的还有一系
8、列工具链(交叉编译器,汇编器,流水线跟踪器等),他们与SimpleScalar 的交互过程如图4.1所示。Fortran 代码需要先由F2C工具转换为标准C 代码,交叉编译器则将标准C 代码编译为模拟器后端指令集下的二进制代码,交由模拟器执行模拟,通过这些交互最终实现一个完整的模拟平台。图1 SimpleScalar模拟流程1.编写测试程序#include int main() printf(Hello world!n); return 0;2.编译程序sslittle-na-sstrix-gcc hello.c含义:用simplescalar的编译器对hello.c进行编译,以生成能够在模拟
9、器中运行的可执行文件,此条命令将hello.c编译成a.out.这种可执行文件并不是通常意义下的可执行文件,它的可执行性是相对于模拟器程序而已的。(在这里我们猜测生成的可执行文件默认为a.out,a.out是默认生成的。3.模拟运行sim-safe a.out含义:用sim-safe对a.out进行模拟运行。Sim-safe是simplescalar中的一个模拟器,它会在指令的执行时检查指令的齐整性,检查访存指令的合法性等一些安全性检查。SimpleScalar包含多个模拟器,复杂度由最简单的Sim-safe到最复杂的Sim-outordor,下面简要介绍这些模拟器。(1)Sim-fastSi
10、m-fast是执行速度最快,最不关心模拟过程细节信息的子模拟器程序。它采用顺序执行指令的方式,没有指令并行;不支持cache的使用,也不进行指令正确性检查,由程序员保证每条指令的正确性;不支持模拟器本身内嵌的Dlite!调试器(类似于gdb调试器)。为了模拟器的速度优化,在缺省情况下,sim-fast模拟器不进行时间统计,不对指令的有关信息(如指令总数及访存指令数目)进行统计。当然,可以修改模拟器源程序,通过改变其设置,使模拟器更加符合设计人员的需求。(2)Sim-safe在工具集中,是最简单的最友好的模拟器,检查所有的指令错误,不讲究速度。(3)Sim-bpred实现一个分支预测分析器。(4
11、)Sim-cache这个工具实现cache模拟功能,为用户择的cache和快表设置生成cache统计,其中可能包含两级指令和数据cache ,还有一级指令和数据快表,不会生成时间信息。(5)Sim-eio 这个模拟器支持生成外部事件跟踪(EIO traces)和断点文件。外部事件跟踪俘获程序的执行,并且允许被打包到一个单独的文件,以备以后的再次执行。这个模拟器也提供在外部事件跟踪执行中在任意一点做断点。断点文件可被用于在程序运行中启动simplescalar 模拟器。(6)Sim-outorder最完整的工具。支持依序和乱序执行,branch predictor,memory hierarch
12、y,function unit个数等参数设定。这个模拟器追踪潜在的所有流水(pipeline)操作。(7)Sim-profile 也叫functional simulation,但提供较完整的模拟参数,可依照使用者之设定,决定所要模拟之项目,如instruction classes and addresses、text symbols、memory accesses、branches and data segment symbols以方使用者整收集数据材料。三 实验内容(一) SimpleScalar基本运行模拟开启虚拟机软件Vmware,点击菜单“Flie-Open”,打开目录” D:Red
13、 Hat Linux”下的Red Hat虚拟机。该虚拟机的用户名和密码如下:用户名为:root密码:其中,SimpleScalar模拟器安装在目录/root/SimpleScalar下,test目录为矩阵乘测试程序所在目录点击右键-新建终端,进入目录/root/SimpleScalar/test/目录,命令为:rootlocalhost root# cd /root/simplescalar/test/1. 编译测试程序该目录下有一个1.c文件,该文件为矩阵乘测试程序文件,首先需要使用SimpleScalar的交叉编译器将该文件便以为SimpleScalar模拟器上可以执行的二进制文件,编译命
14、令为:rootlocalhost test# sslittle-na-sstrix-gcc 1.c此时该目录下会多出来一个a.out文件,该文件即为SimpleScalar上可执行二进制文件。2模拟执行我们采用SimpleScalar的sim-cache模拟器对刚才编译出来的可执行文件进行模拟执行,最简单的执行命令为:rootlocalhost test# sim-cache a.out如果执行成功,会出现如下图所示的界面:此时输入三个矩阵A,B,C的大小M、N、K,得到模拟执行结果,如下图所示:3Cache配置在上述的执行中,没有对Cache的结构进行配置,使用了默认的Cache配置。在我们
15、的实验中,需要对Cache 参数进行详细配置。一般来说,Cache的结构参数主要包括以下几个方面:容量、块大小、相联度、替换算法等。在SimpleScalar模拟器中,采用了两级Cache结构,同时数据和指令Cache分开。SimpleScalar的Cache参数配置命令为::其中: : Cache的名称,其中: dl1:一级数据Cache dl2:二级数据Cache il1:一级指令Cache il2:二级指令Cache dtlb:数据TLBitlb:指令TLB : 组的数目:块大小 -:相联度 -:替换策略此时,Cache容量为:*替换策略主要有以下几种:l :LRU,最近最少使用f :
16、FIFO,先进先出r : RANDOM,随机策略例如:-cache:dl1 dl1:1024:32:2:l 表示对一级数据cache进行配置,1024表示有1024组,Cache块大小为32个byte,每个组有2个Cache块,即相联度为2,替换策略为LRU。在此配置下,一级数据Cache的容量为1024*32*2=64K byte。例如对上述矩阵乘测试程序,使用该配置进行模拟执行的命令为:rootlocalhost test# sim-cache -cache:dl1 dl1:1024:32:2:l a.out(二) SimpleScalar模拟统计信息详解采用上述命令执行后,得到如下所示的
17、信息,其详解如下:执行模拟的命令rootlocalhost test# sim-cache -cache:dl1 dl1:1024:32:2:l a.outsim-cache: SimpleScalar/PISA Tool Set version 3.0 of August, 2003.Copyright (c) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC.All Rights Reserved. This version of SimpleScalar is licensed for academicnon-commerc
18、ial use. No portion of this work may be used by any commercial版权声明等,不用关心entity, or for any commercial purpose, without the prior written permissionof SimpleScalar, LLC (info). sim: command line: sim-cache -cache:dl1 dl1:1024:32:2:l a.out sim: simulation started Sun Nov 28 22:49:41 2010, options foll
19、ow: sim-cache: This simulator implements a functional cache simulator. Cachestatistics are generated for a user-selected cache and TLB configuration,which may include up to two levels of instruction and data cache (with anylevels unified), and one level of instruction and data TLBs. No timinginforma
20、tion is generated.sim-cache的运行命令参数帮助说明,有兴趣可以了解。 # -config # load configuration from a file# -dumpconfig # dump configuration to a file# -h false # print help message# -v false # verbose operation# -d false # enable debug message# -i false # start in Dlite debugger-seed 1 # random number generator se
21、ed (0 for timer seed)# -q false # initialize and terminate immediately# -chkpt # restore EIO trace execution from # -redir:sim # redirect simulator output to file (non-interactive only)# -redir:prog # redirect simulated program output to file-nice 0 # simulator scheduling priority-max:inst 0 # maxim
22、um number of insts to execute-cache:dl1 dl1:1024:32:2:l # l1 data cache config, i.e., |none-cache:dl2 ul2:1024:64:4:l # l2 data cache config, i.e., |none-cache:il1 il1:256:32:1:l # l1 inst cache config, i.e., |dl1|dl2|none-cache:il2 dl2 # l2 instruction cache config, i.e., |dl2|none-tlb:itlb itlb:16
23、:4096:4:l # instruction TLB config, i.e., |none-tlb:dtlb dtlb:32:4096:4:l # data TLB config, i.e., |none-flush false # flush caches on system calls-cache:icompress false # convert 64-bit inst addresses to 32-bit inst equivalents# -pcstat # profile stat(s) against text addrs (mult uses ok) The cache
24、config parameter has the following format: : - name of the cache being definedSim-cache的cache参数配置帮助说明,建议了解。 - number of sets in the cache - block size of the cache - associativity of the cache - block replacement strategy, l-LRU, f-FIFO, r-random Examples: -cache:dl1 dl1:4096:32:1:l -dtlb dtlb:128:4
25、096:32:r Cache levels can be unified by pointing a level of the instruction cache hierarchy at the data cache hiearchy using the dl1 and dl2 cache configuration arguments. Most sensible combinations are supported, e.g., A unified l2 cache (il2 is pointed at dl2): -cache:il1 il1:128:64:1:l -cache:il2
26、 dl2 -cache:dl1 dl1:256:32:1:l -cache:dl2 ul2:1024:64:2:l Or, a fully unified cache hierarchy (il1 pointed at dl1): -cache:il1 dl1此处正式开始模拟 -cache:dl1 ul1:256:32:1:l -cache:dl2 ul2:1024:64:2:l sim: * starting functional simulation w/ caches *Please input the value of M, N, K (which must be int number
27、s):M=2N=3模拟执行矩阵乘操作的输出K=4Matrix A: 2*3 2 2 2 2 2 2 Matrix B: 3*4 2 2 2 2 2 2 2 2 2 2 2 2 以下均为模拟统计信息输出Matrix C: 3*4 12 12 12 12 12 12 12 12 sim: * simulation statistics *模拟总体信息统计sim_num_insn # total number of instructions executed 总模拟指令条数sim_num_refs 34213 # total number of loads and stores executed 所
28、有的访存指令条数sim_elapsed_time 200 # total simulation time in seconds 总的模拟时钟周期数sim_inst_rate 528.3150 # simulation speed (in insts/sec) 模拟速度il1.accesses # total number of accesses 一级指令cache的访问数目il1.hits 90939 # total number of hits 一级指令cache的命中数目il1.misses 14724 # total number of misses 一级指令cache的实效数目一级指令
29、cache的性能统计信息il1.replacements 14468 # total number of replacements 一级指令cache上发生替换的数目il1.writebacks 0 # total number of writebacks 一级指令cache上发生写回的数目il1.invalidations 0 # total number of invalidations 一级指令cache上访存无效的数目il1.miss_rate 0.1393 # miss rate (i.e., misses/ref) 一级指令cache上的失效率il1.repl_rate 0.136
30、9 # replacement rate (i.e., repls/ref) 一级指令cache上的替换概率il1.wb_rate 0.0000 # writeback rate (i.e., wrbks/ref) 一级指令cache上的写回概率il1.inv_rate 0.0000 # invalidation rate (i.e., invs/ref) 一级指令cache上的无效概率dl1.accesses 34648 # total number of accesses 一级数据cache上的总访问数目dl1.hits 33972 # total number of hits 一级数据c
31、ache上的命中次数dl1.misses 676 # total number of misses 一级数据cache上的实效次数一级数据cache的性能统计信息,重点关注dl1.replacements 1 # total number of replacements 一级数据cache上发生替换的次数dl1.writebacks 0 # total number of writebacks 一级数据cache上发生写回的次数dl1.invalidations 0 # total number of invalidations 一级数据cache上无效访问的次数dl1.miss_rate 0
32、.0195 # miss rate (i.e., misses/ref) 一级数据cache上的失效率dl1.repl_rate 0.0000 # replacement rate (i.e., repls/ref) 一级数据cache上发生替换的概率dl1.wb_rate 0.0000 # writeback rate (i.e., wrbks/ref) 一级数据cache上发生写回的概率dl1.inv_rate 0.0000 # invalidation rate (i.e., invs/ref) 一级数据cache上发生无效访问的次数ul2.accesses 15400 # total
33、number of accesses 联合二级cache上总的访问次数二级cache的性能统计信息ul2.hits 14280 # total number of hits 联合二级cache上命中的次数ul2.misses 1120 # total number of misses 联合二级cache上失效的次数ul2.replacements 0 # total number of replacements 联合二级cache上发生替换的次数ul2.writebacks 0 # total number of writebacks 联合二级cache上发生写回的系数ul2.invalida
34、tions 0 # total number of invalidations 联合二级cache上无效访问的次数ul2.miss_rate 0.0727 # miss rate (i.e., misses/ref) 联合二级cache上的失效率ul2.repl_rate 0.0000 # replacement rate (i.e., repls/ref) 联合二级cache上发生替换的概率ul2.wb_rate 0.0000 # writeback rate (i.e., wrbks/ref) 联合二级cache上发生写回的概率ul2.inv_rate 0.0000 # invalidat
35、ion rate (i.e., invs/ref) 发生无效访问的概率itlb.accesses # total number of accesses 指令TLB上访问次数itlb.hits # total number of hits 指令TLB上命中次数指令TLB的性能统计信息itlb.misses 23 # total number of misses 指令TLB上失效的次数itlb.replacements 0 # total number of replacements 指令TLB上发生替换的次数itlb.writebacks 0 # total number of writebac
36、ks 指令TLB上发生写回的次数itlb.invalidations 0 # total number of invalidations 指令TLB上发生无效访问的次数itlb.miss_rate 0.0002 # miss rate (i.e., misses/ref) 指令TLB上的失效率itlb.repl_rate 0.0000 # replacement rate (i.e., repls/ref) 指令TLB上的替换概率itlb.wb_rate 0.0000 # writeback rate (i.e., wrbks/ref) 指令TLB上写回的概率itlb.inv_rate 0.0
37、000 # invalidation rate (i.e., invs/ref) 指令TLB上无效访问的概率dtlb.accesses 34648 # total number of accesses 指令TLB上总的访问次数dtlb.hits 34636 # total number of hits 数据TLB上总的访问次数数据TLB的性能统计信息dtlb.misses 12 # total number of misses 数据TLB上总的失效次数dtlb.replacements 0 # total number of replacements 数据TLB上总的替换次数dtlb.writ
38、ebacks 0 # total number of writebacks 数据TLB上发生写回的次数dtlb.invalidations 0 # total number of invalidations 数据TLB上发生无效访问的次数dtlb.miss_rate 0.0003 # miss rate (i.e., misses/ref) 数据TLB上失效率dtlb.repl_rate 0.0000 # replacement rate (i.e., repls/ref) 数据TLB上发生替换的概率dtlb.wb_rate 0.0000 # writeback rate (i.e., wrb
39、ks/ref) 数据TLB上发生写回的概率dtlb.inv_rate 0.0000 # invalidation rate (i.e., invs/ref) 数据TLB上发生无效访问的概率ld_text_base 0x # program text (code) segment base ld_text_size 96544 # program text (code) size in bytesld_data_base 0x # program initialized data segment baseld_data_size 12288 # program inited .data and uninited .bss size in bytesld_stack_base 0x7fffc000 # program stack segment base (highest address in stack)ld_stack_size 16384 # program initial stack sizeld_prog_entry 0x # program entry