早期的计算机系统的存储器层次结构只有三层:CPU寄存器,DRAM主存储器和磁盘存储。不过由于CPU和主存之间逐渐增大的差距,系统设计者被迫在CPU寄存器和主存储器之间插入一个小的SRAM高速缓冲存储器,称为高速缓存(cache),如图所示,高速缓存的访问速度几乎和寄存器一样块,典型的是大约4个时钟周期。
本章的主要内容包括以下几个方面
- cache的作用
- cache的工作原理
- cache的映射方式
1. 我们为什么需要高速缓存
按照摩尔定律,CPU的访问速度每18个月就会翻一番,相当于每年增长60%。而内存的访问速度虽然也在不停的增长,但是却远没有达到这么快。而这两者增长速度的差异,使得CPU性能和内存访问性能的差距不段增大。从上一章我们看到我们进行一次内存访问大约需要200个CPU cycle,速度差慢慢的越来越影响了性能的提升。
如果我们拿显示生活的例子来打比方,CPU的速度好比现在风驰电掣的高铁,以350公里/小时的速度在运行,但是,它却只能等着旁边腿脚不灵活的老太太,好比内存,这个老太太以每小时3公里的速度缓慢不性。因为CPU需要执行的指令,需要访问的数据,都在这个速度不到自己1%的内存里。所以为了弥补这两者之间的性能差异,使得CPU的性能真正得到提升,而不是在那空转,现代的CPU中引入了高速缓存。
而对于cache的引入,主要还是基于我们memory-hierarchy中提到的程序访问的局部性原理,才能使cache的作用发挥到最大。
2. 工作原理
cache使一种小容量高速缓冲存储器,由快速的SRAM组成,直接制作在CPU芯片内部,速度较快,几乎与CPU处理器处于同一个级别。在CPU和主存之间设置cache,总是把主存中被频繁访问的活跃程序块和数据块复制到cache中。由于程序访问的局部性,大多数情况下,CPU可以直接从cache中直接取得指令和数据,而不必访问慢速的主存。
上图是一个计算机的高速缓冲,其被组织成由很多个高速缓存组(Cache set),每个组中又被分成多个行(Way),其中cache line是cache的基本单位。这里的Way解释位一组line的集合,通常说的N-Way组相联,理解为一个set有N个line组成。
总之,一个cahce的组织可以由下面的四个参数数组来标识(S,E,B,m),S是cache set的数目,E是每个cache set的cache line的数目,B是一个cache line中保存的数据块的字节数,m是物理地址的bit数据。
我们以实际例子来说明以下,假设有一个data cache:32-KB,8-way,64-Byte line size cache的总大小为32KB,8路组相联(每组中由8个line组成),每个line的大小 cache line size为64 Byte,那么我们就很容易的计算出有多少组32K/8/64=64
我们运行的程序主要是将对应的数据从内存读取出来,加载到CPU cache里。CPU从内存中读取数据到CPU cache的过程中,是一小块一小块来读取数据的,而不是按照单个数组元素来读取数据的。对于整个过程,其处理流程如下:
- 先检查cache中有没有要访问的信息,若有,就直接在cache中读写,而不用访问主存储器
- 若没有,再从主存中把当前访问的信息所在的一个个主存块复制到cache中。
这样一小块一小块的数据,在CPU Cache里面,我们把它叫作Cache Line(缓冲块)。在我们日常使用的处理器里,Cache Line的大小通常是64字节。cachel line由下面的内容组成
- 该cache line是否有效的标识
- Tag:用来判断是否是cache hit
- 数据块:如果是命中,并且有效,CPU就直接从cache中取走数据,而不必在取访问memory
3. 多级cache存储结构
Cache的速度在一定程度上影响着系统的性能,一般情况下cache的速度可以达到1ns,几乎可以和CPU寄存器速度媲美。但是人们发现当cache中没有缓存想要的数据的时候,依然需要在漫长的等待从主存中load数据。为了进一步提升性能,就引入了多级cache的概念。下图是Intel core i7的cache架构图
在CPU里,通常会有L1,L2,L3这样的三层高速缓存,每个CPU核心都有一块属于自己的L1高速缓存,通常分为指令缓存和数据缓存,分开存放CPU使用的指令和数据。L2的Cache同样是每个CPU核心都有,不过L2的访问速度会比L1稍微慢一些。而L3 cache,则通常是多个CPU核心公用的,尺寸会更大一些,访问速度自然也就更慢一些。
CPU要访问的数据在cache中缓存,称为“命中”(hit),反之则为“缺少”。我们以2级cache的工作过程如下:
- 当CPU访问从某地址load数据时,首先从L1 cache中查询是否命中,如果命中则把数据返回给CPU。如果L1 Cache缺失,则继续从L2 cache中查找。
- 当L2 cache命中时,数据会返回给L1 cache以及CPU,如果L2 cache缺失,那么就需要从主存中Load数据,将数据返回给L2,L1 cache以及CPU。
对于这种多级cache的工作方式称之为inclusive cache,那么某一个地址的数据可能存在多级缓存中。与之对应的是exclusive cache,这种cacha保证某一地址的数据缓存只会存在于多级cache中的一级,也就是任意地址的数据不可能同时在L1和L2 cache中缓存。
4. cache的映射
-
直接映射高速缓存
每个组只有一行(E=1)的高速缓存称为直接映射高速缓存(direct-mapped cache),如下图所示,直接映射高速缓存是最容易实现和理解的
-
组相联高速缓存
组相联高速缓存,放松了对于每个组中只有一行的限制,所以每个组中都保存有多于一个的高速缓存行。如下图所示,每一个组中有2行
- 全相联高速缓存
全相联高速缓存是由一个包含所有高速缓存行的组(即E=C/B)组成,其如下图所示
对应到一张图可以看懂cache的映射方式
- 直接映射:相当于每个set只有1个cache line
- 组关联:多个set,每个set多个cache line,一般每个set有n个cache line,就是说n-ways associative cache
- 全相联:相当于只有1个set