1实验报告实验名称:计算机原理cache性能分析及优化实验学员:张英杰学号:201008040092培养类型:4+1军人年级:任职培训队专业:计算机科学与技术所属学院:计算机学院指导教员:唐玉华职称:研究员实验室:校计算机中心四号院机房实验日期:2010.12.1—2010.12.19国防科学技术大学训练部制2《实验报告》填写说明1.学员完成人才培养方案和课程标准要所要求的每个实验后,均须提交实验报告。2.实验报告封面必须打印,报告内容可以手写或打印。3.实验报告内容编排及打印应符合以下要求:(1)采用A4(21cm×29.7cm)白色复印纸,单面黑字打印。上下左右各侧的页边距均为3cm;缺省文档网格:字号为小4号,中文为宋体,英文和阿拉伯数字为TimesNewRoman,每页30行,每行36字;页脚距边界为2.5cm,页码置于页脚、居中,采用小5号阿拉伯数字从1开始连续编排,封面不编页码。(2)报告正文最多可设四级标题,字体均为黑体,第一级标题字号为4号,其余各级标题为小4号;标题序号第一级用“一、”、“二、”……,第二级用“(一)”、“(二)”……,第三级用“1.”、“2.”……,第四级用“(1)”、“(2)”……,分别按序连续编排。(3)正文插图、表格中的文字字号均为5号。3一实验概述(一)实验目的1.掌握Cache的基本概念、基本组织结构2.掌握影响Cache性能的三个指标3.了解相联度对Cache的影响4.了解块大小对Cache的影响5.了解替换算法对Cache的影响6.了解Cache失效的分类及组成情况7.了解一些基本的Cache性能优化方法(选做)(二)实验步骤1.运行模拟器SimpleScalar2.在基本配置情况下运行矩阵乘计算程序统计Cache失效次数,并统计三种不同类型的失效3.改变Cache容量,统计各种失效的次数,并进行分析4.改变Cache的相联度,统计各种失效的次数,并进行分析5.改变Cache块大小,统计各种失效的次数,并进行分析6.改变Cache的替换策略,统计各种失效次数,并分析7.对给出的矩阵乘计算程序进行适当改写以优化cache性能。(选做)(三)实验平台Vmware虚拟机,redhat9.0linux操作系统,SimpleScalar模拟器。(四)实验课时3课时(五)参考资料计算机体系结构教材、SimpleScalar模拟器使用指南等二背景知识(一)Cache基本知识(1)可以从三个方面改进Cache的性能:降低失效率、减少失效开销、减少Cache命中时间;(2)按照产生失效的原因不同,可以把Cache失效分为三类:1)强制性失效(Compulsorymiss)4当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache,这就是强制性失效。这种失效也称为冷启动失效或首次访问失效。2)容量失效(Capacitymiss)如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生失效。这种失效称为容量失效。3)冲突失效(Conflictmiss)在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况。这就是发生了冲突失效。这种失效也称为碰撞失效(collision)或干扰失效(interference)。(3)降低Cache失效率的方法:增加Cache块大小、提高相联度、VictimCache、伪相联Cache、硬件预取技术、由编译器控制的预取和编译器优化。(4)替换算法1)先进先出法(FIFO)2)随机法:为了均匀使用一组中的各块,这种方法随机地选择被替换的块。3)最近最少使用法LRU(LeastRecentlyUsed):选择近期最少被访问的块作为被替换的块。但由于实现比较困难,现在实际上实现的LRU都只是选择最久没有被访问过的块作为被替换的块。(二)SimpleScalar简介及使用SimpleScalar是上世纪由威斯康辛大学发布的一款开源模拟器,具备良好的可移植性和可扩展性。SimpleScalar在学术界具有十分重要的影响力,根据其官方网站统计,2000-2002年体系结构顶级会议中有一半以上的研究者采用该模拟器来评估他们的研究成果。作为一款时钟精确的模拟器,SimpleScalar采用执行驱动方式模拟,包含功能模拟和性能模拟。SimpleScalar的指令集架构采用C语言宏声明,目前3.0版本主要支持PISA指令集和Alpha指令集。根据模拟的目的不同,SimpleScalar包含多个模拟器实体,从最简单的Sim-fast到最为复杂的Sim-outorder,可分别用于功能模拟、Cache配置策略、流水线、前瞻预测等体系结构问题的全面研究。同时,随着SimpleScalar一起发布的还有一系列工具链(交叉编译器,汇编器,流水线跟踪器等),他们与SimpleScalar的交互过程如图4.1所示。Fortran代码需要先由F2C工5具转换为标准C代码,交叉编译器则将标准C代码编译为模拟器后端指令集下的二进制代码,交由模拟器执行模拟,通过这些交互最终实现一个完整的模拟平台。F2CGCCGASGLDSimulatorBinUtilslibf77.alibf2c.alibc.aFortrancodeCcodeAsssemblycodeObjectfiles模拟执行图1SimpleScalar模拟流程1.编写测试程序#includestdio.hintmain(){printf(Helloworld!\n);return0;}2.编译程序sslittle-na-sstrix-gcchello.c含义:用simplescalar的编译器对hello.c进行编译,以生成能够在模拟器中运行的可执行文件,此条命令将hello.c编译成a.out.这种可执行文件并不是通常意义下的可执行文件,它的可执行性是相对于模拟器程序而已的。(在这里我们猜测生成的可执行文件默认为a.out,a.out是默认生成的。3.模拟运行sim-safea.out含义:用sim-safe对a.out进行模拟运行。Sim-safe是simplescalar中的一个模拟器,它会在指令的执行时检查指令的齐整性,检查访存指令的合法性等一些安全6性检查。SimpleScalar包含多个模拟器,复杂度由最简单的Sim-safe到最复杂的Sim-outordor,下面简要介绍这些模拟器。(1)Sim-fastSim-fast是执行速度最快,最不关心模拟过程细节信息的子模拟器程序。它采用顺序执行指令的方式,没有指令并行;不支持cache的使用,也不进行指令正确性检查,由程序员保证每条指令的正确性;不支持模拟器本身内嵌的Dlite!调试器(类似于gdb调试器)。为了模拟器的速度优化,在缺省情况下,sim-fast模拟器不进行时间统计,不对指令的有关信息(如指令总数及访存指令数目)进行统计。当然,可以修改模拟器源程序,通过改变其设置,使模拟器更加符合设计人员的需求。(2)Sim-safe在工具集中,是最简单的最友好的模拟器,检查所有的指令错误,不讲究速度。(3)Sim-bpred实现一个分支预测分析器。(4)Sim-cache这个工具实现cache模拟功能,为用户择的cache和快表设置生成cache统计,其中可能包含两级指令和数据cache,还有一级指令和数据快表,不会生成时间信息。(5)Sim-eio这个模拟器支持生成外部事件跟踪(EIOtraces)和断点文件。外部事件跟踪俘获程序的执行,并且允许被打包到一个单独的文件,以备以后的再次执行。这个模拟器也提供在外部事件跟踪执行中在任意一点做断点。断点文件可被用于在程序运行中启动simplescalar模拟器。(6)Sim-outorder最完整的工具。支持依序和乱序执行,branchpredictor,memoryhierarchy,functionunit个数等参数设定。这个模拟器追踪潜在的所有流水(pipeline)操作。(7)Sim-profile也叫functionalsimulation,但提供较完整的模拟参数,可依照使用者之设定,决定所要模拟之项目,如instructionclassesandaddresses、textsymbols、memoryaccesses、branchesanddatasegmentsymbols以方便使用者整理收集数据材料。7三实验内容(一)SimpleScalar基本运行模拟开启虚拟机软件Vmware,点击菜单“Flie-Open”,打开目录”D:\RedHatLinux\”下的RedHat虚拟机。该虚拟机的用户名和密码如下:用户名为:root密码:123456其中,SimpleScalar模拟器安装在目录/root/SimpleScalar下,test目录为矩阵乘测试程序所在目录点击右键-新建终端,进入目录/root/SimpleScalar/test/目录,命令为:[root@localhostroot]#cd/root/simplescalar/test/1.编译测试程序该目录下有一个1.c文件,该文件为矩阵乘测试程序文件,首先需要使用SimpleScalar的交叉编译器将该文件便以为SimpleScalar模拟器上可以执行的二进制文件,编译命令为:[root@localhosttest]#sslittle-na-sstrix-gcc1.c此时该目录下会多出来一个a.out文件,该文件即为SimpleScalar上可执行二进制文件。2.模拟执行我们采用SimpleScalar的sim-cache模拟器对刚才编译出来的可执行文件进行模拟执行,最简单的执行命令为:[root@localhosttest]#sim-cachea.out如果执行成功,会出现如下图所示的界面:8此时输入三个矩阵A,B,C的大小M、N、K,得到模拟执行结果,如下图所示:93.Cache配置在上述的执行中,没有对Cache的结构进行配置,使用了默认的Cache配置。在我们的实验中,需要对Cache参数进行详细配置。一般来说,Cache的结构参数主要包括以下几个方面:容量、块大小、相联度、替换算法等。在SimpleScalar模拟器中,采用了两级Cache结构,同时数据和指令Cache分开。SimpleScalar的Cache参数配置命令为:name:nsets:bsize:assoc:repl其中:name:Cache的名称,其中:dl1:一级数据Cachedl2:二级数据Cacheil1:一级指令Cacheil2:二级指令Cachedtlb:数据TLBitlb:指令TLBnsets:组的数目bsize:块大小assoc-:相联度repl-:替换策略此时,Cache容量为:nsets*bsize*assoc替换策略主要有以下几种:l:LRU,最近最少使用f:FIFO,先进先出r:RANDOM,随机策略例如:-cache:dl1dl1:1024:32:2:l表示对一级数据cache进行配置,1024表示有1024组,Cache块大小为32个byte,每个组有2个Cache块,即相联度为2,替换策略为LRU。在此配置下,一级数据Cache的容量为1024*32*2=64Kbyte。例如对上述矩阵乘测试程序,使用该配置进行模拟执行的命令为:10[root@localhosttest]#sim-cache-cache:dl1dl1:1024:32:2:la.out(二)SimpleScalar模拟统计信息详解采用上述命令执行后,得到如下所示的信息,其详解如下:[root@localhosttest]#sim-cache-cache:dl1dl1:1024:32:2:la.outsim-cache:SimpleScalar/PISAToolSetversion3.