实验六——cache模拟器实验

news2024/11/29 1:35:55

前言
本次实验的主要目的是熟悉cache的原理。加深对cache的映像规则、替换方法、cache命中与缺失的理解。通过实验对比分析映像规则对cache性能的影响。

实验内容一:熟悉模拟程序

阅读给出的cache模拟程序(cachesimulator.cpp),理解其中的主要参数与功能。修改代码,随机生成N个访存地址,运行程序观察并分析结果(例如,可分析其中命中次数,不命中次数,替换次数)。熟悉cache系统的执行过程(可举例详细分析一次命中/不命中/替换过程)。

首先我们先实现一个函数生成一个随机访问序列并写入文件**“project.txt”**以供后续的使用

void generateRandomMemorySequence(int sequenceLength, const char* fileName,int cache) {
	FILE* fp;
	int i;

	srand(time(NULL));

	fp = fopen(fileName, "w");
	if (fp == NULL) {
		printf("无法打开文件。\n");
		return;
	}

	for (i = 0; i < sequenceLength; i++) {
		int randomNumber = rand() % cache;

		fprintf(fp, "%d\n", randomNumber);
	}

	fclose(fp);
}

当生成一个随机序列如红框中所示

在这里插入图片描述

在这里插入图片描述

我们将访问序列对应的字地址,块号,已经地址对应的index位和tag位打印到终端

当采用全相联的映射方式,每个cache的大小为64字节,每个块的大小位1个字长,并使用上述生成的内存随机访问序列时,它的命中率和缺失率如下图所示

在这里插入图片描述

由于我们采用的是全相联方式,并且我们生成的随机访问序列的个数是小于cache能存放的条目数的,所以最后所有的随机访问序列都会被保存到cache中,所以我们不必考虑置换的问题,接下来我们选中命中次数进行分析

命中次数分析:

由打印到终端的随机访问序列和对应的index位和tag位我们可以发现,命中的情况发生发生在随机访问的第四次,第六次,第九次

第四次命中是由于在第三次访存的时候,我们访问的是同一个内存地址,在第三次进行访存的时候,我们已经将该内存地址存放的数据以及该地址对应的tag值放入cache中,并将有效位置1,所以第四次访存可以命中。

第六次命中是由于我们在第一次访存的时候访存的地址是38,而我们在第六次访存的时候我们访存的地址是36,这两个地址同属于一个块,所以在第一次没命中的情况时,我们将其对应的数据块放入了cache,所以第六次才能命中。

第九次命中与第六次命中情况相同。

**cache命中过程介绍:**当我们访问一个内存地址时,我们可以使用这个地址算出对应的index位和tag位,比如我们使用的是全相联,我们就使用tag位与cache中的每一个条目进行比较,如果tag位相同并且有效位为1,那我们就命中了cache不用再去访问主存。

实验内容二:利用该模拟程序仿真课后习题4.1,并得出结果。

习题4.1:The following C program is run (with no optimizations) on a machine with a cache that has four-word (16-byte) blocks and holds 256 bytes of data:

  int i, j, c, stride, array[256];

   for (i=0;i<10000;i++)
      for (j=0;j<256;j=j+stride)
		   c = array[j]+5;

If we consider only the cache activity generated by references to the array and we assume that integers are words.

(1)What is the expected miss rate when the cache is direct-mapped and stride=132? How about if stride=131?

当stride是132:

由于stride为132,所以每次的内部循环我们都要访问的数据为arrar[0]和array[132],又由于我们采用的是直接映射的方式并且每一个整数的大小为一个字长,所以array[0]所对应的内存块为0/4=0,而cache中的块的数量为16,0%16=0,所以array[0]对应的cache中的缓冲行的为0,同理可算出array[132]对应的条目存放的缓冲行为1。因此可以预测,一共会产生两次未命中的情况,是在第一次循环时访问array[0]和array[132]时,可算得缺失率为2/(2*10000)=0.01%。

当我们使用程序模拟的运行结果如下图所示:

在这里插入图片描述

当stride为131时:

当stride时同理我们要访问的数组元素为array[0]和array[131],可以计算出这两个元素所对应的缓冲行都为第0个,所以每次访问的时候都会发生缺失现象,缺失率为100%

当我们使用程序模拟的运行结果如下图所示:

在这里插入图片描述

(2)Would either of these changes if the cache were two-way set associative?

当stride为132时:

由于stride为132,使用的是两路组相联,与上一问不一样的地方在于当我们算出在内存中的块号后,我们需要将块号%(cache中的组数)

,每一组中可以放两个块,通过计算array[0]对应的是第0组cache块,而array[132]对应的是第1组cache块,所以预测结果仍与上一问中相同为0.01%

在这里插入图片描述

当stride为131时:

array[0]和array[131]都对应cache中的第0行,但由于我们采用的是组相联的方式,所以每一个缓冲行中能存放两个块,所以只会造成两次不命中的情况,缺失率为0.01%

在这里插入图片描述

(理论分析该试题,得出上述两问的结果。利用cache模拟程序仿真该程序的cache执行过程,核实实验结果是否与理论分析计算结果一致。)

(3)对于每个miss,标注是哪种miss(compulsory,conflict,capacity)。

在采用直接映射方式的时候

  • 当stride为132时,由于两次未命中都是由于第一访问数组所在数据块,所以会导致两次强制失效
  • 当stride为131时,由于第一次访问数组所在数据块,所以会导致两次强制失效,并且由于arrary[0]和array[131]两个数组元素所在数据块竞争同一个缓冲行,所以会导致19998次冲突失效

在采用二路组相联的方式时

  • 无论stride为131还是132都会产生两次强制失效

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

空间域图像增强之直方图均衡的python代码实现——冈萨雷斯数字图像处理

原理 直方图&#xff1a; 图像的直方图是一个图像中像素强度值分布的图表。 对于灰度图像&#xff0c;直方图展示了每个灰度级出现的频率。 直方图均衡步骤&#xff1a; 计算累积分布函数&#xff08;CDF&#xff09;&#xff1a;首先&#xff0c;计算图像的直方图&#xff0…

oracle物化视图

物化视图定义 视图是一个虚拟表&#xff08;也可以认为是一条语句&#xff09;&#xff0c;基于它创建时指定的查询语句返回的结果集&#xff0c;每次访问它都会导致这个查询语句被执行一次&#xff0c;为了避免每次访问都执行这个查询&#xff0c;可以将这个查询结果集存储到…

C语言与人生:数组交换和二分查找

少年们&#xff0c;大家好。我是博主那一脸阳光&#xff0c;今天和分享数组交换和二分查找。 前言&#xff1a;探索C语言中的数组交换操作与二分查找算法 在计算机编程领域&#xff0c;特别是以C语言为代表的低级编程语言中&#xff0c;对数据结构的理解和熟练运用是至关重要的…

C# 如何读取Excel文件

当处理Excel文件时&#xff0c;从中读取数据是一个常见的需求。通过读取Excel数据&#xff0c;可以获取电子表格中包含的信息&#xff0c;并在其他应用程序或编程环境中使用这些数据进行进一步的处理和分析。本文将分享一个使用免费库来实现C#中读取Excel数据的方法。具体如下&…

Android 跨进程之间通信(IPC)方式之BroadcastReceiver

Android 跨进程之间通信 Android 跨进程之间通信(IPC)方式之BroadcastReceiverAndroid 跨进程之间通信(IPC)方式之ContentProvider 文章目录 Android 跨进程之间通信前言一、关于系统广播二、如何利用BroadcastReceiver跨进程通信1.创建广播接收器2.清单文件中声明注册3.发送广…

08-接口文档管理工具-项目集成knife4j__ev

2、knife4j快速入门 2.1 knife4j介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! gitee地址&#xff1a;knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增…

目标检测-Two Stage-Mask RCNN

文章目录 前言一、Mask RCNN的网络结构和流程二、Mask RCNN的创新点总结 前言 前文目标检测-Two Stage-Faster RCNN提到了Faster RCNN主要缺点是&#xff1a; ROI Pooling有两次量化操作&#xff0c;会引入误差影响精度 Mask RCNN针对这一缺点做了改进&#xff0c;此外Mask …

功能真强大!5个令人惊叹的 Jupyter 黑科技

Jupyter 是一种功能强大的交互式计算环境&#xff0c;被广泛应用于数据分析、机器学习、科学计算等领域。 除了常见的基本功能外&#xff0c;Jupyter还隐藏着许多令人惊叹的黑科技&#xff0c;这些功能可以帮助用户更高效地完成工作&#xff0c;提升工作体验。 在本文中&…

.NET Core中灵活使用反射

前言 前段时间有朋友问道一个这样的问题&#xff0c;.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类&#xff0c;然后通过依赖注入&#xff08;DI&#xff09;的方式获取对应服务的方法并通…

Elasticsearch8集群部署

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 本文记录在3台服务器上离线搭建es8.7.1版本集群。 1. 修改系统配置 1.1 hosts配置 在三台es节点服务器加入hostname解析&…

电脑系统报错msvcr100.dll丢失的解决方法

本文将详细介绍msvcr100.dll的作用、丢失原因以及解决方法。 一、msvcr100.dll是什么文件&#xff1f; msvcr100.dll是Microsoft Visual C 2010 Redistributable Package的一部分&#xff0c;它是运行许多Windows应用程序所必需的动态链接库文件。它包含了C运行时库&#xff…

AI时代系列丛书(由北京大学出版社出版)

前言 在AI时代&#xff0c;程序员面临着新的机遇和挑战。为了适应这个快速发展的时代&#xff0c;掌握新技能并采取相应的应对策略是至关重要的。 对于办公人员或程序员来说&#xff0c;利用AI可以提高工作效率。例如&#xff0c;使用AI助手可以帮助自动化日常的重复性工作&a…

C++八股学习心得.1

1.面向对象程序设计 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言&#xff0c;支持面向过程编程、面向对象编程和泛型编程。 C 完全支持面向对象的程序设计&#xff0c;包括面向对象开发的四大特性&#xff1a;封装、抽象、继承、多态 2.标准库 …

车牌识别系统设计与实现

车牌识别系统设计与实现 项目概述 本项目旨在设计和实现一套车牌识别系统&#xff0c;通过使用车牌字符数据集进行训练&#xff0c;应用OpenCV、CNN&#xff08;卷积神经网络&#xff09;和PyQt5技术&#xff0c;实现车牌图像的预处理、位置选定、定位、字符分割和最终的车牌…

【期末复习】 计算机操作系统

第一章 操作系统引论 历史上最重要的阶段可能会考选择填空&#xff0c;牢记三大特点&#xff0c;四大特征&#xff0c;五大功能 1.1 OS的目标和作用 1.2 OS的发展过程 1.3 OS的基本特性&#xff08;必考&#xff09; 并发 共享 虚拟 异步 1.4 OS的主要功能 后续都是一个大章 五…

Halcon开运算opening

Halcon开运算 文章目录 Halcon开运算 开运算的计算步骤是先腐蚀&#xff0c;后膨胀。通过腐蚀运算能去除小的非关键区域&#xff0c;也可以把离得很近的元素分隔开&#xff0c;再通过膨胀填补过度腐蚀留下的空隙。因此&#xff0c;通过开运算能去除一些孤立的、细小的点&#x…

27、web攻防——通用漏洞SQL注入Tamper脚本Base64Jsonmd5

文章目录 数字型&#xff1a;0-9。http;//localhost:8081/blog/news.php?id1 字符型&#xff1a;a-z、中文&#xff0c;需要闭合符号。http;//localhost:8081/blog/news.php?idsimple 搜索型&#xff1a;在字符型的基础上加入了通配符%。http;//localhost:8081/blog/news.…

Apache Doris (五十五): Doris Join类型 - Colocation Join

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Colocation Join原理

数据结构--队列【详解】~(˶‾᷄ꈊ‾᷅˵)~

目录 队列定义&#xff1a; 队列的声明与头文件的包含&#xff1a; 队列的声明&#xff1a; 头文件的包含&#xff1a; 队列的基本操作: 初始化队列 : 摧毁队列&#xff1a; 入队列&#xff1a; 出队列&#xff1a; 返回队头数据&#xff1a; 返回队尾数据&#xff1…

C#编程-使用变量

使用变量 请考虑以下场景:您必须创建一个程序,接受来自用户的两个数字并在屏幕上显示着两个数字之和。现在,读取用户提供的数字时,您需要将这些数字存储在内存中的某个位置,以便您能对这些数字执行加操作。您可以使用变量将这些数字存储在内存中。 下图显示了使用变量将…