cpu cache总结

CPU缓存是什么?

CPU缓存的定义为CPU与内存之间的临时数据交换器,它的出现是为了解决CPU运行处理速度与内存读写速度不匹配的矛盾——缓存的速度比内存的速度快多了。CPU缓存一般直接跟CPU芯片集成或位于主板总线互连的独立芯片上。(现阶段的CPU缓存一般直接集成在CPU上)CPU往往需要重复处理相同的数据、重复执行相同的指令,如果这部分数据、指令CPU能在CPU缓存中找到,CPU就不需要从内存或硬盘中再读取数据、指令,从而减少了整机的响应时间。

为什么需要cache

CPU缓存速度和内存速度差多少?

cpu速度:1ns
内存速度:100ns
硬盘速度:16ms

正如内存中可以存放硬盘中多次访问的数据。cpu缓存也是用来存放内存中多次访问的数据。

局部性原理:
一个内存位置以后过不多久还会多次访问,
一个内存位置被访问了, 附近的位置很快也会访问到

CPU往往需要重复处理相同的数据、重复执行相同的指令,如果这部分数据、指令CPU能在CPU缓存中找到,CPU就不需要从内存或硬盘中再读取数据、指令,从而减少了整机的响应时间。

cache分类

cache按照数据读取顺序和与CPU结合的紧密程度一般分为三级,L1 ,L2,L3.最近的技术已出现L4了

当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。一般来说,每级缓存的命中率大概都在80%左右,也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、剩下的5%从三级缓存中读取,由此可见一级缓存是整个CPU缓存架构中最为重要的部分。L3缓存对处理器的性能提高显得不是很重要。

他们的区别是什么?

在这里插入图片描述

在这里插入图片描述

1、用处不同

L1 L2 是每个核的cpu都有,L3是多核心共用的缓存

2、速度差别

L1 cache: 3 cycles(周期)

L2 cache: 11 cycles

L3 cache: 25 cycles

Main Memory: 100 cycles

L1/L2 Cache都是用SRAM(静态Static RAM)做为存储介质,为什么说L1比L2快呢?这里面有三方面的原因:

1.存储容量不同导致的速度差异

L1的容量通常比L2小,容量大的SRAM访问时间就越长,同样制程和设计的情况下,访问延时与容量的开方大致是成正比的。

2.离CPU远近导致的速度差异

通常L1 Cache离CPU核心需要数据的地方更近,而L2 Cache则处于边缓位置,访问数据时,L2 Cache需要通过更远的铜线,甚至更多的电路,从而增加了延时。

L1 Cache分为ICache(指令缓存instruction cache)和DCache(数据缓存),分别用来存放数据以及对执行这些数据的指令进行即时解码。指令缓存ICache通常是放在CPU核心的指令预取单远附近的,数据缓存DCache通常是放在CPU核心的load/store单元附近。而L2 Cache是放在CPU pipeline之外的。

为什么不把L2 Cache也放在很近的地方呢?由于Cache的容量越大,面积越大,相应的边长的就越长(假设是正方形的话),总有离核远的。

3.制程不同的造成的速度差异

在实际设计制造时,针对L1/L2的不同角色,L1更加注重速度, L2更加注重节能和容量。

3、容量差别

L1 Cache一级缓存

一级缓存是CPU第一层级的高速缓存,主要承担的工作是缓存数据和缓存指令。L1告诉缓存的容量和结构对CPU性能影响很大,但是由于它的结构很复杂,考虑到成本等方面的因素,一般CPU的一级缓存也就能做到256KB左右的水平。一般在32—256KB之间

L2 Cache二级缓存

二级缓存是CPU的第二层级高速缓存,二级缓存的容量会直接影响CPU性能,原则是越大越好。而且它是跟着核心走的,比如8代酷睿的i7 8700,6个核心每个都拥有256KB的二级缓存,属于各核心独享,这样总数就达到了1.5MB。一般在4MB-128MB之间

L3 Cache三级缓存

三级缓存其实原本是服务器级别CPU才有的,后来逐步下放到家用级CPU上。三级缓存的作用是进一步降低内存延迟,同时提升海量数据量计算时的性能,这对游戏有直接的影响哦!和一、二级缓存不同的是,三级缓存是核心共享的,而且容量可以做的很大。一般在4MB-128MB之间

L4 Cache四级缓存

一般大于512MB

数据读取命中率不同

CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。从理论上讲,在一颗拥有2级Cache的CPU中,读取L1 Cache的命中率为80%。也就是说CPU从L1 Cache中找到的有用数据占数据总量的80%,剩下的20%从L2 Cache读取。

为了保证CPU访问时有较高的命中率Cache中的内容应该按一定的算法替换,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出Cache,提高Cache的利用率。

怎么设计缓存的存放算法才能提高cache的利用率?

也就是采用什么算法将内存中哪些数据存放到缓存中?

举个别例子如下:

1、Least-Recently-Used(LRU) - 最近最少使用

替换掉最近被请求最少的文档。这一传统策略在实际中应用最广。在CPU缓存淘汰和虚拟内存系统中效果很好。然而直接应用与代理缓存效果欠佳,因为Web访问的时间局部性常常变化很大。

2、Least-Frequently-Used(LFU) - 最不经常使用

替换掉访问次数最少的。这一策略意图保留最常用的、最流行的对象,替换掉很少使用的那些。然而,有的文档可能有很高的使用频率,但之后再也不会用到。

3、SIZE

替换size最大的对象。这一策略通过淘汰一个大对象而不是多个小对象来提高命中率。不过,可能有些进入缓存的小对象永远不会再被访问。

4、LRU-Threshold

不缓存超过某一size的对象,其它与LRU相同。

为什么cache 要分级

既然L1 速度最快,为什么不直接把L1的容量扩大,反而要多次一举做一个L2?

简单来说是因为一级缓存的技术难度和制造成本最高,提高容量所带来的技术难度增加和成本增加非常大,所带来的性能提升却不明显,性价比很低。

L1 cache vs L2 Cache用于存储数据的缓存部分通常被称为RAM,掉电以后其中的信息就会消失。RAM又分两种,其中一种是静态RAM(SRAM);另外一种是动态RAM(DRAM)。前者的存储速度要比后者快得多,我们使用的内存一般都是动态RAM。CPU的L1级缓存通常都是静态RAM,速度非常的快,但是静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍),而且价格也相对较为昂贵(同容量的静态RAM是动态RAM的四倍)。扩大静态RAM作为缓存是一个不太合算的做法,但是为了提高系统的性能和速度又必须要扩大缓存,这就有了一个折中的方法:在不扩大原来的静态RAM缓存容量的情况下,仅仅增加一些高速动态RAM做为L2级缓存。高速动态RAM速度要比常规动态RAM快,但比原来的静态RAM缓存慢,而且成本也较为适中。

猜你喜欢

转载自blog.csdn.net/fanren224/article/details/87859216