Cache-Lab: Understanding Cache Memories
该lab是为了帮助理解缓存对于c程序的性能影响,包括两部分:第一部分是写一个模拟缓存的c程序,第二部分是对于一个转置矩阵的函数进行优化来达到尽可能小的miss数量。
官网下载tar文件并解压tar xvf cachelab-handout.tar
得到需要编辑的两个文件csim.c
和trans.c
以及其他文件。
Part A
首先需要定义缓存的数据结构,这里是组相连缓存,所以定义缓存行Cache_line
,组成缓存组Cache_set
,再组成缓存Cache
,具体定义见下面的代码。
#define ADDRESS_SIZE 64
typedef struct {
char valid_bit;
unsigned long tag;
int LRU_count;
} Cache_line;
typedef struct {
Cache_line* lines;
} Cache_set;
typedef struct {
int S;
int E;
Cache_set* sets;
} Cache;
在考虑解析命令行选项,使用getopt
库函数,具体用法可以参考这里。下面的主函数见文知意,后面的init_cache(s, E, b, &cache)
和 cacheSimulator(s, E, b, file, isVerbose, &cache)
分别代表初始化缓存数据结构(使用malloc
分配内存)和缓存模拟。
int main(int argc, char *argv[]) {
int s, E, b;
char file[100]; /* 存储打开的文件名 */
int isVerbose = 0;
Cache cache;
hit_count = miss_count = eviction_count = 0;
int ch;
while ((ch = getopt(argc, argv, "vs:E:b:t:")) != -1) {
switch (ch) {
case 'v':
isVerbose = 1;
break;
case 's':
s = atoi(optarg);
break;
case 'E':
E = atoi(optarg);
break;
case 'b':
b = atoi(optarg);
break;
case 't':
strcpy