Skip to content
On this page

缓存


软件版本硬件版本更新内容
linux 5.8.18arm64

1. 概述

硬件结构图

缓存部分,还会细分为一级cache,可以表示为L1,二级cache表示为L2,依次类推。其中一级cache还分为数据cache,指令cache,所以可以L1d表示一级数据cache,还有L1i表示一级指令cache等等。

1.1 缓存种类

独占缓存是指L1,L2,L3级所缓存的内容不相同,这样当L1需要缓存新的内容,必须先在L1中腾出空间,腾出的内容将放L2中,L2中需要腾出空间,腾出的见容放到L3中,L3也需要腾出空间,腾出的内容将推入内存中,从L1到内存逐级推入的成本会越来越高,也就是从L1腾出空间,腾出的内容放到L2中要比L3腾出空间腾出内容放入内存成本要低很多。

包容性缓存是指L1的内容同时也会存在于L2中,因为L2的空间比L1大,所以L2除了L1中的内容还会有别的内容,L3和L2的关系也是一样。

对比:

  • 缓存新内容:独占缓存需要从L1推入L2比较慢,而包容性缓存不需要因为L2中已经包括了L1的内容
  • 空间浪费:独占缓存不存在浪费,包容性缓存因为L1和L2中存在相同的内容所以存在浪费
  • 缓存新内容速度:独占缓存只需要放L1就可以了,而包容性需要同时放入L2,所以比较慢

1.2 缓存一致性

这个是由缓存一致性协义来保证的,也就是MESI协议。

1.3 缓存访问速度

使用CPU周期来作为时间单位,在Pentium M机器上的访问速度如下:

地址同期数
寄存器小于1个周期
L1大约3个周期
L2大约14个周期
内存大约240个周期

::: Tip 访问时间大部分是浪费在线路延迟,电信号的传播其实达不到光速,要想减少线路延迟需要提高工艺,比如从14nm到7nm. :::

上表的数据看起来比较大,实际情况不会那样糟糕,原因是不是经常都不命中,而是程序的局部性原因导致大部分情况可以在L1命中。另外由于指令流水线的存在,一条指令的执行会被分解,那样一些操作如从缓存或者内存中加载数据,可以是和其他的执行过程并发进行,所以也不会加载内存数据的开销会被部分隐藏。对于写操作cpu也不会等待数据真正的进入缓存或者内存,它可能会直接将数据放入store buff这样存储器中。

2. 缓存与内存的关联关系

2.1 全相联

这种映射下,一个地址中,S部分是没有的,只有T部分和O部分。对于一个缓存行为64字节,缓存大小为4M的缓存,那么就会有65536个缓存行,仅仅通过T位的比较来确定那个缓存行,还要保证在几个cpu周期内比较完成取出数据对于硬件实现是比较困难的,如果使用直接比较器所需的晶体管数据是很大的,如果使用迭代比较器又不能满足速度的要求。所以这种映射只适合用于小容量的缓存上。 对于 L1i、L1d 和更高级别的缓存,需要采用不同的方法。能做的就是限制搜索。在最极端的限制中,每个标签都映射到一个缓存条目。计算很简单:给定具有 65,536 个条目的 4MB/64B 缓存,我们可以使用地址的第 6 位到第 21 位(16 位)直接寻址每个条目。低 6 位是缓存行的索引。

2.2 直接映射

这种直接映射缓存速度快且相对容易实现。它只需要一个比较器、一个多路复用器(在此图中有两个,标签和数据是分开的,但这不是设计的硬性要求),以及一些仅选择有效缓存行内容的逻辑。由于速度要求,比较器很复杂,但现在只有一个;因此,可以花更多的精力让它变快。这种方法的真正复杂性在于多路复用器。简单多路复用器中的晶体管数量随 O(log N) 增长,其中 N 是高速缓存行的数量。这是可以容忍的,但可能会变慢,在这种情况下,可以通过在多路复用器中的晶体管上花费更多空间来并行化一些工作并提高速度,从而提高速度。 随着高速缓存大小的增加,晶体管的总数会缓慢增长,这使得该解决方案非常有吸引力。 但它有一个缺点:只有当程序使用的地址相对于用于直接映射的位均匀分布时,它才能很好地工作。如果不是(通常是这种情况),一些缓存条目会被大量使用,因此会被反复驱逐,而其他缓存条目几乎不会被使用或保持为空。

2.3 组相联

这个可以解决直接相联的缺点,这个问题可以通过使缓存集关联来解决。标签和数据存储被分成由地址选择的集合。这类似于直接映射缓存。但是缓存中的每个设置值不是只有一个元素,而是为相同的设置值缓存少量值。并行比较所有集合成员的标签,这类似于全关联缓存的功能。

3 相联性能问题

关于相联的性能需要很细的分析和研究,这里我们一言以蔽之就是相联的方式,组相联中分多少个set,一个set中多少个way,还有每个way也就是一个cache line的大小都影响最终的性能,具体可以查引用部分的文档。

4. 附录

CPU caches


提示

欢迎评论、探讨,如果发现错误请指正。转载请注明出处! 探索者


Released under the MIT License.