Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CPU的缓存L1、L2、L3与缓存行填充

CPU的缓存L1、L2、L3与缓存行填充

作者头像
chengcheng222e
发布于 2021-11-04 06:56:38
发布于 2021-11-04 06:56:38
2.8K0
举报
文章被收录于专栏:简栈文化简栈文化

L1,L2,L3 指的都是CPU的缓存,他们比内存快,但是很昂贵,所以用作缓存,CPU查找数据的时候首先在L1,然后看L2,如果还没有,就到内存查找一些服务器还有L3 Cache,目的也是提高速度。

高速缓冲存储器Cache是位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在Cache中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从Cache中调用,从而加快读取速度。由此可见,在CPU中加入Cache是一种高效的解决方案,这样整个内存储器(Cache+内存)就变成了既有Cache的高速度,又有内存的大容量的存储系统了。CacheCPU的性能影响很大,主要是因为CPU的数据交换顺序和CPUCache间的带宽引起的。

高速缓存的工作原理
1. 读取顺序

CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。

正是这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后内存。

2. 缓存分类

前面是把Cache作为一个整体来考虑的,现在要分类分析了。IntelPentium开始将Cache分开,通常分为一级高速缓存L1二级高速缓存L2

在以往的观念中,L1 Cache是集成在CPU中的,被称为片内Cache。在L1中还分数据Cache(I-Cache)和指令Cache(D-Cache)。它们分别用来存放数据和执行这些数据的指令,而且两个Cache可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。

在P4处理器中使用了一种先进的一级指令Cache——动态跟踪缓存。它直接和执行单元及动态跟踪引擎相连,通过动态跟踪引擎可以很快地找到所执行的指令,并且将指令的顺序存储在追踪缓存里,这样就减少了主执行循环的解码周期,提高了处理器的运算效率。

以前的L2 Cache没集成在CPU中,而在主板上或与CPU集成在同一块电路板上,因此也被称为片外Cache。但从PⅢ开始,由于工艺的提高L2 Cache被集成在CPU内核中,以相同于主频的速度工作,结束了L2 Cache与CPU大差距分频的历史,使L2 CacheL1 Cache在性能上平等,得到更高的传输速度。L2Cache只存储数据,因此不分数据Cache和指令Cache。在CPU核心不变化的情况下,增加L2 Cache的容量能使性能提升,同一核心的CPU高低端之分往往也是在L2 Cache上做手脚,可见L2 Cache的重要性。现在CPUL1 CacheL2 Cache惟一区别在于读取顺序。

3. 读取命中率

CPUCache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。从理论上讲,在一颗拥有2级CacheCPU中,读取L1 Cache的命中率为80%。也就是说CPUL1 Cache中找到的有用数据占数据总量的80%,剩下的20%从L2 Cache读取。由于不能准确预测将要执行的数据,读取L2的命中率也在80%左右(从L2读到有用的数据占总数据的16%)。那么还有的数据就不得不从内存调用,但这已经是一个相当小的比例了。在一些高端领域的CPU(像IntelItanium)中,我们常听到L3 Cache,它是为读取L2 Cache后未命中的数据设计的—种Cache,在拥有L3 CacheCPU中,只有约5%的数据需要从内存中调用,这进一步提高了CPU的效率。

为了保证CPU访问时有较高的命中率,Cache中的内容应该按一定的算法替换。一种较常用的算法是“最近最少使用算法”(LRU算法),它是将最近一段时间内最少被访问过的行淘汰出局。因此需要为每行设置一个计数器,LRU算法是把命中行的计数器清零,其他各行计数器加1。当需要替换时淘汰行计数器计数值最大的数据行出局。这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出Cache,提高Cache的利用率。

缓存行填充

CPU访问内存时,并不是逐个字节访问,而是以字长为单位访问。比如32位的CPU,字长为4字节,那么CPU访问内存的单位也是4字节。

这么设计的目的,是减少CPU访问内存的次数,加大CPU访问内存的吞吐量。比如同样读取8个字节的数据,一次读取4个字节那么只需要读取2次。

我们来看看,编写程序时,变量在内存中是否按内存对齐的差异。有2个变量word1、word2

图如下:

我们假设CPU4字节为单位读取内存。如果变量在内存中的布局按4字节对齐,那么读取a变量只需要读取一次内存,即word1;读取b变量也只需要读取一次内存,即word2

而如果变量不做内存对齐,那么读取a变量也只需要读取一次内存,即word1;但是读取b变量时,由于b变量跨越了2个word,所以需要读取两次内存,分别读取word1word2的值,然后将word1偏移取后3个字节,word2偏移取前1个字节,最后将它们做或操作,拼接得到b变量的值。

显然,内存对齐在某些情况下可以减少读取内存的次数以及一些运算,性能更高。

另外,由于内存对齐保证了读取b变量是单次操作,在多核环境下,原子性更容易保证。

但是内存对齐提升性能的同时,也需要付出相应的代价。由于变量与变量之间增加了填充,并没有存储真实有效的数据,所以占用的内存会更大。这也是一个典型的空间换时间的应用场景。

参考文章
  • https://blog.csdn.net/karamos/article/details/80126704
  • https://pengrl.com/p/20020/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 简栈文化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
为什么CPU缓存会分为一级缓存L1、L2、L3?有什么意义?
CPU缓存是CPU一个重要的组成部分,大家都知道三级缓存的重要性,但是知不知道三级缓存意味着什么,是不是三级缓存越大越好呢?让我们一起来看一下吧。
张哥编程
2024/12/21
1.6K0
我把 CPU 三级缓存的秘密,藏在这 8 张图里
在上一篇文章里,我们聊到了计算机存储器系统的金字塔结构,其中在 CPU 和内存之间有一层高速缓存,就是我们今天要聊的 CPU 三级缓存。
用户9995743
2022/12/22
2.3K0
我把 CPU 三级缓存的秘密,藏在这 8 张图里
CPU体系结构之cache小结
What is cache? CPU缓存(Cache Memory)位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访
刘盼
2022/07/21
1.4K0
CPU体系结构之cache小结
CPU介绍
cpu基本想到的是计算,因此有算数计算,还有逻辑计算单元以及移位简单的运算;fp运算单独拿出;要运算就需要输入数字,因此有寄存器组,即通用寄存器组,可以程序改变的比如,把某个数置到被加数的寄存器中;还有表示一些状态的专用寄存器比如进位了,这些只能有cpu自己决定,不能程序改变;
全栈程序员站长
2022/07/15
9150
L1 L2 L3 Cache到底放在哪里好呢?
我是cloud3,前段时间写了几篇关于高速缓存的文章,很多朋友加我好友也聊了不少。今天我们看看Cache的发展历史,这L1 L2 L3 Cache一开始是放哪里的?
虚拟化云计算
2023/03/27
1.5K0
L1 L2 L3 Cache到底放在哪里好呢?
Linux 性能优化之CPU 多级缓存认知
99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式
山河已无恙
2024/09/30
8840
Linux 性能优化之CPU 多级缓存认知
24张图7000字详解计算机中的高速缓存
  缓存又叫高速缓存,是计算机存储器中的一种,本质上和硬盘是一样的,都是用来存储数据和指令的 。它们最大的区别在于读取速度的不同。程序一般是放在内存中的,当CPU执行程序的时候,执行完一条指令需要从内存中读取下一条指令,读取内存中的指令要花费100000个时钟周期(缓存读取速度为200个时钟周期,相差500倍),如果每次都从内存中取指令,CPU运行时将花费大量的时间在读取指令上。这显然是一种资源浪费。
嵌入式与Linux那些事
2021/04/20
1.9K0
为了写出更好的利用 系统 资源的代码
这不,要做毕设了嘛。之前写的那些项目勉勉强强能跑起来,但是性能方面是没有太在意的,这次准备精打细算一番。看看瓶颈到底都在哪里。
看、未来
2021/10/18
3590
面试官:如何写出让 CPU 跑得更快的代码?
代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能。
小林coding
2020/10/30
1K0
面试官:如何写出让 CPU 跑得更快的代码?
CPU多级缓存
众所周知,CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据。在很多年前,CPU的频率与内存总线的频率在同一层面上。内存的访问速度仅比寄存器慢一些。但是,这一局面在上世纪90年代被打破了。CPU的频率大大提升,但内存总线的频率与内存芯片的性能却没有得到成比例的提升。并不是因为造不出更快的内存,只是因为太贵了。内存如果要达到目前CPU那样的速度,那么它的造价恐怕要贵上好几个数量级。所以,CPU的运算速度要比内存读写速度快很多,这样会使CPU花费很长的时间等待数据的到来或把数据写入到内存中。所以,为了解决CPU运算速度与内存读写速度不匹配的矛盾,就出现了CPU缓存。
Abalone
2022/07/14
2K0
CPU多级缓存
CPU高速缓存与内存屏障
最后,关于写作内存相关的原因是为了更好地理解同步关键字synchronized的内存语义(下一篇哈)
小坤探游架构笔记
2020/03/10
1.9K0
CPU高速缓存与内存屏障
JAVA 拾遗 — CPU Cache 与缓存行
最近的两篇文章,介绍了我参加的中间件比赛中一些相对重要的优化,但实际上还存在很多细节优化,出于篇幅限制并未提及,在最近的博文中,我会将他们整理成独立的知识点,并归类到我的系列文章「JAVA 拾遗」中。
kirito-moe
2018/07/25
1.6K0
JAVA 拾遗 — CPU Cache 与缓存行
如何利用CPU Cache写出高性能代码,看这些图就够了!
我们平时编写的代码最后都会交给CPU来执行,如何能巧妙利用CPU写出性能比较高的代码呢?看完这篇文章您可能会有所收获。
GorgonMeducer 傻孩子
2020/11/17
2.9K0
如何利用CPU Cache写出高性能代码,看这些图就够了!
CPU缓存和内存屏障
为了提高程序的运行性能, 现代CPU在很多方面对程序进行了优化 例如: CPU高速缓存, 尽可能的避免处理器访问主内存的时间开销, 处理器大多会利用缓存以提高性能
CodingDiray
2019/09/25
3.1K0
CPU缓存和内存屏障
JAVA线程-CPU缓存和内存屏障(四)
1.修改态(Modified),此cache行已被修改过(脏行),内容已不同于主存,为此cache专有。 2.专有态(Exclusive),此cache行内容同于主存,但不出现于其他cache中。 3.共享态(Shared),此cache行内容同于主存,但也出现于其他cache中。 4.无效态(Invalid),此cache行内容无效,需要从主内存重新加载。
IT架构圈
2020/03/28
2K0
天啦噜!知道硬盘很慢,但没想到比 CPU Cache 慢 10000000 倍
大家如果想自己组装电脑的话,肯定需要购买一个 CPU,但是存储器方面的设备,分类比较多,那我们肯定不能只买一种存储器,比如你除了要买内存,还要买硬盘,而针对硬盘我们还可以选择是固态硬盘还是机械硬盘。
小林coding
2020/10/30
9130
天啦噜!知道硬盘很慢,但没想到比 CPU Cache 慢 10000000 倍
离CPU最近的缓存
今天我们聊聊CPU的指令缓存和数据缓存,即iCache和dCache,他俩就是离CPU最近的缓存了。
虚拟化云计算
2023/03/27
9170
离CPU最近的缓存
原来 CPU 为程序性能优化做了这么多
本文主要来学习内存屏障和 CPU 缓存知识,以便于我们去了解 CPU 对程序性能优化做了哪些努力。
武培轩
2020/03/31
6950
原来 CPU 为程序性能优化做了这么多
存储概述:计算机层次化存储体系概述
1946年,冯•诺依曼提出了以存储程序为核心的计算机模型,该计算机模型一直沿用至今。通常称该计算机模型为冯•诺依曼模型(结构),将采用该思想设计的计算机为冯•诺依曼计算机。
Janesong
2024/08/30
2850
【AI系统】CPU 计算时延
CPU(中央处理器)是计算机的核心组件,其性能对计算机系统的整体性能有着重要影响。CPU 计算时延是指从指令发出到完成整个指令操作所需的时间。理解 CPU 的计算时延对于优化计算性能和设计高效的计算系统至关重要。在本文中我们将要探讨 CPU 的计算时延组成和影响时延产生的因素,并深入讨论 CPU 计算的时延产生。
用户11307734
2024/11/26
2710
相关推荐
为什么CPU缓存会分为一级缓存L1、L2、L3?有什么意义?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档