实验六——cache模拟器实验

前言
本次实验的主要目的是熟悉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.mfbz.cn/a/284161.html

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

相关文章

Linux学习之系统编程1(关于读写系统函数)

写在前面&#xff1a; 我的Linux的学习之路非常坎坷。第一次学习Linux是在大一下的开学没多久&#xff0c;结果因为不会安装VMware就无疾而终了&#xff0c;可以说是没开始就失败了。第二次学习Linux是在大一下快放暑假&#xff08;那个时候刚刚过完考试周&#xff09;&#xf…

基于Java在线商城系统设计实现(源码+部署文档+讲解视频)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌&#x1f345; 文末获取源码联系 &#x1f345;&#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

目标检测-Two Stage-Mask RCNN

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

Airtest的iOS实用接口介绍

前段时间Airtest更新了1.3.0.1版本&#xff0c;里面涉及非常多的iOS功能新增和改动&#xff0c;今天想详细跟大家聊一下里面的iOS设备接口。 PS&#xff1a;本文示例均使用本地连接的iOS设备&#xff0c;Airtest版本为1.3.0.1 。 安装接口&#xff1a;install、install_app …

使用css实现 Typora markdown 标题自动编号

第一&#xff0c;找到主题文件夹 第二&#xff0c;复制下面代码放入 AutoNumber.css文件中 body {counter-reset: h1; }#write h1, .markdown-section h1 {counter-reset: h2; }#write h2, .markdown-section h2 {counter-reset: h3; }#write h3, .markdown-section h3 {counte…

2023 NCTF writeup

CRYPTO Sign 直接给了fx,gx&#xff0c;等于私钥给了&#xff0c;直接套代码&#xff0c;具体可以参考&#xff1a; https://0xffff.one/d/1424 fx [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…

linux调试笔记

文章目录 基本启动调试与附加进程断点程序运行控制tui模式查看堆栈与变量监视变量多线程调试 扩展自定义跳转命令解析自定义类型禁用动态库自动加载设置源码路径断点时执行命令gdbserver远程调试 gdb脚本QtCreator调试Linux下处理编译、运行时的一些问题undefined symbol问题-n…

【C# 技术】 C# 常用排序方式——自定义数据排序

C# 常用排序方式——自定义数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&…

.NET Core中灵活使用反射

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

D47|动态规划-子序列part2

392.判断子序列&#xff1a; 初始思路&#xff1a; 左为判断公共子序列&#xff0c;右为判断子序列&#xff0c;感觉代码完全可以套用&#xff0c;如果公共子序列的长度是较短的字符串的长度的话即输出true&#xff0c;如果不是即输出false。 class Solution {public boolean…

【openlayers-5】地图点、线、面等要素添加

1、添加点 //创建一个点 var point new ol.Feature({geometry: new ol.geom.Point([117.2, 35.8] ),}) //设置点的样式信息 point.setStyle(new ol.style.Style({//填充色fill: new ol.style.Fill({color: rgba(255, 255, 255, 0.2),}),//边线颜色stroke: new ol.style.Strok…

Unity坦克大战开发全流程——游戏场景——游戏界面——设置界面复用

游戏场景——游戏界面——设置界面复用 先将开始场景当中的设置面板复制过来 由于设置面板挂载的脚本都是相同的&#xff0c;在BeginScene中关闭设置面板时不会报空&#xff0c;而在GameScene中关闭设置面板时却会报空&#xff0c;这是因为监听事件中的单例模式调用的实例是Beg…

68内网安全-域横向PTHPTKPTT哈希票据传递

今天讲PTH&PTK&PTT&#xff0c; PTH(pass the hash) #利用 lm 或 ntlm 的值进行的渗透测试 PTT(pass the ticket) #利用的票据凭证 TGT 进行的渗透测试 用的Kerberos 协议 PTK(pass the key) #利用的 ekeys aes256 进行的渗透测试 lm加密算法是2003以前的老版&…

动画墙纸:将视频、网页、游戏、模拟器变成windows墙纸——Lively Wallpaper

文章目录 前言下载github地址&#xff1a;网盘 关于VideoWebpagesYoutube和流媒体ShadersGIFs游戏和应用程序& more:Performance:多监视器支持&#xff1a;完结 前言 Lively Wallpaper是一款开源的视频壁纸桌面软件&#xff0c;类似 Wallpaper Engine&#xff0c;兼容 Wal…

按照故障码类型分类的API接口

随着汽车的普及&#xff0c;车辆故障也成为了一个不可忽视的问题。对于车主来说&#xff0c;及时了解故障码的含义以及解决方案十分重要。挖数据平台为解决这一问题&#xff0c;提供了一套按照故障码类型分类的API接口&#xff0c;用于查询车辆故障、故障码适用品牌以及提供相应…

当 Redis 遇上 Serverless

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术&#xff0c;观点&#xff0c;和项目&#xff0c;并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏…

杂文月刊投稿方式论文发表要求

《杂文月刊》是由国家新闻出版总署批准的正规文学类期刊。主要内容取向&#xff1a;杂文、散文、小说、诗歌、漫画、文学评论、艺术评论、戏剧文化、地方文化、非遗文化、美学艺术、教育等历史、文化、文学、艺术类的文章。是广大专家、学者、教师、学子发表论文、交流信息的重…

docker 在线安装mysql 8.0.21版本

1、拉取mysql 8.0.21版本镜像 2、查看镜像 docker images 3、在宿主机 /usr/local/mysql 下的 conf 文件夹下&#xff0c;创建 my.cnf 文件&#xff0c;并编辑内容 [mysql] default-character-setutf8 [client] port3306 default-character-setutf8 [mysqld] port3306 se…

Win10取消开机密码

1、首先确认你的 Windows 系统帐户中添加了密码。您可以在设置 - 帐户 - 登录选项中查看电脑是否有添加本机密码。 2、按 WinR 打开运行窗口&#xff0c;在窗口中输入 netplwiz 并按确定。 3、在弹出的用户帐户控制中&#xff0c;我们可以看到当前已添加密码的帐户。把要使用本…

可拖拽流程图组件开发

效果 说在前面 流程图在技术领域是一种常见的可视化工具&#xff0c;用于展示系统、应用或业务流程的各个步骤以及它们之间的关系。它们可以帮助开发人员和项目团队更好地理解和规划复杂的流程&#xff0c;从而提高工作效率和准确性。但是&#xff0c;传统的静态流程图有时无法…
最新文章