系统结构实验
实验内容:编写Cache模拟器
在csim.c提供的程序框架中,编写实现一个Cache模拟器
1 | 命令行格式:csim-ref [-hv] -s <s> -E <E> -b <b> -t <tracefile> |
上面这些是参数,传进去之后需要完成对应功能的cache所以要动态分配内存实现。
A cache is a set of 2^s cache sets
A cache set is a set of E cache lines
E is called associativity 关联度
If E=1, it is called “direct-mapped”
Each cache line stores a block
Each block has B = 2^b bytes
Total Capacity = S*B*E
对于本实验的cache模拟器,具体要求:
¢A cache simulator is NOT a cache!
§Memory contents NOT stored
§Block offsets are NOT used – the b bits in your address don’t matter.
§Simply count hits, misses, and evictions
§
¢Your cache simulator needs to work for different s, b, E, given at run time.
¢
¢Use LRU – Least Recently Used replacement policy
§Evict the least recently used block from the cache to make room for the next block.
§Queues ? Time Stamps ?
提示:
¢A cache is just 2D array of cache lines:
§struct cache_line cache[S][E];
§S = 2^s, is the number of sets
§E is associativity
¢
¢Each cache_line has:
§Valid bit
§Tag
§LRU counter ( only if you are not using a queue )
要用到fscanf, malloc, free
对于csim.c文件,我们的要求是:
(1)模拟器必须在输入参数s、E、b设置为任意值时均能正确工作,也就是说,需要使用malloc函数(而不是代码中固定大小的值)来为模拟器中数据结构分配存储空间;
(2)我们的实验仅关心数据Cache的性能,因此模拟器应忽略所有指令cache访问(即轨迹中“I”起始的行);
(3)在处理访问请求是,我们假设内存访问的地址总是正确对齐的,即一次内存访问从不跨越块的边界——因此可忽略访问轨迹中给出的访问请求大小;
(4)main函数最后必须调用printSummary函数输出结果,并如下传之以命中hit、缺失miss和淘汰/驱逐eviction的总数作为参数。
这里简要介绍了模拟器的处理器流程,需要强调的还是数据修改操作(M),在我们的程序里,其被认为是同一地址上1次装载后跟1次存储,继而引发多个cache动作。
traces里面是一堆内存访问指令,我们需要根据这些指令来执行。
1 | I - 指令装载, |
设计cache模拟器:
-s : 组索引位数
-E
-b : 内存块内地址位数
所以cache的组数是1<<s组,每组有E个cache行,块大小是1<<b
由已学知识,每个cache行
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章