CS 211:计算机体系结构,2024年春季
编程任务5:模拟缓存(100分)
讲师:Santosh Nagarakatte教授
到期时间:美国东部时间2024年4月25日下午5点。介绍
此任务的目标是帮助您更好地理解缓存。你需要写一个
使用C编程语言的缓存模拟器。这些程序必须在iLab机器上运行。我们提供真实的程序内存跟踪作为您的缓存模拟器的输入。这个班不允许作弊或抄袭。您的课业将自动完成
使用强大的剽窃检测工具进行检查。因此,你不应该看你的朋友的代码或使用任何来自互联网或其他来源的代码,如Chegg/Freelancer。我们强烈建议不要使用任何大型语言模型,而是使用提供的代码示例因为它可能会引发剽窃违规行为。所有违规行为将报告给学生办公室行为请参阅罗格斯大学的学术诚信政策:
http://academicintegrity.rutgers.edu/内存访问跟踪
缓存模拟器的输入是一个内存访问跟踪,我们通过执行
真正的程序。跟踪包含在程序执行期间访问的内存地址。你的缓存模拟器必须使用这些地址来确定访问是命中还是未命中,以及在每种情况下要执行的操作。内存跟踪文件由多行组成。的每一行跟踪文件对应于由程序执行的存储器访问。每条线由两条组成列,它们是空间分隔的。第一列列出内存访问是否为读取(R)或者写入(W)操作。第二列报告实际的48位内存地址已被程序访问。这是一个示例跟踪文件。
R 0x9cb3d40
W 0x9cb3d40
R 0x9cb3d44
W 0x9cb3d44
R 0xbf8ef498
第一部分-一级缓存-50分
您将实现一个缓存模拟器来评估缓存的不同配置。以下内容是高速缓存模拟器第一部分的要求。
1.
仅模拟一级缓存;即L1高速缓存。
缓存大小、关联性、替换策略和块大小是输入参数。
缓存大小和块大小以字节为单位指定。
您必须模拟直写缓存。
替换算法:您必须支持两种替换策略。两个替换
策略是:先进先出(FIFO)和最近最少使用(LRU)。接下来,您将了解有关缓存替换策略的更多信息。
缓存替换策略
缓存替换策略的目标是决定在没有的情况下必须驱逐哪个块集合中用于传入缓存块的空间。它总是更可取的——以实现最佳性能–替换将来重新引用最远的块。在本次课业中,您将
使用两种不同的方式来实现缓存替换策略:FIFO和LRU。FIFO
当缓存使用FIFO替换策略时,它总是在
设置,而不考虑之前访问块的频率或次数。所以让我们说您的缓存最初是空的,并且每组都有两种方式。现在假设您访问区块A、B、A、C。为了给C腾出空间,你会驱逐A,因为它是第一个被带进来的区块进入布景。
LRU
当缓存使用LRU更换策略时,它首先丢弃最近使用最少的项目。具有LRU策略的缓存必须跟踪对块的所有访问,并始终收回顾名思义,最近使用(或访问)最少的块。
缓存模拟器接口
您必须首先命名缓存模拟器。您的程序应支持以下用途
界面
./first<cachesize><assoc:n><缓存策略><块大小><跟踪文件>哪里
参数缓存大小是缓存的总大小(以字节为单位)。这个数字应该是2的幂。
2.
参数assoc:n指定关联性。这里,n是一个集合中的缓存行数。参数缓存策略指定缓存替换策略,该策略为fifo或lru。
参数块大小是2的幂,以字节为单位指定缓存块的大小。参数跟踪文件是跟踪文件的名称。
模拟详细信息
当程序启动时,缓存中没有任何内容。因此,所有缓存行都是空的。您可以假设内存大小为248。因此,内存地址最多为48位(零扩展跟踪文件中的地址,如果它们的长度小于48位)。标记、缓存地址和字节地址中的位数由缓存决定
大小和块大小。
对于直写缓存,有一个问题是在发生写操作时应该发生什么在该分配中假设首先从存储器读取块(即。,
一次存储器读取)、然后接着存储器写入。
您不需要在此分配中模拟缓存和内存中的数据。因为
跟踪不包含有关在内存和之间传输的数据值的任何信息
缓存。
示例运行
您的程序应该打印出内存读取次数(每个缓存块)、内存写入次数(每个缓存块)、缓存命中和缓存未命中。您应该遵循与下面所示完全相同的格式(字母之间没有空格),否则,自动评分器无法正确地对您的程序进行评分。./first 32 assoc:2 fifo 4 trace1.txtmemread:336
memwrite:334
缓存命中率:664
缓存缺失:336
上面的例子模拟了一个大小为32字节的双向集合关联缓存。每个缓存块为4字节。跟踪文件名为trace1.txt。
注意:有些跟踪文件相当大。因此,自动标记器可能需要几分钟才能对所有测试用例进行评分。
3.
第二部分-二级缓存-50分
大多数现代CPU都有多级缓存。在课业的第二部分中,您有以模拟具有两级高速缓存(即L1和L2)的系统。可以设计多级缓存取决于一个高速缓存的内容是否存在于其他级别。
在这个分配中,您实现了一个独占缓存:较低级别的缓存(即L2)只包含不存在于上层高速缓存(即L1)中的块。
独占缓存
考虑L2不包括L1的情况。假设存在对块X的读取请求。如果在一级缓存中找到块,然后从一级缓存读取数据。如果在中找不到块一级缓存,但存在于二级缓存中,则缓存块从二级缓存移动到一级缓存隐藏物如果这导致块从L1中被逐出,代 写CS 211 编程任务5:模拟缓存则被逐出的块被放入L2中。如果在L1或L2中都找不到块,然后从主存储器中读取并将其放在L1中而不是在L2中。在独占缓存配置中,填充L2的唯一方式是当块被逐出L1。因此,此配置中的L2高速缓存也被称为L1的受害者高速缓存。示例运行
第1部分中的详细信息在此适用于二级L2缓存。你的程序有两个独立的配置(一个用于1级缓存,一个用于2级缓存)。L1和L2都具有相同的块大小。您的程序应该报告内存读取和写入的总数,然后是缓存未命中并且命中L1和L2高速缓存。这是第2部分的格式。
./秒<L1缓存大小><L1关联性><L1缓存策略><L1块大小><L2缓存大小><L2关联性><L2缓存策略><跟踪文件>这是第2部分的一个示例测试用例。
./second 32 assoc:2 fifo 4 64 assoc:16 lru trace2.txt内存读取:3277
memwrite:2861
l1cachehit:6501
l1cachemiss:3499
l2cachehit:222
l2cachemiss:3277
上面的例子模拟了一个大小为32字节的双向集合关联缓存。块大小为的字节4用于L1高速缓存。类似地,二级缓存是大小为64字节的完全关联缓存。此外,跟踪文件用于此运行的是trace2.txt。如您所见,程序输出内存读取和内存写入之后按上面所示的顺序进行L1和L2高速缓存命中和未命中。4.
您提交的结构
所有文件都必须包含在pa5文件夹中。tar文件中的pa5目录必须包含2子目录,每个部分一个子目录。目录的名称应首先命名
第二。每个目录都应该包含一个c源文件、一个头文件(可选)和一个Makefile。要创建这个文件,请将您提交的所有内容放入名为pa5的目录中。然后,cd进入包含pa5的目录(即pa5的父目录),并运行以下命令:焦油cvf pa5焦油pa5
为了检查您是否正确创建了tar文件,您应该将它(pa5.tar)复制到一个空文件中目录,然后运行以下命令:
tar xvf pa5.tar
文件夹结构应该是这样的。
*pa5
第一
*第一.c
*第一个.h
*Makefile
第二
*第二.c
*第二个.h
*Makefile
自动平地机
第一种模式
使用pa5文件夹编写代码时进行测试。
假设您有一个pa5文件夹,其中包含课业中描述的目录子结构描述
将pa5文件夹复制到autorader的目录中。使用以下命令运行自动标记器。
python3 pa5_autograder.py它将运行测试用例并打印您的分数。
5.
第二种模式
此模式用于测试您的最终提交(即pa5.tar)
将pa5.tar复制到autorader目录。
以pa5.tar作为参数运行autorader,如下所示python3 pa5_autograder.py pa5.tar分级指南
这是一个很大的班级,所以你成绩中最重要的部分必然是基于程序的程序检查。也就是说,我们将使用Makefile和您提交的源代码,然后针对一组
输入。因此
您不应部分或全部查看或使用朋友的代码。我们将运行的状态艺术剽窃检测器。我们将向学生办公室报告该工具捕获的所有信息行为
WX:codinghelp


8zs0j09p
1 声望0 粉丝