Cache Lab:Part A【模拟出使用LRU策略的高速缓存存储器组织结构】

目录

任务描述

知识回顾

实验内容

测试结果


Cache Lab 对应《CS:APP》6.3节至第六章结束的内容。

任务描述

Your job for Part A is to fill in the csim.c file so that it takes the same command line arguments and produces the identical output as the reference simulator. Notice that this file is almost completely empty. You’ll need to write it from scratch.

A 部分的工作是填写 csim.c 文件,以便它采用相同的命令行参数并生成与参考模拟器相同的输出。请注意,此文件几乎完全为空。你需要从头开始编写它。

(有关参考模拟器:)

我们为您提供了引用缓存模拟器的二进制可执行文件,称为 csim-ref,用于模拟 valgrind 跟踪文件上具有任意大小和关联性的缓存的行为。在选择要逐出的缓存行时,它使用 LRU(最近最少使用的)替换策略。

知识回顾

1. 层次结构中每一层都是缓存,缓存下一层的数据块

2.块

        数据以块大小为传送单元,在相邻两层之间来回复制(不同的相邻两层间传送大小不同,远离CPU倾向于使用更大的块)

3. hit&miss&eviction

4.miss的三种类别

        cold miss(cold cache)

        冲突不命中:与严格的放置策略有关

        容量不命中:工作集比缓存大,也就是缓存太小

5.两类放置策略

        随机放置:靠近CPU的层使用该策略,完全用硬件实现

        更严格的放置策略:下一层的一些块被映射到上一层的同一个位置(类似于哈希,所以冲突miss产生了)

6. 缓存由谁来管理

        硬件

        硬件+软件

        软件

7. 高速缓存存储器

随着CPU和主存性能差距增大,设计者在二者之间加入了L1,L2,L3.本书假设只有L1.

高速缓存的结构可以用元组(S,E,B,m)来描述。

由E的不同分为3种:直接映射高速缓存、组相联高速缓存、全相联高速缓存。

8.三步:

        组选择

        行匹配/行替换

        字抽取

实验内容

注意:

1. 测试用例的地址是以16进制表示的,且是64位地址。

2. 使用getopt时,optarg这个变量不要自己定义。

3. 我用时间戳实现LRU算法,这个效率不是最优的。标准的LRU算法实现见我的这篇文章

4. L和S是不区分的,I是要被忽略的,M相当于L+S

5. 官方可以参考的资料中,尤其要细看15年的习题课PPT和该实验的write up的最后几页内容。

#include "cachelab.h"
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <getopt.h>

struct block{
	int stamp; //LRU的时间戳
	bool valid;
	unsigned long long tag;
};

// 全局时间
int time = 0;

// 预存输出详细信息的字符串
char ** makeInfoString(void)
{
	char ** infoStr = (char **)malloc(sizeof(char *) * 3);
	infoStr[0] = "hit";
	infoStr[1] = "miss";
	infoStr[2] = "miss eviction";
	return infoStr;
}

// malloc二维数组
struct block ** createTable(int row, int col)
{
	struct block ** L = (struct block **)malloc(sizeof(struct block *) * row);
	for (int i=0; i<row; i++)
		L[i] = (struct block *)malloc(sizeof(struct block) * col);
	return L;
}

// 初始化刚刚malloc出来的二维数组
void initCache(struct block ** L, int row, int col)
{
	for (int i=0; i<row; i++)
		for (int j=0; j<col; j++)
		{
			L[i][j].valid = false;
			L[i][j].stamp = -1;
		}
	return;
}

int find(struct block ** L, unsigned long long addr, int S, int E, int B, int m, int b, int s)
{
	unsigned long long bias = addr & (B-1);
	unsigned long long index = (addr >> b) & (S - 1);
	unsigned long long tag = (addr & ~(S * B - 1)) >> (b + s);
	
	//printf("t = %llu\ts = %llu\tb = %llu\t\n",tag, index, bias);

	for (int j = 0; j < E; j++)
	{
		if (L[index][j].valid && L[index][j].tag == tag)
		{
			L[index][j].stamp = ++time;
			return 0; //hit
		}
	}
	
	for (int j = 0; j < E; j++)
	{
		if (!L[index][j].valid)
		{
			L[index][j].valid = true;
			L[index][j].stamp = ++time;
			L[index][j].tag = tag;
			return 1; //miss
		}
	}
	
	int min_time = 0;
	for (int j = 1; j < E; j++)
		if (L[index][j].stamp < L[index][min_time].stamp)
			min_time = j;

	L[index][min_time].stamp = ++time;
	L[index][min_time].tag = tag;
	return 2; //miss eviction
}

void solve(struct block **L, unsigned long long addr, char ** infoStr, 
		int * m_cnt, int * h_cnt, int * e_cnt, 
		int S, int E, int B, int m, int b, int s)
{
	int ans = find(L, addr, S, E, B, m, b, s);
	printf("%s", infoStr[ans]);
	
	if (ans == 0)
		(*h_cnt)++;
	else if (ans == 1)
		(*m_cnt)++;
	else 
	{
		(*m_cnt)++;
		(*e_cnt)++;
	}
	
}

int main(int argc, char *argv[])
{
	char ** infoStr = makeInfoString();

	int S, s, E, B, b, m = 64;
	bool verbose = false;
	char filename[100];
	
	int opt;
	// optarg不能在这里定义,否则就覆盖了getopt函数中所用的那个变量
	while ((opt = getopt(argc, argv, "vs:E:b:t:")) != -1)
	{
		switch (opt)
		{
			case 'v':
				verbose = true;
				break;
			case 's':
				s = atoi(optarg);
				S = 1 << s;
				break;
			case 'E':
				E = atoi(optarg);
				break;
			case 'b':
				b = atoi(optarg);
				B = 1 << b;
				break;
			case 't':
				strcpy(filename, optarg);
				break;
		}
	}
	printf("S = %d\ns = %d\nE = %d\nB = %d\nb = %d\nfilename = %s\n", S, s, E, B, b, filename);
	
	struct block ** L = createTable(S, B);
	initCache(L, S, B);
	
	// std IO
	FILE * fp = fopen(filename, "r");
	if (fp == NULL) exit(-1);
	
	//读一行
	char line[100];
	char op;
	unsigned long long addr;
	int size;
	
	int m_cnt = 0, h_cnt = 0, e_cnt = 0;
	
	while (fgets(line, 100, fp))
	{	
		// 忽略是I的行
		if (line[0] != ' ') continue;
		
		sscanf(line, " %c %llx,%d\n", &op, &addr, &size);
		
		line[strlen(line)-1] = '\0';
		printf("%s ", line);
		
		solve(L, addr, infoStr, &m_cnt, &h_cnt, &e_cnt, S, E, B, m, b, s);

		// 如果是M
		if (op == 'M')
		{
			printf(" hit");
			h_cnt++;
		}

		printf("\n");
	}
	printSummary(h_cnt, m_cnt, e_cnt);
	
	return 0;
}

测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/361272.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0131-2-关于事件捕获和冒泡

关于事件捕获和冒泡 DOM事件流分为三个阶段&#xff1a;捕获阶段、目标阶段、冒泡阶段 点击目标元素后&#xff0c;不会马上触发目标元素&#xff0c;而是先执行事件捕获&#xff0c;从顶部逐步到目标元素&#xff1b;处于目标阶段的时候触发目标元素&#xff1b;最后冒泡阶段…

性能测试工具架构

背景 性能测试工具&#xff08;LoadRunner为例&#xff09; 性能测试工具通常是指那些用来支持压力、负载测试&#xff0c;能够录制和生成脚本、设置和部署场景、产生并发用户和向系统施加持续压力的工具。 性能测试工具录制的是服务端与应用之间的通信数据&#xff0c;而不是…

如何快速知道app当前页面是哪一个Activity(2.0升级版)

点我跳转 如何快速知道app当前页面是哪一个Activity 1.0版本 这个版本是用adb 命令实现的&#xff0c;想看的可以看看&#xff0c;学习一下adb 命令。 今天做了一个非常简易的app来直接监控当前页面Activity&#xff0c;效果直接炸裂&#xff0c;效果图如下&#xff1a; 有需要…

【学习资源】分享一个文献互助平台(CRS核心论文库)

博主在之前的博文中推荐过三个文献互助平台&#xff08;科研通、谷粉、纬度&#xff09;https://blog.csdn.net/dave496206/article/details/135604252?spm1001.2014.3001.5501 博主在这里再补充一个文献互助或下载平台——CRS核心论文库 1、CRS核心论文库首页&#xff1a; …

突破瓶颈!程序员最值得关注的19个顶级油管博主

油管可以说是互联网上最有趣的地方&#xff0c;你可以在这里找到任何你感兴趣的东西。这里也是学习和探索编程世界的绝佳方式。有趣又有才华的技术博主非常多&#xff0c;随时随地都可以与全世界的开发者交流学习。 我们整理了一些在编程领域有影响力的博主&#xff0c;希望能给…

SpringBoot项目logback日志配置

Session 认证和 Token 认证 过滤器和拦截器 SpringBoot统一返回和统一异常处理 SpringBoot项目logback日志配置 程序运行出现错误时&#xff0c;第一时间想到的是甩锅还是日志&#xff1f;通过查看日志定位出问题的位置&#xff0c;才能更好的甩锅&#xff0c;今天就来学习…

配置vite自动按需引入 vant 组件

为什么学 按需加载可以减少包体积,优化加载性能 学习内容 全局注册组件 import 需要的组件import 组件样式使用 app.use 注册组件 Tree Shaking 介绍使用 什么是 tree shaking&#xff1f; Tree shaking是一种优化技术&#xff0c;用于减少JavaScript或其他编程语言中未被使用…

fullcalendar案例

fullcalendar案例 <script srchttps://cdn.jsdelivr.net/npm/fullcalendar6.1.10/index.global.min.js></script><script srchttps://code.jquery.com/jquery-3.6.0.min.js></script> <!-- 引入 jQuery CDN --><script>document.addEventL…

虚拟机VMware vCneter告警:Log DIsk Exhaustion on frvc70,vCenter日志清理

其中frvc70是主机名称 1.告警原因 Troubleshooting vCenter Appliance /storage/log directory is 80% or more ful 当分区/storage/log使用率达到 80% 时&#xff0c;会触发此告警。 2.解决方法 1.通过 SSH 或通过 vCenter 虚拟机控制台连接到 vCenter Server Appliance …

Halcon 几何测量

文章目录 算子Halcon 计算两点之间的距离案例Halcon 计算点到直线的距离Halcon 计算点到区域的距离Halcon 线到区域的距离Halcon 线到线的距离 算子 distance_pp 两点之间的距离算子 distance_pp( : : Row1, Column1, Row2, Column2 : Distance) Row1 点1的行坐标 Column1 点1的…

[ESP32]在Thonny IDE中,如何將MicroPython firmware燒錄到ESP32開發板中?

[ESP32 I MicroPython] Flash Firmware by Thonny(4.1.4) IDE 正常安裝流程&#xff0c;可參考上述影片。然而&#xff0c;本篇文章主要是紀錄安裝過程遇到的bug, 供未來查詢用&#xff0c;也一併供有需要的同好參考。 問題:安裝後&#xff0c;Thonny互動介面顯示一堆亂碼和co…

网安人必看!CISP家族顶流证书攻略

网络安全已成为当今的热门领域&#xff0c;证书在职业发展中的重要性不言而喻。但是&#xff0c;证书市场五花八门&#xff0c;选择适合自己的证书可是个大问题。别担心&#xff0c;今天我们就来聊聊CISP家族的几个热门认证&#xff0c;让你在网络安全领域的发展更加顺利&#…

ADI 配合 USRP 使用的相控阵天线 cn0566

相控阵天线 在这里插入图片描述

IDEA快捷键大全

提示&#xff1a; ① 主要记录我在使用 IDEA 开发的过程中用到的快捷键&#xff0c;可以提高开发速度。 ② 不一定要全部记住&#xff0c;主要是当一个参考文档&#xff0c;大家有一点印象&#xff0c;随时可以查看。 参考博客 > IntelliJ IDEA 快捷键说明大全&#xff08;官…

Springboot+vue的健身房管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的健身房管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的健身房管理系统&#xff0c;采用M&#xff08;model&#xf…

WPF图表库LiveChart异常问题处理-System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围

问题&#xff1a; 在使用liveChart处理一个以时间为X轴的曲线时&#xff0c;遇到一个报错&#xff1a;指定的参数超出了有效值的范围System.ArgumentOutOfRangeException:“Specified argument was out of the range of valid values. Arg_ParamName_Name” 指定的参数超出了有…

YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析

前言 前面简单介绍了YOLOv5的网络结构和创新点&#xff08;直通车&#xff1a;【YOLO系列】YOLOv5超详细解读&#xff08;网络详解&#xff09;&#xff09; 在接下来我们会进入到YOLOv5更深一步的学习&#xff0c;首先从源码解读开始。 因为我是纯小白&#xff0c;刚开始下…

EXCHANGE PARTITION 方法处理(挽救)大型分区表中的块损坏的步骤

当在巨大的表分区块&#xff08;例如 ORA-01578&#xff09;中发现损坏时&#xff0c;并且我们没有备份&#xff08;例如 RMAN、操作系统级别、导出或任何外部资源&#xff09;来恢复损坏&#xff0c;我们仍然可以尝试挽救使用 10231 事件处理表中的剩余数据&#xff08;由于跳…

扩展学习|商业智能和大数据分析的研究前景(比对分析)

文献来源&#xff1a; Liang T P , Liu Y H .Research Landscape of Business Intelligence and Big Data analytics: A bibliometrics study[J].Expert Systems with Applications, 2018, 111(NOV.):2-10.DOI:10.1016/j.eswa.2018.05.018. 信息和通信技术的快速发展导致了数字…

养老院|基于Springboot的养老院管理系统设计与实现(源码+数据库+文档)

养老院管理系统目录 目录 基于Springboot的养老院管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、老人信息管理 2、家属信息管理 3、公告类型管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选…