关于CPU cache

news/2025/3/4 7:07:13/

1、cache基础

简单来说,cache快,内存慢,硬盘更慢。

L1速度> L2速度> L3速度> RAM

L1容量< L2容量< L3容量< RAM

L1 Cache也被划分成指令cachaL1i (i for instruction)和数据cacheL1d (d for data)两种专门用途的缓存。

2、cache组成

SET(组)、WAY(路)、TAG、INDEX,这几个概念是理解Cache的关键。

Cache Line可以简单的理解为CPU Cache中的最小缓存单位。把一个缓存按照N个Cache Line作为一路(WAY),多个WAY组成一组(SET),比如4路组,每个set包含4way,每个way包含N个cacha line。

 

 

 目前主流的CPU Cache的Cache Line大小都是64Bytes,16KB的cache是4way的话,每个set包括4*64B,则整个cache分为16KB/64B/4 = 64set。就是说16KB的cache,有4way路,cache 是64B字节的,那每一路的话16KB/64B/4 = 64set组。

组(set):cache分成了几个大块,就是4个相同的数组。

索引域index:是用来索引块里面的cache line。块可以看成一个大的数组,数组的成员就是cache line,虚拟地址的索引域就是数组的下标。

标记tag:就是高速缓存地址用一部分的bit位(通常是虚拟地址的高位部分),他是用来判断高速缓存行的地址是否和处理器寻址地址一致。用来做匹配用的。

偏移offset:cpu是按照word,byte来访问的,cache line通常是32、64字节, 我们通过索引域找到cache line,通过标记来匹配cache line,叫做cache line命中,cpu需要4个字节就需要偏移来获得。

cache line是32字节是offset就是0~4位,cache line是64字节的话,就是0~5位

对于一个地址来讲,从索引域就可以找到4个cache line,每个数组一个cache line,这4个索引域相同的找到的cache line就组成了一个组。一个组里面的cache line他们的索引域是相同的。

为什么需要组的概念???

如果cache只分成一个大块,那么一个索引值只能对应一个cache line。那如果cpu访问2个地址,假设两个地址的索引值是一样的。那么cache就要把前面那个cache line给踢出来了,再访问第二个索引值相同的地址的话,就需要把前面的cache line给踢出去,然后才能读进新的数据来。 如果cpu很频繁的访问这两个地址的话,那么这个cache line就会把频繁的踢来踢去,造成性能的低下。====》这个就叫cache 的颠簸。

如果一个组里有4个cache line就足够多个相同索引域的地址的访问。

比如CPU访问地址

0 000000 XXXXXX 或者 1 000000 XXXXXX或者YYYY 000000 XXXXXX

由于它们红色的6位都相同,所以他们全部都会找到第0个set的cacheline。第0个set里面有4个way,之后硬件会用地址的高位如0,1,YYYY作为tag,去检索这4个way的tag是否与地址的高位相同,而且cacheline是否有效,如果tag匹配且cacheline有效,则cache命中。

所以地址YYYYYY000000XXXXXX全部都是找第0个set,YYYYYY000001XXXXXX全部都是找第1个set,YYYYYY111111XXXXXX全部都是找第63个set。每个set中的4个way,都有可能命中。

参考文档:

宋宝华:深入理解cache对写好代码至关重要

阅读ARM Memory(L1/L2/MMU)笔记

关于CPU Cache -- 程序猿需要知道的那些事


http://www.ppmy.cn/news/464699.html

相关文章

src/storage/storage.cc: Compile with USE_CUDA=1 to enable GPU usage【MXNET GPU版】

【环境】Win10 一、想在GPU上运行MXNET&#xff0c;报错如下&#xff1a; MXNetError: [23:23:48] src/storage/storage.cc:xxx: Compile with USE_CUDA1 to enable GPU usage【原因】安装的是cpu版的mxnet&#xff0c;不是gpu版的 【解决】卸载原来cpu版本的mxnet&#xff…

Locality-Driven Dynamic GPU Cache Bypassing

文章目录 abstractintroduction问题背景内存请求处理 GPU缓存效率分析过滤器的设计decoupled 设计Decoupled L1D:operationSM Dueling 实验性能评估 abstract 本篇文章主要介绍了一个缓存优化的方法&#xff0c;这个方法专门对大吞吐量的架构&#xff0c;比如GPU应用&#xff…

SpringBoot中集成Redis

目标 在原有SpringBoot项目中&#xff0c;集成Redis&#xff0c;并实现Dao层&#xff0c;Service层&#xff0c;Controller层。 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</…

DTC143ZM理解介绍(含电路应用)

前人种树&#xff0c;后人乘凉&#xff1b;创造不易&#xff0c;请勿迁移~ author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主daisy.skye擅长嵌入式,Qt,Linux,等方面的知识https://blog.csdn.net/qq_40715266?t…

MTU是什么?

最大传输单元&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09; 是指一种通信协议的某一层上面所能通过的最大数据包大小&#xff08;以字节为单位&#xff09;。最大传输单元这个参数通常与通信接口有关&#xff08;网络接口卡、串口等&#xff09; 一个帧中…

MTU解释

Maximum Transmission Unit一种通信协议的某一层上面所能通过的最大数据单元的大小通常与 通信接口有关&#xff08;网络接口卡、串口等&#xff09; 链路层具有MTU特性限制数据帧的最大长度以太网的MTU是1500 netstat -i

arcpy批量将excel一些列的点坐标制作成面

使用Arcpy可以批量将Excel表格中的点坐标制作成面&#xff0c;并将对应组点的属性写入到对应面的属性中。 import arcpy import xlrd # 设置输入数据路径 excel_file r"C:\data\points.xlsx" # 包含点坐标和属性的Excel表格 output_feature_class r"C:\data…

MTU是什么

MTU是通信术语&#xff0c;意思是“最大传输单元”。 简单解释一下&#xff1a;网络上的数据在传输的时候会被打成一个一个的“包”&#xff0c;网络设备的端口默认设置了MTU值&#xff0c;如果数据包的大小没有超过这个值&#xff0c;就直接被转发&#xff1b;如果超过了MTU值…