这个实验是这学期的第四个实验。作为缓存这一章的配套实验,设计得非常精妙。难度上来讲,相比之前的修改现成文件,直接写一个程序也更高了一些。需要注意的是检查程序在编译时开启了 -Werror,需要保证没有警告才能成功编译。
从官方文档得知需要完善 csim.c 和 trans.c 文件,第一个是模拟一个高速缓存的程序并从由 valgrind 程序生成的 trace 文件中统计 hit, miss 和 eviction 的数量。第二个文件需要优化矩阵转置程序降低程序的不命中度。
PART A 这一部分的核心是使用了一个结构体来模拟一个缓存行:
typedef struct { int valid; ulong tag; clock_t time; } CacheLine; 再通过把缓存行在内存中动态分配成一个二维数组,实现模拟缓存的功能。并且使用了typedef CacheLine *CacheSet; 和 typedef CacheSet *CacheHead; 来让程序更整齐。输入来源于文件和命令行参数。可以用 getopt() 函数来解析参数。
各个函数的作用如下:
CacheHead CacheInit(int S, int E) 为缓存动态分配内存; int CacheJudge(CacheHead cache, ulong index, ulong tag) 判断缓存状态,是否有效,标记匹配; void CacheEvict(CacheHead cache, ulong index, ulong tag) 执行 eviction 操作; void CacheTouch(CacheHead cache, ulong index, ulong tag) 执行读取操作,只更新时间戳; void CacheInsert(CacheHead cache, ulong index, ulong tag) 执行缓存写入操作; void Adder(int type, int num) 计数器,增加 hit, miss 和 eviction 的数量,并根据配置选择打印信息; void printByte(bytept h, int len) 逐字节以 16 进制打印内存数据; void Execute(CacheHead cache, char type, ulong address, int len) 主要的执行函数; int main(int argc, char *args[]) main 函数,读取参数,打开文件; 完整的程序代码如下:...