权利保留 转载禁止
自学用下发文件下载地址:
cachelab-handout.tar
深入理解计算机系统,2012年 秋
Cache Lab:理解缓存存储
1. 组织工作
这是一个个人项目,所有的提交文件是电子档。
你必须在 shark machine 或者 Andrew Linux machine 上完成这个实验。
2. 总览
这个实验将帮助你理解存储器可能对你的 C程序产生的影响。
实验包括两部分,在第一部分你需要写一个小小的 C程序(大概 200 到 300 行),用来模拟缓存的行为。在第二部分,你将以减少缓存的 miss 数为目的,优化一个矩阵转置函数。
3. 下发文件说明
你的实验材料被打包为一个 Unix tar 文件:cachelab-handout.tar ,你可以在 Autolab 下载这个文件。开始,你要在 Andrew 里将文件复制到一个受保护的文件夹。然后输入命令:
linux> tar xvf cachelab-handout.tar
这将创建一个叫做 cachelab-handout 的文件夹,内含若干文件。你将修改 csim.c 和 trans.c 这两的文件并提交。编译这些文件,键入:
linux> make clean
linux> make
警告:不要用 Windows WinZip 打开你的 .tar 文件(许多浏览器会自动执行这一操作)。将文件另存到你的 AFS 文件夹,使用 Linux tar 程序来解压文件。总而言之,在这一课程中你永远不要使用 Linux 以外的平台编辑你的文件。这样做会造成数据丢失。(以及你已经完成的工作!)
4 描述
实验由两部分组成,在 Part A 中,你将实现一个缓存模拟器。在 Part B 中,你将写一个针对缓存性能优化的矩阵转置函数。
4.1 参考追迹文件
handout 文件夹中的 traces 子文件夹中包含了一些 参考追迹文件 ,用于评估你在 Part A 中写的缓存模拟器是否正确。追迹文件由一个叫做 valgrind 的 Linux 程序生成。比如,在命令行键入:
linux> valgrind --log-fd=1 --tool=lackey -v --trace-mem=yes ls -l
运行可执行程序“ls -1”,以先后顺序捕获其每次访问内存的踪迹,并输出到标准输出 stdout。
Valgrind 内存踪迹以以下格式显示:
I 0400d7d4,8
M 0421c7f0,4
L 04f6b868,8
S 7ff0005c8,8
每一行记录了一次或两次内存访问,每行的格式为:
[空格] 操作 地址,大小
操作 表示内存访问的类型:“I”表示指令加载,“L”表示数据加载,“S”-数据存储,“M”-数据修改(即,在一次数据加载之后紧跟着一个数据存储)。“I”之前没有空格,而“M”,“L”,“S”前面要有空格。地址 指定一个32位的16进制地址。大小 指定了操作所访问的字节数。
4.2 Part A:写一个缓存模拟器
在 Part A 中,你要在 csim.c 中写一个缓存模拟器,要求以 valgrind 内存追迹为输入,在这条踪迹中模拟缓存的连击/落空行为,并将连击,落空与驱逐总数输出。
我们为你提供了一个可执行的二进制参考缓存模拟器,叫做 csim-ref,它可以模拟 valgrind 追迹文件在任意大小以及结合度的缓存上的行为。它使用 LRU 替换策略来决定驱逐哪一个缓存行。
参考模拟器接受以下命令行参数:
Usage: ./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>:用于追迹的 valgrind trace 文件。
(译注:相关概念请参考Cache Lab 实现与分块)
命令行参数基于CS:APP2 教材597页的表记(s,E,与 b)。例如:
linux> ./csim-ref -s 4 -E 1 -b 4 -t traces/yi.trace
hits:4 misses:5 eviction:3
啰嗦模式下的同一个例子:
linux> ./csim-ref -v -s 4 -E 1 -b 4 -t traces/yi.trace
L 10,1 miss
M 20,1 miss hit
L 22,1 hit
S 18,1 hit
L 110,1 miss eviction
L 210,1 miss eviction
M 12,1 miss eviction hit
hits:4 misses:5 evictions:3
将你为 Part A 写的代码填入 csim.c 文件,从而能够输出与参考模拟器相同的结果。注意,这个文件几乎是空的,你需要从头开始写。
Part A 的编程规则
- 将你的姓名与 Andrew ID 填入 csim.c 文件的注释中。
- 你的 csim.c 文件必须在没有警告的情况下通过编译,否则得不到成绩。
- 此次试验中,我们只关注数据缓存的表现,所以你的模拟器应当忽略所有指令缓存入口(以 I 开头的那些行)。记住,valgrind 总是将 "I" 放在第一列(没有前导空格),"M","L","S" 放在第二列(有一个前导空格。这将帮助你理解追迹信息。
- 你必须在你的 main 函数末尾以你的总 hit,miss,以及 eviction 数调用函数 printSummary 来获得 Part A 的成绩:
printSummary(hit_count, miss_count, eviction_count); - 此次实验中,你应当假设内存入口以适当的方式进行了对齐,从而单个内存访问从不会越过块的边界。在这个前提下,你可以不用考虑 valgrind 追迹的请求大小。
4.3 Part B:优化矩阵转置
- Part A:27 分
- Part B:27 分
- Style:6 分
5.1 Part A 评分
我们会用不同的 cache 参数和 trace 来运行你的缓存模拟器。一共 8 个测试样例,除了最后一个是 6 分外,其余每个 3 分。
linux> ./csim -s 1 -E 1 -b 1 -t traces/yi2.trace
linux> ./csim -s 4 -E 2 -b 4 -t traces/yi.trace
linux> ./csim -s 2 -E 1 -b 4 -t traces/dave.trace
linux> ./csim -s 2 -E 1 -b 3 -t traces/trans.trace
linux> ./csim -s 2 -E 2 -b 3 -t traces/trans.trace
linux> ./csim -s 2 -E 4 -b 3 -t traces/trans.trace
linux> ./csim -s 5 -E 1 -b 5 -t traces/trans.trace
linux> ./csim -s 5 -E 1 -b 5 -t traces/long.trace
待续
网友评论