每个现代处理器都有少量的高速缓存。在过去的几十年里,缓存架构变得越来越复杂:CPU 缓存水平提高到三级:,每个块的大小都在增加,缓存的相关性也发生了几次变化。但在我们深入研究细节之前,我们必须知道什么是缓存,为什么它很重要?此外,现代处理器是由 L1、L2 和 L3 缓存组成。这些缓存级别有什么区别?
系统内存高速缓存:SRAM 与 DRAM
静态(而且价格昂贵) RAM,系统内存使用缓慢 DRAM(动态 RAM)。两者的主要区别在于前者使用CMOS电容和晶体管用于技术和晶体管(每块6个)。
DRAM 为了更长时间地保留数据,需要不断刷新(由于电容泄漏)。因此,它消耗的功率要大得多,速度也要慢得多,SRAM 无需刷新,效率更高。然而,更高的价格仅限于处理器缓存。
处理器中高速缓存的重要性?

现代处理器比 80 年代和 90 年初领先几年。如今,高端消费芯片的运行频率远远超过 4GHz,而大多数 DDR4 内存模块的额定频率低于 3200MHz。因此,系统内存太慢,无法直接使用 CPU, 引入缓存内存是为了不严重减慢它们的速度。两者之间的,在某些情况下,存储小块重复使用的数据或存储这些文件的内存地址。
L1、L2 和 L3 缓存:有什么区别?
高速缓存分为三部分:L1、L2 和 L3 按大小和速度递减的顺序排列高速缓存。L3 缓存是最大和最慢的(第三代) Ryzen CPU 具有高达 64MB 的大型 L3 缓存)缓存级别。L2 和 L1 比 L3 小得多,速度快得多,每个核心都是分开的。旧处理器不包括三级 L3 缓存,系统内存直接与 L2 缓存交互:
L1缓存进一步分为两部分:后者包含CPU 前者用于保存将被写回主存储器的数据。
L1 缓存不仅用作指令缓存,还保存预解码数据和分支信息。此外,尽管 L1 数据缓存通常用作输出缓存,但 L1 指令缓存的行为类似于输入缓存。这对循环参与很有帮助,因为所需的指令就在提取单元旁边。
现代 CPU 旗舰处理器包括高达 512KB 的 L1 缓存(每个内核 64KB),服务器部件的功能几乎是后者的两倍。
但也更慢。它们在旗舰上 CPU 上为 4-8MB(每核 512KB)。每个核心都有自己的 L1 和 L2 缓存,而最后一级,L3 在芯片上的所有内核之间共享缓存。
它从 10MB 到 64MB 不同的服务器芯片多达 256MB 的 L3 缓存。此外,与竞争对手的英特尔芯片相比,AMD 的 Ryzen CPU 缓存大小更大。这是因为英特尔 MCM 设计与 Monolithic。
当 CPU 当需要数据时,它首先搜索相关核心 L1 缓存。如果找不到,下一步搜索 L2 和 L3 缓存。如果找到必要的数据,则称为。若数据不在缓存中,CPU 必须要求将其从主内存或存储加载到缓存中,这需要时间,对性能产生不利影响,称为。
一般来说,在游戏和其他对延迟敏感的工作负荷的情况下,增加缓存的大小会提高缓存命中率。
包括独家缓存
缓存配置有两种类型:。若存在于高级缓存中 (L1) 所有数据块都存在于低级缓存中 (L2) 低级缓存被称为高级缓存。
另一方面,如果较低级别的缓存只包含较高级别缓存中不存在的数据块,则表示缓存不包含较高级别的缓存。
一个有两级高速缓存 CPU。现在,假设要求一块 X。如果在 L1 如果在缓存中找到该块,则从 L1 并从缓存中读取数据 CPU 内核消耗。但是,如果块不在那里 L1 在缓存中找到,但存在于 L2 中,则将从 L2 提取并放置在缓存中 L1 中。
如果 L1 缓存已满,则从 L1 为新块腾出空间,逐出一块 L2 缓存不变。但是,如果数据块在 L1 和 L2 中都没有找到,那么它就会从内存中取出并放置在两个缓存级别中。在这种情况下,如果 L2 缓存已满,一块被逐出为新数据腾出空间,L2 缓存会向 L1 缓存发送无效请求,因此被删除的块也将从那里删除。由于此故障过程,缓存略慢于非包含或独家缓存。
现在,让我们考虑同样的例子,不包括或独家缓存。假设 CPU 核心发送对块 X 的请求。如果在 L1 中找到块 X,从这个位置读取并使用内核。但是,如果块 X 在 L1 但是在 L2 如果它存在,它就会从 L2 移动到 L1。如果 L1 没有空间,就从 L1 中驱逐块并存储 L2 中。这是 L2 缓存填充的唯一方法是作为受害者缓存。如果在 L1 或 L2 中未找到块 X,则将其从内存中取出并放置在 L1 中。
还有第三种不常用的缓存策略,叫做。这里的块既不包括也不排除更高级别的缓存。让我们考虑上一个相同的例子。有一个对块 X 请求,它在 L1 中找 CPU 内核将从 L1 读取并消耗缓存中的块。 L1 中间找不到这块,但在 L2 如果它存在,就把它从 L2 提取到 L1。L2 缓存保持不变,类似于包含缓存的工作方法。
但是,如果没有在任何缓存级别中找到该块,则该块将从主内存中提取并放置 L1 和 L2 然而,如果这导致了从 L2 与包含缓存不同,逐出一块 L1 缓存不会失效,从那里清除相同的块。
内存映射概览
抛开缓存的基本解释,我们来谈谈系统内存是如何与缓存内存对话的。。高速缓冲存储器分为块或组。这些块依次分为 n 个 64 字节线。系统内存与缓存相同量的块(集),然后将两者链接起来。
如果有 1GB 的系统 RAM,那么缓存将被分成 8,192 行,然后分成块。这称为。对于 2 路关联高速缓存,每个块包含 2 行,4 路包括 4 行,8 路为 8 行,16 路为 16 行。如果总 RAM 大小为 1GB,则内存中的每个块的大小为 512 KB。
如果有 512 KB 的 4 路关联缓存,则 RAM 将分为 2,048 个块(1GB 为 8192/4)并链接到相同数量的 4 行缓存块。
与 16 路关联缓存的方式相同,缓存分为 512 个块,链接到内存中的 512 (2048 KB) 块,每个缓存块包含 16 行。当缓存用完数据块时,缓存控制器重新加载一组具有所需数据的新块,以继续处理器执行。
N路关联缓存是最常用的映射方法。还有两种称为直接映射和完全关联映射的方法。在前者中,缓存行和内存之间存在硬链接,而在后者的情况下,缓存可以包含任何内存地址。基本上,每一行都可以访问任何主内存块。这种方法的命中率最高。然而,它的实施成本很高,因此芯片制造商大多避免这样做。
完全关联的映射
哪种映射最好?
,但同时也是效率最低的。例如,如果 CPU 请求给定的内存地址(在这种情况下为 1,000),控制器将从内存中加载 64 字节的行并将其存储在缓存中(1,000 到 1,063)。将来,如果 CPU 需要来自相同地址或紧随其后的地址(1,000 到 1,063)的数据,它们将已经在缓存中。
当 CPU 需要映射到同一高速缓存行的内存块中的两个地址一个接一个时,这就会成为一个问题。例如,如果 CPU 首先请求地址 1,000,然后请求地址 2,000,则会发生缓存未命中,因为这两个地址位于同一个内存块内(块大小为 128 KB)。另一方面,映射到它的缓存行是从地址 1,000 到 1,063 的一行。因此,缓存控制器将在第一个缓存行中加载从地址 2,000 到 2,063 的行,逐出旧数据。这就是为什么直接映射缓存是效率最低的缓存映射技术并在很大程度上被放弃的原因。
内存缓存的行和 RAM 内存位置之间没有硬链接。缓存控制器可以存储任何地址。上面的问题不会发生。这种缓存映射技术效率最高,命中率最高。然而,正如已经解释过的,它是最难实施。
因此,使用了。在这里,每个内存块都链接到一组行(取决于 SA 映射的类型),并且每行都可以保存来自映射内存块中任何地址的数据。在 4 路组关联高速缓存中,内存高速缓存上的每个组最多可容纳来自同一内存块的四行。使用 16 路配置,该数字增长到 16。
当映射集上的插槽全部用完时,控制器驱逐其中一个插槽的内容并从同一映射内存块加载不同的数据集。增加组关联内存高速缓存的路数,例如,从 4 路增加到 8 路,每个组有更多可用的高速缓存插槽。但是,如果不增加缓存量,则每个链接内存块的内存大小都会增加。
另一方面,增加缓存大小意味着每个集合中有更多行(假设集合大小也增加)。这意味着每个内存块有更多的链接缓存行。一般来说,这会增加命中率,但它可以提高整体数字的程度是有限的。