实验六——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.hqwc.cn/news/314044.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Feign远程调用丢失请求头问题处理--异步任务执行远程请求线程丢失请求属性问题处理

在关于Feign远程调用丢失请求头问题处理中解决了远程调用发送请求丢失老请求中请求头的问题。A方法接收浏览器中的请求&#xff0c;B方法是A方法中嵌套方法用来发送Feign远程调用。如果B方法是在异步任务CompletableFuture.runAsync(()->{},Executor)中执行并启用线程池分配…

从0到1入门C++编程——02 通讯录管理系统

文章目录 一、创建结构体及菜单显示二、添加联系人三、显示联系人四、删除联系人五、查找联系人六、修改联系人七、清空联系人八、退出通讯录 本文通过C实现一个通讯录管理系统&#xff0c;系统要实现的功能如下。 1、添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息…

Zookeeper-Zookeeper选举源码

看源码方法&#xff1a; 1、先使用&#xff1a;先看官方文档快速掌握框架的基本使用 2、抓主线&#xff1a;找一个demo入手&#xff0c;顺藤摸瓜快速静态看一遍框架的主线源码&#xff0c;画出源码主流程图&#xff0c;切勿一开始就陷入源码的细枝末节&#xff0c;否则会把自…

【分布式微服务专题】SpringSecurity快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、Spring Security介绍1.1 什么是Spring Security1.2 它是干什么的1.3 Spring Security和Shiro比较 二、快速开始2.1 用户认证2.1.1 设置用户名2.1.1.1 基于application.yml配置文件2.1.1.2 基于Java Config配置方式 2.1.2 设置加密…

71内网安全-域横向网络传输应用层隧道技术

必备知识点&#xff1b; 代理和隧道技术的区别&#xff1f; 代理主要解决的是网络访问问题&#xff0c;隧道是对过滤的绕过&#xff0c; 隧道技术是为了解决什么 解决被防火墙一些设备&#xff0c;ids&#xff08;入侵检测系统&#xff09;进行拦截的东西进行突破&#xff0…

图像特征提取之Hog特征提取

HOG全称&#xff08;histogram of oriented gradients&#xff09;,方向梯度直方图&#xff0c;可以用来提取表示图像的特征&#xff0c;本质就是一行高维特征。 HOG特征提取步骤 图像预处理&#xff08;gamma校正和灰度化&#xff09;【option】 计算每一个像素点的梯度值&am…

00-开篇导读:学习分库分表开源框架的正确方法

1 前言 互联网高速发展带来海量的信息化数据&#xff0c;也带来更多的技术挑战。各种智能终端设备&#xff08;比如摄像头或车载设备等&#xff09;以每天千万级的数据量上报业务数据&#xff0c;电商、社交等互联网行业更不必说。这样量级的数据处理&#xff0c;已经远不是传…

Note: An Interesting Festival

An Interesting Festival 一个有趣的节日。 festival The Agricultural Feast takes place after the independence Day. 农业盛会在独立日后举行 takes place independence feast agricultural It is not a worldwide celebration. 它不是一个全球的庆典。 worldwide ce…

【模拟电路】门电路-逻辑门

一、逻辑门 二、与门 三、或门 四、非门 五、异或门 六、与非门 七、或非门 一、逻辑门 逻辑门是数字电子电路中的基本构建块&#xff0c;用于执行不同的逻辑运算。每种逻辑门都有特定的输入和输出关系&#xff0c;实现了基本的逻辑功能。以下是一些常见的逻辑门&#xff1a; …

基于深度卷积神经网络的垃圾分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细介绍了一基于深度卷积神经网络的垃圾分类识别系统。采用TensorFlow和Keras框架&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;进行模型训练和预测。引入迁移学习中的VGG16模型…

用html,js和layui写一个简单的点击打怪小游戏

介绍&#xff1a; 一个简单的打怪小游戏&#xff0c;点击开始游戏后&#xff0c;出现攻击按钮&#xff0c;击败怪物后可以选择继续下一关和结束游戏。 继续下一个怪兽的血量会增加5点&#xff0c;攻击按钮会随机变色。 效果图&#xff1a; html代码&#xff1a; <!DOCTYPE…

小兔鲜儿 uniapp - SKU 模块

目录 存货单位&#xff08;SKU&#xff09;​ 插件市场​ 下载 SKU 插件​ 使用 SKU 插件​ 插件类型问题​ 核心业务​ 渲染商品规格​ 打开弹窗交互​ 渲染被选中的值​ 存货单位&#xff08;SKU&#xff09;​ SKU 概念 存货单位&#xff08;Stock Keeping Unit&a…