一、实验内容
本实验将帮助您了解缓存对C程序性能的影响。实验由两部分组成。在第一部分中,您将编写一个模拟高速缓存行为的小型C程序(大约200-300行)。在第二部分中,您将优化一个小的矩阵转置函数,目标是最小化缓存未命中的数量。
二、实验要求
第一部分:
第一部分中,您将编辑csim.c文件,实现一个缓存模拟器。它以valgrind的内存引用轨迹文件作为输入,模拟缓存的命中和未命中行为,并输出命中、未命中和逐出的数量。
我们为您提供了一个名为csim-ref的标准的缓存模拟器的二进制可执行文件,该模拟器模拟具有任意大小和相联度的缓存的行为。在选择要逐出的缓存行时,它使用LRU替换策略,这个参考模拟器就是标准答案,它可以接收以下命令行参数:
./csim-ref [-hv] -s <s> -E <E> -b <b> -t <tracefile>
-h: 可选参数,用于输出使用帮助
-v:可选参数,用于输出跟踪信息的详细内容
-s <s>:设置组索引位的数量(组数量S=2s)
-E <E>:设置每组的行数
-b <b>:设置块大小(块大小B=2b位)
-t <tracefile>:要跟踪的内存引用轨迹文件的名称
第一部分的工作是要编辑csim.c文件,以使它使用与csim-ref相同的命令行参数和产生与它相同的输出。请注意,拿到手上的csim.c几乎完全为空,你需要从头开始写。
第一部分的注意事项:
- 你的csim.c文件必须在没有警告的情况下通过编译才能获得分数。
- 你的模拟器必须在任意的s、E和b下都能正常工作。这意味着你需要使用malloc函数为模拟器的数据结构分配空间。malloc函数的使用方法自己百度。
- 对于这个实验中,我们只对数据缓存性能感兴趣,所以您的模拟器应该忽略所有指令缓存访问(以“I”开头的行)。“I”总是顶格的,它前面没有空格,而“M”、“L”和“S”前面有空格,可以根据这一点来区分。
- 要获得第一部分的分数,必须在main()函数结束前调用函数printsummmary()来输出命中、未命中和驱逐的数量。
- 对于这部分,您应该假设内存访问已正确对齐,因此内存访问永远不会跨越块边界。通过这个假设,你可以忽略在内存访问轨迹文件中的“大小”字段。
第二部分:
在第二部分中,你将编辑trans.c文件实现一个转置函数,目标是使得在程序运行过程中尽可能少的发生缓存未命中。
如果A表示一个矩阵,则矩阵A的转置矩阵为AT,它们之间的关系为:Aij=ATji
为了帮助您编程,我们在trans.c中为您提供转置函数示例,该示例计算N×M矩阵A的转置,并将结果存储在M×N矩阵B中。该示例的转置函数是正确的,但它效率低下,因为访问模式导致许多缓存未命中。
在第二部分中,您的工作是编写一个类似的函数,称为transpose_submit,以缓存未命中最少化的方式实现矩阵转置。
第二部分注意事项:
- 你的trans.c文件必须在没有警告的情况下通过编译才能获得分数。
- 每个转置函数最多可以定义12个int类型的局部变量。
- 不允许通过使用long类型的变量或使用位技巧将多个值存储到单个变量这种手段来规避2)中的限制。
- 转置函数不能使用递归。
- 如果使用函数调用,在被调用函数和顶层转置函数之间的栈空间上的局部变量不得超过12个。例如,如果你的转置函数声明8个变量,然后在转置函数里调用了一个使用4个变量的函数,该函数再调用另一个包含2个局部变量的函数,则栈空间上将有14个变量,这将违反规则。
- 您的转置函数不能修改数组A,但是您可以修改数组B。
- 不允许在代码中定义任何数组或使用malloc之类的函数。
三、实验步骤
一、准备步骤
1.安装valgrind,在终端命令行中运行指令“sudo apt-get install valgrind”

2.安装Python2.7,在终端命令行中运行指令“sudo apt-get install python”

3.将“cachelab-handout.tar”文件拷贝到虚拟机的某文件夹里面并在该文件夹里打开终端使用命令 “tar xvf cachelab-handout.tar”进行解压


本实验聚焦于C程序中缓存对性能的影响。实验分两部分,一是编写缓存模拟器,模拟缓存命中和未命中行为;二是优化矩阵转置函数,减少缓存未命中。实验步骤包括安装工具、解压文件,分别对不同大小矩阵进行转置优化,并按规则评分。
最低0.47元/天 解锁文章
6603





