CSAPP Cache Lab(缓存模拟器)
前言
理解高速缓存对 C 程序性能的影响,通过两部分实验达成:编写高速缓存模拟器;优化矩阵转置函数以减少高速缓存未命中次数。Part A一开始根本不知道要做什么,慢慢看官方文档,以及一些博客,和B站视频,终于知道是干嘛的了,看完别人的解题方法后,就能自己写出来了。按照我给出的一些链接,完全能搞懂Cache Simulator。Part B给大家推荐了两篇文章。
参考资料:
Lab下载链接,CacheLab官方文档,CacheLab官方课件(强烈推荐阅读),大佬笔记
新发现的宝藏网站
Part A: Writing a Cache Simulator
下面这些描述是我用豆包对官方PDF生成的总结
- 输入输出:接受 Valgrind 内存跟踪文件作为输入,模拟高速缓存的命中 / 未命中行为,输出命中、未命中和驱逐(替换)的总数。
- 参考模拟器:提供
csim - ref
作为参考模拟器,使用 LRU(最近最少使用)替换策略,命令行参数为Usage:./csim - ref [-hv] - s <s> - E <E> - b <b> - t <tracefile>
,其中-h
为帮助标志,-v
为详细输出标志,-s
指定组索引位数,-E
指定每行关联度,-b
指定块大小位数,-t
指定 Valgrind 跟踪文件路径。 - 编程规则:编译无警告;为任意 S、E、b 值正确工作,需用
malloc
分配存储空间;忽略指令缓存访问(以 “I” 开头的行);在main
函数结束时调用printSummary
函数输出结果;假设内存访问已正确对齐,忽略 Valgrind 跟踪文件中的请求大小。 - 提示:先在小跟踪文件(如
traces/dave.trace
)上调试。参考模拟器的-v
选项可显示详细的命中、未命中和驱逐信息,建议在csim.c
中实现此功能辅助调试。推荐使用getopt
函数解析命令行参数,需包含<getopt.h>
、<stdlib.h>
、<unistd.h>
头文件。数据加载(L)或存储(S)操作最多导致一次缓存未命中,数据修改(M)操作视为一次加载和一次存储,可能产生两次命中、一次未命中加一次命中或一次未命中加一次命中加一次驱逐。
下面是高速缓存(S, E, B, m)的通用组织。高速缓存是一个高速缓存的数组。每个组包含一个或多个行,每个行包含一个有效位,一些标记位,以及一个数据块。高速缓存的结构将m个地址位划分成了t个标记位,s个索引位和b个块偏移位。详见CSAPP6.4。强烈推荐B站视频,看完之后就知道这个实验要做什么了,理解计算机Cache(一):从块到缓存结构,以及逐步推出映射策略和理解计算机Cache(二):缓存与内存的交互。
下面是看完别人的解法后,又自己写的代码
#include "cachelab.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>typedef struct cache_line
{int valid_bit; // 有效位unsigned tag; // 标记位int stamp; // 时间戳用于LRU
}cache_line;// S(2^s)块大小, s组索引.
// E缓存块(2^b)行数, b块偏移.
int S, s, B, b, E;
// 命中,未命中,替换
int hit, miss, eviction;
char *filepath;
cache_line **cache;void init()
{// malloc cache[S][E]cache = (cache_line**)malloc(sizeof(cache_line*) * S);for (int i = 0; i < S; i++)cache[i] = (cache_line*)malloc(sizeof(cache_line) * E);for (int i = 0; i < S; i++){for (int j = 0; j < E; j++){cache[i][j].valid_bit = 0;cache[i][j].tag = cache[i][j].stamp = -1; }}
}void destroy()
{for (int i = 0; i < S; i++)free(cache[i]);free(cache);
}void update(unsigned addr)
{int s_addr = (addr >> b) & ((-1U) >> (32 - s));int t_addr = (addr >> (s + b));// 缓存命中for (int i = 0; i < E; i++){if (cache[s_addr][i].tag == t_addr){cache[s_addr][i].stamp = 0;hit++;return;}}// 缓存未命中,还有空块for (int i = 0; i < E; i++){if (cache[s_addr][i].valid_bit == 0){miss++;cache[s_addr][i].valid_bit = 1;cache[s_addr][i].tag = t_addr;cache[s_addr][i].stamp = 0;return;}}// 没有空组,产生替换miss++;eviction++; int max_stamp = 0, max_i = 0;for (int i = 0; i < E; i++){if (cache[s_addr][i].stamp > max_stamp){max_stamp = cache[s_addr][i].stamp;max_i = i;}}cache[s_addr][max_i].tag = t_addr; cache[s_addr][max_i].stamp = 0;return;
}void time()
{for (int i = 0; i < S; i++){for (int j = 0; j < E; j++){if (cache[i][j].valid_bit == 1) // 被使用了cache[i][j].stamp++;}}
}int main(int argc, char* argv[])
{int opt;while (-1 != (opt = getopt(argc, argv, "s:E:b:t:"))){switch (opt){case 's':s = atoi(optarg); // optarg是getopt函数设置的指向当前选项参数的指针S = 1 << s;break;case 'E':E = atoi(optarg);break;case 'b':b = atoi(optarg);B = 1 << b;break;case 't':filepath = optarg;break;}}init();FILE* pf = fopen(filepath, "r");if (pf == NULL){printf("fopen fail\n");exit(-1);}char op;unsigned addr;int size;while (fscanf(pf, "%c %x,%d", &op, &addr, &size) > 0){switch (op){case 'L':update(addr);break;case 'M': // 执行两次update(addr);case 'S':update(addr);break;}time();}destroy();fclose(pf);printSummary(hit, miss, eviction);return 0;
}
Part B: Optimizing Matrix Transpose
- 函数功能:在
trans.c
中编写transpose_submit
函数,计算矩阵的转置并存储结果,尽量减少高速缓存未命中次数。 - 编程规则:编译无警告;每个转置函数最多定义 12 个
int
类型的局部变量,不能使用long
类型变量或位技巧规避此规则;函数不能使用递归;使用辅助函数时,辅助函数和顶级转置函数在栈上的局部变量总数不能超过 12 个;不能修改数组 A,可随意处理数组 B;不能定义数组或使用malloc
。 - 提示:转置函数在直接映射缓存上评估,冲突未命中是潜在问题,需考虑代码中尤其是对角线上的冲突未命中,设计降低冲突未命中的访问模式。分块是减少缓存未命中的有用技术,可参考利用分块提高时间局部性PDF 获取更多信息。测试程序
test - trans
会保存函数的跟踪文件(如trace.f0
等),可通过参考模拟器的-v
选项运行跟踪文件辅助调试。
给大家推荐两个写的好的文章,我做不出来…
myk的Cache Lab和马天猫的Cache Lab笔记。
相关文章:
CSAPP Cache Lab(缓存模拟器)
前言 理解高速缓存对 C 程序性能的影响,通过两部分实验达成:编写高速缓存模拟器;优化矩阵转置函数以减少高速缓存未命中次数。Part A一开始根本不知道要做什么,慢慢看官方文档,以及一些博客,和B站视频&…...
【机器学习】机器学习的基本分类-监督学习-逻辑回归-对数似然损失函数(Log-Likelihood Loss Function)
对数似然损失函数(Log-Likelihood Loss Function) 对数似然损失函数是机器学习和统计学中广泛使用的一种损失函数,特别是在分类问题(例如逻辑回归、神经网络)中应用最为广泛。它基于最大似然估计原理,通过…...
51c自动驾驶~合集35
我自己的原文哦~ https://blog.51cto.com/whaosoft/12206500 #纯视觉方案的智驾在大雾天还能用吗? 碰上大雾天气,纯视觉方案是如何识别车辆和障碍物的呢? 如果真的是纯纯的,特头铁的那种纯视觉方案的话。 可以简单粗暴的理解为…...
网络安全体系与网络安全模型
4.1 网络安全体系概述 4.1.1 网络安全体系概述 一般面言,网络安全体系是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规则组成的,共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术…...
antd table 自定义表头过滤表格内容
注意:该功能只能过滤可一次性返回全部数据的表格,通过接口分页查询的请自主按照需求改动哈~ 实现步骤: 1.在要过滤的列表表头增加过滤图标,点击图标显示浮窗 2.浮窗内显示整列可选选项,通过勾选单选或者全选、搜索框来…...
Elasticsearch实战:从搜索到数据分析的全面应用指南
Elasticsearch(简称 ES)是一个强大的分布式搜索引擎和分析工具,它能够快速处理海量数据,并提供全文检索、结构化搜索、数据分析等功能。在现代系统中,它不仅是搜索的核心组件,也是数据分析的有力工具。 本文…...
BEPUphysicsint定点数3D物理引擎介绍
原文:BEPUphysicsint定点数3D物理引擎介绍 - 哔哩哔哩 帧同步的游戏中如果用物理引擎,为了保证不同设备上的结果一致,需要采用定点数来计算迭代游戏过程中的物理运算。也就是我们通常说的定点数物理引擎(确定性物理引擎)。本系列教程给大家详细的讲解如…...
宠物领养平台构建:SpringBoot技术路线图
摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…...
解决Flink读取kafka主题数据无报错无数据打印的重大发现(问题已解决)
亦菲、彦祖们,今天使用idea开发的时候,运行flink程序(读取kafka主题数据)的时候,发现操作台什么数据都没有只有满屏红色日志输出,关键干嘛?一点报错都没有,一开始我觉得应该执行程序…...
python自动化测开面试题汇总(持续更新)
介绍他们测某云,底层是linux可以挂多个磁盘,有现有的接口,用python实现热插拔,查看它的功能,项目目前用到的是python,linux和虚拟云,结合你之前的项目介绍下三者(3min之内) 列表判断是否有重复元素 求1-9的…...
1-1 Gerrit实用指南
注:学习gerrit需要拥有git相关知识,如果没有学习过git请先回顾git相关知识点 黑马程序员git教程 一小时学会git git参考博客 git 实操博客 1.0 定义 Gerrit 是一个基于 Web 的代码审查系统,它使用 Git 作为底层版本控制系统。Gerrit 的主要功…...
docker如何安装redis
第一步 如果未指定redis,则安装的是最新版的 docker pull redis 创建一个目录 mkdir /usr/local/docker/redis 然后直接可以下载redis,这是方式确实不怎么好,应该找在官网上找对应的redis配置文件 wget http://download.redis.io/redis-stab…...
省级新质生产力数据(蔡湘杰版本)2012-2022年
测算方式:参考《当代经济管理》蔡湘杰(2024)老师研究的做法,本文以劳动者、劳动对象和劳动资料为准则层,从新质生产力“量的积累、质的提升、新的拓展”三维目标出发,构建新质生产力综合评价指标体系&#…...
【游资悟道】-作手新一悟道心法
作手新一经典语录节选: 乔帮主传完整版:做股票5年,炼成18式,成为A股低吸大神!从小白到大神,散户炒股的六个过程,不看不知道自己水平 围着主线做,多研究龙头,研究涨停&am…...
Diffusion中的Unet (DIMP)
针对UNet2DConditionModel模型 查看Unet的源码,得知Unet的down,mid,up blocks的类型分别是: down_block_types: Tuple[str] ("CrossAttnDownBlock2D","CrossAttnDownBlock2D","CrossAttnDownBlock2D","DownBlock2…...
编译以前项目更改在x64下面时报错:函数“PVOID GetCurrentFiber(void)”已有主体
win32下面编译成功,但是x64报错 1>GetWord.c 1>md5.c 这两个文件无法编译 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24125,1): error C2084: 函数“PVOID GetCurrentFiber(void)”已有主体 1>C:\Program Files (x…...
【AIGC】大模型面试高频考点-数据清洗篇
【AIGC】大模型面试高频考点-数据清洗篇 (一)常用文本清洗方法1.去除无用的符号2.去除表情符号3.文本只保留汉字4.中文繁体、简体转换5.删除 HTML 标签和特殊字符6.标记化7.小写8.停用词删除9.词干提取和词形还原10.处理缺失数据11.删除重复文本12.处理嘈…...
当测试时间与测试资源有限时,你会如何优化测试策略?
1.优先级排序:根据项目的需求和紧急程度进行优先级排序,将测试用例用例划分优先级,合理安排测试资源 和时间。这样能够保障在有限的时间内测试到最关键的功能 2.提前介入测试:在开发过程中提前进行测试,可以迅速发现问…...
基于R语言森林生态系统结构、功能与稳定性分析与可视化
在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...
如何使用 Python 实现插件式架构
使用 Python 实现插件式架构可以通过动态加载和调用模块或类,构建一个易于扩展和维护的系统。以下是实现插件式架构的步骤和核心思想。 1. 插件式架构核心概念 主程序:负责加载、管理插件,并调用插件的功能。插件:独立的模块或类…...
【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器
iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...
【纯原生js】原生实现h5落地页面中的单选组件按钮及功能
h5端的按钮系统自带的一般都很丑,需要我们进行二次美化,比如单选按钮复选框之类的,那怎么对其进行html和css的改造? 实现效果 实现代码 <section id"tags"><h2>给景区添加标题</h2><label><…...
深入浅出:开发者如何快速上手Web3生态系统
Web3作为互联网的未来发展方向,正在逐步改变传统互联网架构,推动去中心化技术的发展。对于开发者而言,Web3代表着一个充满机遇与挑战的新领域,学习和掌握Web3的基本技术和工具,将为未来的项目开发提供强大的支持。那么…...
通过深度点图表示的隐式场实现肺树结构的高效解剖标注文献速递-生成式模型与transformer在医学影像中的应用
Title 题目 Efficient anatomical labeling of pulmonary tree structures via deeppoint-graph representation-based implicit fields 通过深度点图表示的隐式场实现肺树结构的高效解剖标注 01 文献速递介绍 近年来,肺部疾病(Decramer等ÿ…...
数据结构 (17)广义表
前言 数据结构中的广义表(Generalized List,又称列表Lists)是一种重要的数据结构,它是对线性表的一种推广,放松了对表元素的原子限制,容许它们具有其自身的结构。 一、定义与表示 定义:广义表是…...
论文笔记 SliceGPT: Compress Large Language Models By Deleting Rows And Columns
欲买桂花同载酒,终不似,少年游。 数学知识 秩: 矩阵中最大线性无关的行/列向量数。行秩与列秩相等。 线性无关:对于N个向量而言,如果任取一个向量 v \textbf{v} v,不能被剩下的N-1个向量通过线性组合的方式…...
前端工具的选择和安装
选择和安装前端工具是前端开发过程中的重要步骤。现代前端开发需要一些工具来提高效率和协作能力。以下是一些常用的前端工具及其选择和安装指南。 1. 代码编辑器 选择一个好的代码编辑器可以显著提高开发效率。以下是几款流行的代码编辑器: Visual Studio Code (…...
Fantasy中定时器得驱动原理
一、服务器框架启动 public static async FTask Start(){// 启动ProcessStartProcess().Coroutine();await FTask.CompletedTask;while (true){ThreadScheduler.Update();Thread.Sleep(1);}} 二、主线程 Fantasy.ThreadScheduler.Update internal static void Update(){MainS…...
【反转链表】力扣 445. 两数相加 II
一、题目 二、思路 加法运算是从低位开始,向高位进位,因此需要将两个链表进行反转,再进行对齐后的相加操作。力扣 2. 两数相加 三、题解 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode …...
SpringBoot 项目中使用 spring-boot-starter-amqp 依赖实现 RabbitMQ
文章目录 前言1、application.yml2、RabbitMqConfig3、MqMessage4、MqMessageItem5、DirectMode6、StateConsumer:消费者7、InfoConsumer:消费者 前言 本文是工作之余的随手记,记录在工作期间使用 RabbitMQ 的笔记。 1、application.yml 使…...
seo企业网站优化/长沙优化网站厂家
1.某公司取得贷款2000万元,年利率12%,要求5年内每年年末等额偿还,则每年的偿还额大约为()。 A.555万元 B.545万元 C.520万元 D.400万元 2.资本资产定价模型把任何一种风险资产的价格都归纳为以下几个因素(…...
做网站开发的笔记本配置/平台优化
string :关键字 String :类 可以认为string 是String的别名,在生成的IL中,都是当做String,类似的还有 object 与Object,int 与 Int32 转载于:https://www.cnblogs.com/nzbbody/archive/2012/01/06/2314170.…...
国家补贴软件网站开发政策/哪个公司做网站推广最好
此检查next_day不在mcal.get_calendar(NYSE)中。valid_days(start_date2000-12-20, end_date2020-01-10)非常耗时,因为它需要从7000天的数组中查找。你需要对每一个操作都这样做,所以我认为这是效率低下的主要原因。 您可以通过转换mcal.get_…...
做外文翻译的网站/情感营销经典案例
二叉树是一种重要的数据结构,初学的我们先要了解如何建立一个二叉树,以及如何去遍历这个二叉树。 ①二叉树的概念和建立 “二叉树”极其类似于变相的链表,只是,其中的每个节点需要存放两个指针:“左支指针left”和“右…...
wordpress帮助手册/常用的搜索引擎有哪些?
前言 本文主要记录下关于斯坦福CS231n课程Lecture1——Lecture5中学习的笔记,以下部分内容为个人理解如有错误,敬请原谅。 一、传统机器学习和深度学习联系 不管是传统的机器学习还是深度学习,贯穿主线的就是特征,只不过传统的机…...
用固定ip做访问网站服务器/2024北京又开始核酸了吗今天
SELECT name,modify_date FROM sys.procedures order by modify_date desc 转载于:https://www.cnblogs.com/hellolong/p/3895071.html...