CPU的高速缓存存储器的理解

参考: CPU的高速缓存存储器知识整理

  • 有助于理解cpu cache的组织方式和访问方式;

基于缓存的存储器层次结构行之有效,是因为较慢的存储设备比较快的存储设备更便宜,还因为程序往往展示局部性:

  • 时间局部性:被引用过一次的存储器的位置很可能在不远的将来被再次引用。

  • 空间局部性:如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。

1. 通用高速缓存存储器结构介绍
CPU的高速缓存存储器的理解_第1张图片
一个通用的高速缓存存储器会有S = 2 ^ s个set(组)

每个set含有E个line(既通常所说的cache line)

每个line又包含1位vaild bit、 t位tag、B = 2 ^ b bytes cache block(真正存储数据的地方)。

通常我们说的cache line 64位 32位,实际上是说的cache line中cache block是64位32位。

假设我们的存储器地址有m位,共M = 2^m个不同的地址。我们看一下各个变量之间的关系。

cache缓存数据的大小C = (sizeof set * number of set) = (size of block * lines a set) * number of set = B * E * S

内存大小2^m; Cache line大小2^b; 内存的cache line个数2^(m-b)

2^(m-b)个cache line分到2^s个set里, 每个set会有2^(m - b –s)个cache line,这个数字不是E,是指会有2^(m – b –s)个cache line落到这个set 里面,那么就需要有m-b-s位tag,标记出当前是哪个cache line落到这个set里面了。也就是说t = m - b –s。
CPU的高速缓存存储器的理解_第2张图片
如上图所示,m位地址的内存,需要s位做索引,选set,t位做tag,选cache line,然后b 位做偏移取具体地址的内存。

2. 高速缓存的映射
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步1)组选择2)行匹配3)字抽取。

直接映射

直接映射每个组只有一行E=1

选组

地址中取s bits选组

选行

地址中取t bits与cache line中t bits tag匹配,匹配则命中,不匹配则cache miss

字抽取

地址中的b bits就是cache line中偏移,在命中的cache line中的取字。

直接映射不命中时,不需要什么策略,直接把索引的组中的cache line替换掉即可。

组相连映射

组相连映射中,一个组包括多个cache line,目前常见的有四路组相连映射,16路组相连映射,即一个set中有4个或16个cache line。对比直接映射,set 个数要比直接映射的少。因此s会小,相应的落到每个set中的cache line会多,因此t会大。

选组

组相连映射的组选择与直接映射一致。

选行

cache line的选择时,因为一个set中有多个cache line,因此需要搜索set中的每个cache line的tag,对比检查是否命中。

字抽取

与直接映射一致

组相连映射对于一个index就会有多个行与之相对应,比较每行的tag是否与想要的地址相符合,这样就会大大增加命中的几率,避免了一小段程序中频繁cache失效的问题。

组相连映射不命中时,由于索引到的组中会有多个cache line,因此会有多种算法选择到底替换哪个cache line。

全相连映射
全相连映射就是组相连映射只有一个组的情况。

选组

全相连映射组选择很简单,只有一个组,不需要组索引,s = 0,地址只被划分为一个标记tag,和一个偏移。

选行

全相连映射cache line选择时,需要多缓存中的所有cache line进行搜索对比。

字抽取

与之前一致

全相连映射需要大量的搜索cache line进行对比,导致构造一个又大又快的全相连高速缓存很困难,而且很昂贵。因此全相连缓存只适合做小的高速缓存,比如TLB。

通常折衷的情况下会选择组组相连的映射方式。

你可能感兴趣的:(cpu,缓存)