【计算机组成与体系结构Ⅱ】Cache性能分析(实验)

本文详细描述了一项关于Cache性能的实验,通过分析Cache容量、相联度、块大小对失效率的影响,以及LRU和随机替换算法的作用,揭示了如何通过这些因素降低Cache不命中率,优化Cache性能。
摘要由CSDN通过智能技术生成

实验6:Cache性能分析

一、实验目的

1:加深对 Cache 的基本概念、基本组织结构以及基本工作原理的理解。

2:掌握 Cache 容量、相联度、块大小对 Cache 性能的影响。

3:掌握降低 Cache 不命中率的各种方法以及这些方法对提高 Cache 性能的好处。

4:理解 LRU 与随机法的基本思想以及它们对 Cache 性能的影响。

二、实验平台

    Cache模拟器:MyCache。

三、实验内容与步骤

3.1:掌握 MyCache 模拟器的使用方法

1:启动 MyCache。

2:用鼠标点击“复位”按钮,把各参数设置为默认值。

3:选择一个地址流文件。方法: 选择“访问地址”的“地址流文件”选项,然后点击“浏览”按钮,从 MyCache 模拟器所在的文件夹下的“地址流”文件夹中选取地址流文件(如:ed.din)。

4:设置相关参数,选择执行到底或步进执行,得到相关失效率结果。

3.2:Cache 容量对失效率的影响

地址流文件:eg.din(由于eg.din文件在后面表现不好,因此本实验在初步检测效果时均改为使用all.din文件)

Cache 容量

(KB)

2

4

8

16

32

64

128

256

失效率

5.4%

5.4%

5.0%

4.7%

4.7%

4.7%

4.7%

4.7%

表0:不同容量下 Cache 的失效率

地址流文件:all.din

Cache 容量

(KB)

2

4

8

16

32

64

128

256

失效率

9.87%

7.19%

4.48%

2.65%

1.42%

0.89%

0.60%

0.49%

表1:不同容量下 Cache 的失效率

【结论】增大Cache的容量时,可以在一定程度上减少容量失效,降低Cache的失效率。

3.3:相联度对失效率的影响

地址流文件:all.din

【Cache容量 = 64KB时】

相联度

1

2

4

8

16

32

失效率

0.89%

0.53%

0.47%

0.45%

0.44%

0.44%

表2:当容量为 64KB 时, 不同相联度下 Cache 的失效率

【Cache容量 = 256KB时】

相联度

1

2

4

8

16

32

失效率

0.49%

0.38%

0.36%

0.36%

0.35%

0.35%

表3:当容量为 256KB 时, 不同相联度下 Cache 的失效率

【结论】增大Cache的相联度时,可以在一定程度上减少冲突失效,降低Cache的失效率。

3.4:Cache 块大小对失效率的影响

地址流文件:all.din

块大小

(B)

Cache 容量(KB)

2

8

32

128

512

16

12.02%

5.79%

1.86%

0.95%

0.71%

32

9.87%

4.48%

1.42%

0.60%

0.42%

64

9.36%

4.03%

1.20%

0.43%

0.27%

128

10.49%

4.60%

1.08%

0.35%

0.20%

256

13.45%

5.35%

1.19%

0.34%

0.16%

表4:各种块大小情况下 Cache 的失效率

【结论】对于给定的Cache容量,当块大小增加的时候,失效率先下降后上升。同时,Cache的容量越大,失效率达到最低的块大小(极小值点)就越大。因此,在一定范围内增加Cache的块大小,可以减少强制性失效。给定容量cache,块太小1次调进cache数据少,失效率增加;块太大,块数太少,冲突失效增加。

3.5:替换算法对失效率的影响

地址流文件:all.din

Cache

容量

相  联  度

2  路

4  路

8  路

LRU

随机算法

LRU

随机算法

LRU

随机算法

16KB

1.71%

2.05%

1.33%

1.77%

1.21%

1.97%

64KB

0.53%

0.63%

0.47%

0.58%

0.45%

0.59%

256KB

0.38%

0.40%

0.36%

0.37%

0.36%

0.36%

1MB

0.35%

0.35%

0.35%

0.35%

0.35%

0.35%

表5:LRU 和随机替换法的失效率的比较

【结论】当Cache容量较小时(<=64KB),同种相联度采用LRU替换算法的失效率明显低于采用随机算法的失效率,即说明Cache容量较小时LRU替换算法更优。当Cache容量较大时,同种相联度采用LRU替换算法的失效率与采用随机算法的失效率大致相同,即说明Cache容量较大时LRU替换算法和随即替换法的效果相似。

3.6:混合 Cache 和分离 Cache 的比较

地址流文件:all.din

    其中,指令Cache的容量 = 数据Cache的容量 = 1/2 混合Cache的容量。

总容量

指令 Cache

数据 Cache

混合 Cache

4KB

6.01%

7.19%

8KB

4.16%

4.48%

16KB

2.65%

2.65%

32KB

1.52%

1.42%

64KB

0.79%

0.89%

128KB

0.53%

0.60%

256KB

0.45%

0.49%

表6:分离 Cache 和混合 Cache 失效率的比较

【结论】当总容量一定时,分离Cache的失效率通常低于混合Cache的失效率。随着Cache容量的增加,无论是分离Cache还是混合Cache,失效率都有所降低。

3.7:Cache 工作原理剖析

(1)测试eg.din地址流


参数设置:

执行控制采用“步进”模式,观察结果,填写实验“实验 6- 中间结果分析”中的“eg.din” 页表, 进行分析并回答问题。

【步进结果】

Step1:

Step2:


Step3:


Step4:


Step5:


Step6:


Step7:


Step8:


Step9:


Step10:

【问题回答】

1)Cache分为几组?每组多少块,块的大小是多少?

组数 = 容量 / 块大小 / 相联度 = 2KB / 16B / 2 = 2^6 = 64,因此Cache分为64组。

每组2块,因为是2路组相联。

块大小是16B,条件中已经给出。

2)索引用多少位表示?对应地址的第几位到第几位?组号和索引之间什么关系?用多少位?块号用多少位,块内地址多少位?

索引的长度与Cache的组数相关,用于映射所在组的行号。Cache一共64(2^6)组,因此索引需要6位来表示。

由于块大小是16B = 2^4 B,因此块内地址占4位。所以从右侧数起的第5位地址~第10位地址是索引对应的地址位置。

主存的组号与Cache的索引之间是一一映射的,即相同。

均用6位。

主存的块号用28位,块内地址用4位。

3)目录表中多少行,多少列?如何找到对应块号并读入?

目录表中的行数与Cache的组数相同,所以是64行。目录表需要存储主存的块号和Cache的组号,所以是2列。

根据主存地址,可以求出主存的Tag、映射的Cache组号、块内地址。在目录表中找到该主存地址映射的Cache组号,比较目录表该行的Tag是否与该主存地址的Tag相同。该Tag是主存块号去掉末尾映射的Cache组号所构成的。

4)如果是直接相联,索引用多少位?目录表中多少行?

直接相联的组数 = 容量 / 块大小 = 2KB / 16B = 2^7 = 128。索引用7位。

目录表中有128行。

5)从内存读取的数据多大,读取操作完毕之后Cache里面得到的数据多少位?

从内存读取数据以块为单位,块有多大则读取的数据有多大。所以读取的数据为16B。

读取操作完毕后,Cache里面得到的数据是16B = 16 * 8 bit = 128bit。

6)这里的块号是主存块号还是Cache块号?

主存块号。明显超出了Cache的块数。

7)按照索引进行寻址,要进行几次比较?跟什么有关系?

2次比较。首先比较索引,然后比较Tag。

跟相联度有关系。

8)Cache里面会把该数据调入吗?是先调入后写还是先写后调入?

会。

先调入后写。

9)采用写回策略,存储器中的数据会修改吗?

不会修改。仅当Cache中相应的块被替换时,才写回主存。

10)解释什么是命中?最后传给CPU的数据是多少位?

CPU在Cache中寻找所需的数据,若该数据存在Cache中,就表示命中,否则缺失。

最后传给CPU的数据是32位,调入是一整个块,但是CPU执行只传送一个字。

【Excel表格填写】


基本设置:


序号1~序号8:


序号9~序号10:

(2)测试mytest.din地址流

例题:设一个 Cache 中有 8 个块,访问主存进行读操作的块地址序列为 22、26、22、26、16、 4、16、18(地址内位移可以随机设定),分析每次访问后的 Cache 内容和命中率。


参数设置:

内存地址范围 0X00000000-0XFFFFFFFF,编写地址流文件,保证 Cache 的块数为 8。

执行控制采用 “步进” 模式,观察结果,填写实验“实验 6- 中间 结果分析 ”中的“mytest.din”页表,进行分析并回答问题。


    验证结构是否和下图的分析结构相同。

【步进结果】


Step1:


Step2:


Step3:


Step4:


Step5:


Step6:


Step7:


Step8:

【Excel表格填写】


基本设置:

序号1~序号8:

【验证结构】

由Excel表的结果可知,Cache实际工作的结果和下图的分析结构基本相同。(除了第8次执行的替换中,Cache第4行的数据消失了)

在第1次执行时,由于Cache第6行为空,所以向Cache第6行写入主存第22块的内容。

在第2次执行时,由于Cache第2行为空,所以向Cache第2行写入主存第26块的内容。

在第3次执行时,需要访问主存中第22块的内容,因此先向Cache第6行中比对Tag,发现Tag一致,则命中。

在第4次执行时,需要访问主存中第26块的内容,因此先向Cache第2行中比对Tag,发现Tag一致,则命中。

在第5次执行时,由于Cache第0行为空,所以向Cache第0行写入主存第16块的内容。

在第6次执行时,由于Cache第4行为空,所以向Cache第4行写入主存第4块的内容。

在第7次执行时,需要访问主存中第16块的内容,因此先向Cache第0行中比对Tag,发现Tag一致,则命中。


在第8次执行时,需要访问主存中第18块的内容,因此先向Cache第2行中比对Tag,发现Tag不一致,则不命中,且将原来主存第26块的内容,替换为主存第18块的内容。

【地址流文件内容】

    mytest.din文件的内容如下所示:

2 1680  00010110 10000000

2 1AA5  00011010 10100101

2 1663  00010110 01100011

2 1A48  00011010 01001000

2 1021  00010000 00100001

2 401   00000100 00000001

2 1006  00010000 00000110

2 12E3  00010010 11100011

 

【问题回答】

1)Cache分为几组?每组多少块,块的大小是多少?

2KB / 256B = 2^11B / 2^8B = 2^3,所以Cache分为8块。

每组1块,因为是直接相联。

块的大小是256B。

2)索引用多少位表示?对应地址的第几位到第几位?组号和索引之间什么关系?用多少位?块号用多少位,块内地址多少位?

索引用3位表示,因为一共有2^3=8块。

由于块大小是256B = 2^8 B,因此块内地址占8位。所以从右侧数起的第9位地址~第11位地址是索引对应的地址位置。

主存的组号与Cache的索引之间是一一映射的,即相同。

均用3位。

所以主存的块号用32 – 8 = 24 位,块内地址用8位。

3)目录表中多少行,多少列?如何找到对应块号并读入?

目录表中的行数与Cache的组数相同,所以是8行。目录表需要存储主存的块号和Cache的组号,所以是2列。

读出目录表中的tag内容与主存的比较。

4)从内存读取的数据多大,读取操作完毕之后Cache里面得到的数据多少位?

从内存读取的数据为一个块的大小,即256B。

读取操作完毕之后,Cache里面得到的数据位数是:256 * 8 bit = 2048bit。

四、实验总结

1:在mytest.din的实验中,主存的地址范围是0X0000 0000 – 0XFFFF FFFF ,最大地址对应的十进制数是4294967295。4294967295 / 8 = 536870911.875,取整后可知主存需要划分为536870912个块,十六进制下为2000 0000。


2:全相联的映射关系如下图所示。主存和Cache按照块大小进行划分编号后,主存中任意一块都可以映射到Cache的任意一行。如果Cache存满(每一行都对应了一个主存块),则采用相应的替换原则进行主存块内容的替换。


3:直接相联的映射关系如下图所示。主存和Cache按照块大小进行划分编号后,主存中块必须按照【主存块号 % Cache块数】的关系进行映射,即相同余数的主存块存到Cache的同一行位置处,如果已经存有主存块的数据,则需要替换。


4:组相联的映射关系如下图所示。主存和Cache按照块大小进行划分编号后,Cache按照相联度进行组的划分,而主存按照Cache中的组数进行组群的划分。主存中的组群按照直接相联的方法进行映射,主存中组群内的块按照全相联的方法在对应的Cache组里面进行映射。

5:在编写mytest.din文件时,可以使用记事本打开,只需要编写1个label和1个address,其余内容会自动默认是注释。在label中的对应关系如下表所示。同时,address的范围是[0,FFFFFFFF]。

Label类型

类型含义

0

read data  读数据

1

write data  写数据

2

instruction fetch  取指令

3

escape record (treated as unknown access type)
 转义记录(视为未知访问类型)

4

escape record (causes cache flush)
转义记录(导致缓存刷新)

6:Cache的失效类型分为以下三种:

  1. 强制性失效:第一次访问Cache,该块不在Cache中,要从下级存储器中调入;发生在空Cache中。
  2. 容量失效:Cache容量有限,所需块无法全部调入;块被替换后可能被重新访问,发生失效;发生在全相联Cache中。
  3. 冲突失效:直接相联或组相联Cache,组内空间已满,进行替换后又被重新访问(其他组有空闲块,或对某些组块数要求超过了n路)。

7:2:1的Cache经验规则:容量为N的直接映象Cache失效率约等于容量为N/2的2路组相联Cache失效率,当N > 128KB时不成立。

8:降低Cache失效率 的方法。

  • 26
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
缓存是现代计算机系统中的重要组成部分,主要作用是提高计算机处理数据时的效率。缓存的原理是将计算机处理数据时经常用到的数据存储在靠近处理器的高速缓存中,以提高数据的访问速度和处理效率。 缓存的性能主要取决于其大小和命中率。缓存的大小是指缓存可以存储多少数据,通常以字节为单位进行计算。缓存的命中率是指程序访问的数据中,有多少数据被存储在缓存中。当程序访问数据时,如果数据已经存储在缓存中,则称为“命中”,否则称为“未命中”。 为了评估缓存的性能,我们可以进行一系列实验。我们可以编写一个简单的程序,在程序中模拟数据访问的过程,然后使用valgrind工具来监测程序的内存使用情况和cache的使用情况。通过分析实验结果,我们可以得出缓存的性能表现,并确定如何优化缓存性能。 例如,我们可以测试程序在没有使用缓存的情况下的性能,这样可以确定程序的基准性能。接下来,我们可以测试程序在使用缓存的情况下的性能,这样可以确定缓存对程序性能的影响。我们可以测试不同缓存大小的情况下程序的性能,这样可以确定缓存大小对程序性能的影响。最后,我们可以测试不同缓存大小的情况下,cache命中率的变化,这样可以确定缓存大小和命中率之间的关系。 总之,通过对缓存性能实验分析,可以帮助我们了解缓存的工作原理和性能特征,进而优化程序的性能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MorleyOlsen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值