Constexpression's blog

系统结构实验

2023-05-04

系统结构实验

实验内容:编写Cache模拟器

在csim.c提供的程序框架中,编写实现一个Cache模拟器

1
2
3
4
5
6
7
命令行格式:csim-ref [-hv] -s <s> -E <E> -b <b> -t <tracefile>
-h: 显示帮助信息(可选)
-v: 显示轨迹信息(可选)
-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
2
3
4
I - 指令装载,
L - 数据装载,
S - 数据存储,
M - 数据修改(即数据装载后接数据存储)

设计cache模拟器:

-s : 组索引位数
-E : 关联度(每组包含的缓存行数)
-b : 内存块内地址位数

所以cache的组数是1<<s组,每组有E个cache行,块大小是1<<b

由已学知识,每个cache行

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章