cpu cache总结
CPU缓存是什么?
CPU缓存的定义为CPU与内存之间的临时数据交换器,它的出现是为了解决CPU运行处理速度与内存读写速度不匹配的矛盾——缓存的速度比内存的速度快多了。CPU缓存一般直接跟CPU芯片集成或位于主板总线互连的独立芯片上。(现阶段的CPU缓存一般直接集成在CPU上)CPU往往需要重复处理相同的数据、重复执行相同的指令,如果这部分数据、指令CPU能在CPU缓存中找到,CPU就不需要从内存或硬盘中再读取数据、指令,从而减少了整机的响应时间。
为什么需要cache
CPU缓存速度和内存速度差多少?如下图所示
cpu速度:1ns
内存速度:100ns
硬盘速度:16ms
硬盘一次读写的时间由两个部分组成:
time = latency + data_size / bandwidth
latency主要由平均硬盘寻道时间和平均硬盘转动延迟组成。硬盘有多个磁盘片组成,每个磁盘又由N个同心的track构成,每个track又分成M个sector。磁头移动到目标track,就是寻道的时间(seektime)。那硬盘转动延迟(rotational delay)取决于硬盘转速,即如果硬盘转速为7200rpm(每分钟7200转),那每转一圈就要1/120=8.3ms,平均延迟就是它的一般,大概是4.17ms。一般的硬盘平均寻道时间是8ms,那么latency就是8+4.17=12.17ms。
所以一般小文件的传输时间主要由latency来决定,而大文件的传输时间则受latency影响较小。而看硬盘性能的时候,主要要看它对小文件的随机读写速度(市面上的所谓传输速率大多是大文件的连续读写,是理想状态,所以实际的性能往往要差很多)。
正如内存中可以存放硬盘中多次访问的数据。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缓存慢,而且成本也较为适中。