【CSAPP】-cachelab实验

目录

实验目的与要求

实验设备与软件环境

实验过程与结果(可贴图)

操作异常问题与解决方案

实验总结


实验目的与要求

1、掌握应用程序性能的优化方法;
2、理解存储器层次结构在程序运行过程中所起的重要作用;
3、让学生更好地理解高速缓存对程序性能的影响;

本实验将帮助了解缓存对C程序性能的影响。实验由两部分组成。在第一部分中,将编写一个模拟高速缓存行为的小型C程序(大约200-300行)。在第二部分中,将优化一个小的矩阵转置函数,目标是最小化缓存未命中的数量。


实验设备与软件环境

1.Linux操作系统—64位 Ubuntu 18.04
2. C编译环境(gcc)
3. 计算机

实验过程与结果(可贴图)

第一部分:在csim.c下面编写一个缓存模拟器来模拟cache的行为,并且规定该模拟器用LRU替换策略,即替换某组中最后一次访问时间最久远的一块,还要支持一些输入可选参数

我们知道目前的操作和反馈大概有
操作有四种:
I:加载指令
L:加载数据
S:存储数据
M:修改数据
反馈有三种:
hit:命中
miss:不命中
eviction:替换
首先我们要清楚cache的结构:cache一般分为S组,每组有E块。每块结构为一个有效位v,一个标志位tag,一个数据块data。cache地址分为三部分:标志位tag,组索引s,块偏移b


cache的运作方式是怎样的:
有一个cache地址,这个cache地址提供了标志tag,组索引s和块偏移b
首先根据组索引找到组,然后遍历该组所有块,如果块有效位v为1,则用tag与该块的tag比较,如果相同,那就hit,那就可以匹配
如果遍历完组中所有块,没有hit,那么就miss,这时就需要唤醒替换,把需要的块替换进来
这里替换有一种特殊情况需要判断,就是组满了,组中每一块valid都为1,那么我们要根据LRU策略,选一块最近访问时间最久远的块替换掉
所以,我们的思路就是,需要有一个cache结构,开始构建cache模拟器

定义整个cache。S,E,B分别代表组数,每组块数,每块数据位的字节数


初始化一个cache,这个初始化主要就是申请一个S组,每组E块(一般行和块相等,行是cache的概念,块是主存的概念,我比较喜欢两个都叫块),每块数据B字的cache,然后设置每块的有效位0,标志位-1,时间戳0


根据上面的cache运作机制,我们应当根据cache地址去查找需要的块是否存在,再进行后续操作。该函数遍历该组中所有快,只有v=1且tag相同,那就hit,返回这个块的索引即可。否则miss,且返回-1

我们要排除是否全满这一特殊情况。该函数实现,如果没有全满,则选第一个有效位为0的块作为替换块,返回该索引,如果满了,那返回-1


假设没有满,那我们就设置更新策略,更新返回的索引块即可。这里参数op_set代表第几组,i代表组中第几块。然后LRU的实现策略是更新的这一块的时间戳设置为0,同组中其他有效位位1的块时间戳+1,这样做代表该组中时间戳最大的块为最久没有访问的块

根据上述测实现策略,可以得到LRU策略函数,查找某组中最久没访问的就是找有效位为1的哪一块时间戳最大,查找到该组的索引返回即可,然后再调用update

组装一下update,isfull,findurl三个函数为updateinfo函数

free


gettrace


跑起来后的效果


第二部分

这个需要我们先安装valgrind


sudo apt install valgrind

这道题的要求如下:
1.32×32:miss < 300
2.64×64:miss < 1300
3.61×67:miss < 2000

1.我一开始用的两个for去套,很难实现

A是顺序访问的,每一块8个int会有1个导致miss,剩下7个hit,不用对A的访问进行操作
A在读完一个缓存块的8个int后,会导致B不命中8个缓存块,B会修改这8个缓存块的每一个的第一个int(4字节),这8个缓存块的剩下7个int就没用到
展开循环,A每读一个块的8个int后,我们竖着读下一个块,一共竖着读8个块,这样就能让B修改那8个缓存块的后7个int


2.cache块没有完全利用,我们的cache有8个int啊,4×4展开肯定不能完全利用,那我们还是可以用8×8展开,只不过8×8中再4×4,具体是每一个8×8块中,分别移动左上,右上,左下,右下的4×4块,说白了就是套两层,8×8整体移动,只不过8×8中不是直接用,而是分四次4×4的搬运


3.直接8*8再4*4即可

具体的效果

1.32*32

2.64*64

3.61*67

操作异常问题与解决方案

一开始没有包含对应的unistd导致getopt一致报错,包含一下就可以了。


实验总结

  通过实验任务的一步步完成,我仿佛置身于一个编程迷宫,需要用巧妙的策略和算法来解决缓存优化的难题。
替换策略、写回/写分配策略等概念,让我感受到了计算机系统中微妙而又重要的平衡。
通过实现特定的替换策略和写回/写分配策略,我逐渐掌握了如何有效地利用缓存来提高程序性能的技巧。
通过调整缓存策略和优化程序代码,我逐步提高了程序的效率,并体会到了优化对程序性能的重要性。


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

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

相关文章

一网统管/视频汇聚/安防监控平台EasyCVR启动后无法访问是什么原因?

智慧城市/一网统管/视频汇聚/安防监控平台EasyCVR兼容性强&#xff0c;支持多协议接入&#xff0c;包括国标GB/T 28181协议、GA/T 1400协议、部标JT808协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等&#xff0c;并能对外分…

科普文:jvm实战(六)搞懂各个版本JDK和GC

jdk6&#xff0c;7&#xff0c;8三个版本的内存模型 如图所示 JDK 1.6、1.7、1.8 的内存模型演变过程&#xff0c;其实这个内存模型就是 JVM 运行时数据区依照JVM虚拟机规范的具体实现过程。 JDK 1.6&#xff1a;程序计数器、Java虚拟机栈、本地方法栈、堆、方法区[永久代]&am…

C++系列-String(四)String初步的模拟实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 下面的这些是我们这篇文章将要实现的String的功能&#xff1a; #pragma once #include<iostream> #include<assert.h> using namespace std;namespace bit {class…

下载程序到仿真

第一步&#xff0c;新建工程 第二步&#xff0c;设备组态 第三步&#xff0c;地址分配 需要注意的是&#xff0c;分配地址的范围&#xff0c;是CPU决定的。 关于常见数据类型 下载与仿真 一般安装好博图会自带。 PLCSIM/PLCSIM Advanced PLCSIM普通仿真 PLCSIM Advanced高级…

Spark 分布式弹性计算集(RDD)相关概念介绍

目录 一、概述 二、RDD的核心概念 2.1 Partition 2.2 Partitioner 2.3 RDD的依赖关系 2.4 Stage 2.5 PreferredLocation 2.6 CheckPoint 三、RDD的持久化 3.1 概述 3.2 概念 3.3 RDD持久化级别 3.3.1 MEMORY_ONLY 3.3.2 MEMORY_AND_DISK 3.3.3 MEMORY_ONLY_SER …

昇思第18天打卡|ShuffleNet图像分类

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

使用命令行修改Ubuntu 24.04的网络设置

Ubuntu里&#xff0c;使用命令行下修改IP地址&#xff0c;网上有很多方案&#xff0c;我最终觉得这个方案&#xff08;使用Netplan&#xff09;最好&#xff0c;最根本&#xff0c;记录下来备查 1.使用命令ip link show 查看Ubuntu上可以使用的网络接口名称 2.查找Netplan的配…

「Java开发指南」如何用MyEclipse完成Spring Web Flow 2.0搭建?

本教程将引导您完成Spring Web Flow的软件组件生成&#xff0c;这是Spring的一个项目&#xff0c;用于简化Web应用程序的开发。虽然Spring Web Flow与Spring MVC兼容&#xff0c;但Spring Web Flow使用流而不是控制器来实现应用程序的Web层。在本教程中&#xff0c;您将学习如何…

放大镜案例

放大镜 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>商品放大镜</title><link rel&qu…

可控硅整流自动恒流充电器设计制作

该充电器除可为各种镍镉电池充电外&#xff0c;也可为干电池充电。其充电电流可调。充电终止电压由RP1预先确定。 工作原理 电路原理见图1。开始充电时&#xff0c;电池组两端电压较低&#xff0c;不足以使晶体管VT导通。由RC组成的移相电路给可控硅提供触发电流。移相角度由R…

Java技术栈总结:Spring框架篇

一、SpringBean 1、定义方式 </bean>标签&#xff08;XML文件&#xff09;Bean注解Component注解BeanDefinition方法FactoryBeanSupplier 注&#xff1a;BeanDefinition方法为“</bean>标签、Bean注解、Component注解”的底层实现。 &#xff08;1&#xff09;…

【K8s】专题六(5):Kubernetes 稳定性之重启策略、滚动更新策略

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、重启策略 1、基本介绍 2、资源清单&#xff08;示例&#xff09; 二、滚动更新策略 …

深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇-续

序言 反向传播&#xff08;Backpropagation&#xff0c;简称backprop&#xff09;是神经网络训练过程中最关键的技术之一&#xff0c;尤其在多层神经网络中广泛应用。它是一种与优化方法&#xff08;如梯度下降法&#xff09;结合使用的算法&#xff0c;用于计算网络中各参数的…

Zabbix自动发现

目录 自动发现的主要特点包括&#xff1a; 如何配置自动发现&#xff1a; 实验步骤 1. 创建自动发现规则 2. 给自动发现规则创建动作 3. 给新主机安装agent 在 Zabbix 中&#xff0c;自动发现&#xff08;Auto Discovery&#xff09;是一种强大的功能&#xff0c;用于自…

Vue CoreVideoPlayer 一款基于 vue.js 的轻量级、优秀的视频播放器组件

大家好,我是程序视点的小二哥!今天小二哥给大家推荐一款非常优秀的视频播放组件 效果欣赏 介绍 Vue-CoreVideoPlayer 一款基于vue.js的轻量级的视频播放器插件。 采用Adobd XD进行UI设计&#xff0c;支持移动端适配,不仅功能强大&#xff0c;颜值也是超一流&#xff01; Vue-…

读书记录《SQL从小白到大牛》01

读书记录《SQL从小白到大牛》01 接地气的书名&#xff0c;内容应当值得一读。 第一篇 SQL基础 01 一些基础概念 SQL是结构化查询语言&#xff08;Structured Query Language&#xff09;&#xff0c;是一套用来输入、更改和查看关系数据库内容的命令。数据库发展经历三个阶…

ROS-机械臂-基础概念

课纲 话题通信模型&#xff08;多对多&#xff09; RPC RPC&#xff0c;全称为 Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;是一种通信协议&#xff0c;允许一个计算机程序在另一个网络上的计算机上执行一组函数或过程&#xff0c;而不需程序员显式编码网络…

SketchUp如何阵列?

sketchup如何阵列&#xff1f;请看下面方法。 方法 打开SketchUp。 以默认人物为例。 按M&#xff0c;选中人物&#xff0c;再按住Ctrl移动鼠标&#xff08;不要点击鼠标键&#xff09; 按键盘数字键输入距离&#xff0c;按回车&#xff0c;不要动鼠标。 按*10设置阵列数。 按…

前端开发攻略---webSocket的简单实现与使用

1、演示 2、实现流程 安装依赖 npm i ws 服务端代码 const WebSocket require(ws)// 创建一个 WebSocket 服务器&#xff0c;监听端口 3000 const wss new WebSocket.Server({ port: 3000 })// 监听连接事件 wss.on(connection, function connection(ws) {console.log(客户端…

MySQL篇四:表的约束

文章目录 前言1. 空属性2. 默认值3. 列描述4. zerofill5. 主键6. 自增长7. 唯一键8. 外键 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。…