CPU缓存

CPU缓存计算机中央处理单元(CPU)使用的硬件缓存,以降低平均成本(时间或能量)以从主内存中访问数据。缓存是一个较小,更快的内存,靠近处理器核心,该核心存储了经常使用的主要存储位置的数据副本。大多数CPU具有多个缓存级别的层次结构(L1,L2,通常是L3,并且什至很少L4),在第1级的指令特异性和数据特定的缓存中,通常使用静态随机访问记忆( CACHE MOMENE( SRAM),在现代CPU中,到目前为止,芯片区域中最大的部分,但SRAM并不总是用于所有级别(I-或D-CACHE),甚至任何级别,有时在任何级别上,有时会通过某些或所有级别来实​​现。埃德拉姆

存在其他类型的缓存(不计入上面提到的最重要的缓存的“缓存大小”),例如大多数CPU具有内存管理单元(MMU)的一部分的翻译LookAside缓冲区(TLB)。

概述

尝试从主机内存中读取或写入位置时,处理器检查该位置的数据是否已经在缓存中。如果是这样,处理器将从高速缓存中读取或写入,而不是较慢的主内存。

许多现代台式机服务器和工业CPU至少具有三个独立的caches:

指令缓存
用于加快可执行指令获取
数据缓存
用于加快数据获取和存储;数据缓存通常组织为具有更多缓存级别(L1,L2等)的层次结构;另请参见下面的多级缓存)。
翻译LookAside缓冲区(TLB)
用于加快可执行指令和数据的虚拟到物理地址翻译。可以提供单个TLB以访问指令和数据,或者可以提供单独的指令TLB(ITLB)和数据TLB(DTLB)。但是,TLB缓存是内存管理单元(MMU)的一部分,与CPU缓存无关。

历史

NextCube计算机的主板(1990)。在中间左侧的图像的下边缘处,有CPU Motorola 68040在25 MHz下运行,两个单独的1级缓存,每个缓存为4 KIB,一个用于指令,一个用于数据。板没有外部L2缓存。

CPU卡车的早期示例包括1960年代的ATLAS 2IBM System/360 Model 85 。使用缓存的第一个CPU只有一个级别的缓存。与后来的1级缓存不同,它未分为L1D(用于数据)和L1i(用于说明)。 Split L1 Cache于1976年以IBM 801 CPU开始,于1980年代后期成为主流,并于1997年以ARMV5TE进入了嵌入式CPU市场。在2015年,即使​​是税收Socs也将L1缓存分开。它们还具有L2缓存,对于较大的处理器,也有L3缓存。 L2高速缓存通常不会拆分,并且充当已经拆分的L1缓存的常见存储库。多核处理器的每个核心都有专用的L1缓存,并且通常在内核之间共享。 L2缓存和高级缓存可以在核心之间共享。 L4缓存目前不常见,通常是单独的模具或芯片上的动态随机存储器(DRAM),而不是静态随机访问存储器(SRAM)。一个例外是,当Edram用于所有级别的缓存,降低到L1时。从历史上看,L1也处於单独的模具上,但是更大的模具尺寸允许其整合以及其他缓存级别,但可能是最后一个水平。每个额外的高速缓存往往更大且优化不同。

缓存(如历史上像RAM一样)通常以: 2、4、8、16等的大小。当最早的MIB尺寸(即较大的非L1)时,图案很早就会发生故障,以允许更大的缓存而不会被迫进入大尺寸范式中,例如,EG Intel Core 2 Duo和3 Mib L2 Cache 2008年4月。这是在L1缓存的后期发生的,因为它们的尺寸通常仍然是少数KIB。但是,2012年以来的IBM ZEC12是一个例外,以便获得异常大的96 KIB L1数据缓存,例如具有96 KIB L1指令缓存的IBM Z13 (和128 KIB L1 Data Cache)和Intel Ice Lake基于Intel Ice Lake从2018年开始的处理器,具有48个KIB L1数据缓存和48个KIB L1指令缓存。在2020年,一些Intel Atom CPU(最多24个内核)具有4.5 MIB和15个MIB缓存尺寸。

缓存条目

数据以固定大小的块(称为缓存线缓存块)的块中的内存和缓存之间传输。将缓存线从内存复制到缓存时,会创建一个缓存条目。缓存条目将包括复制的数据以及请求的内存位置(称为标签)。

当处理器需要在内存中读取或写入位置时,它首先检查缓存中的相应条目。缓存检查可能包含该地址的任何缓存线中所请求的内存位置的内容。如果处理器发现内存位置位于缓存中,则会发生缓存命中。但是,如果处理器在缓存中找不到内存位置,则会发生缓存失误。在缓存命中的情况下,处理器立即读取或写入缓存线中的数据。对于缓存失误,缓存分配了一个新的条目并从主内存中复制数据,然后从缓存的内容中满足了请求。

政策

替代政策

为了为缓存失误的新条目腾出空间,缓存可能必须驱逐现有条目之一。它用来选择驱逐条目的启发式方法称为替代政策。任何替代政策的基本问题是,它必须预测将来最不可能使用哪种现有的缓存输入。预测未来是困难的,因此没有完美的方法可以在可用的各种替代政策中进行选择。一种流行的替代策略(LRU)最少替代了最近访问的条目。

通过避免很少重新访问的内存区域的缓存,将某些内存范围标记为不可碰撞可以提高性能。这避免了将某些东西加载到缓存的开销,而无需重复使用。根据上下文,也可以禁用或锁定缓存条目。

写政策

如果数据写入缓存,则在某个时候还必须将其写入主内存;本文的时机称为写策略。在写入缓存中,每个写入缓存都会导致写入主内存。另外,在写下或复制的缓存中,写入不会立即镜像到主内存,而缓存则跟踪了已写下的位置,将它们标记为。这些位置中的数据仅在从缓存中驱逐数据时才将其写回主内存。因此,在写下缓存中读取的读数可能有时可能需要两个内存访问服务:一个要首先将肮脏的位置写入主内存,然后再将其从内存读取新位置。另外,写入尚未在写下缓存中绘制的主要内存位置可能会驱逐一个已经肮脏的位置,从而为新内存位置释放了该缓存空间。

也有中间政策。缓存可能是通过写入的,但是写入可以暂时保存在商店数据队列中,因此通常可以一起处理多家商店(可以减少总线周转并改善总线利用率)。

其他实体可能会更改来自主内存的缓存数据(例如,使用直接内存访问(DMA)或多核处理器中的另一个核心的外围设备),在这种情况下,缓存中的副本可能会过时或陈旧。另外,当多处理器系统中的CPU更新缓存中的数据时,与其他CPU相关的缓存中数据的副本变为陈旧。使数据一致的高速缓存管理器之间的通信协议称为缓存相干协议。

缓存性能

在最近,存储器性能与处理器性能之间的速度差距呈指数增长,缓存性能测量已变得很重要。引入缓存是为了减少此速度差距。因此,知道缓存能够在处理器和内存速度方面弥合差距的程度变得很重要,尤其是在高性能系统中。缓存命中率和缓存率在确定此性能方面起着重要作用。为了提高高速缓存性能,降低错率成为其他步骤的必要步骤之一。减少缓存的访问时间也可以提高其性能并有助于优化。

CPU摊位

从内存中获取一条缓存线(由于缓存失误而引起的延迟)所花费的时间很重要,因为CPU在等待缓存线时会用尽工作。当CPU到达此状态时,它被称为摊位。随着与主内存相比,CPU变得更快,由于高速缓存而导致的失速会导致更多的潜在计算。现代CPU可以在从主内存中获取单个缓存线所花费的时间内执行数百个说明。

在此期间,已经采用了各种技术来保持CPU忙碌,包括在等待Cache Miss Data的指令后,CPU试图执行独立说明。许多处理器使用的另一种技术是同时进行多线程(SMT),它允许替代线程使用CPU核心,而第一个线程则等待所需的CPU资源可用。

关联

特定缓存位置可以缓存内存位置的不同方式的说明

位置策略决定在缓存中的位置将何处进行主内存的特定条目的副本。如果可以自由选择缓存中的任何条目保存副本,则该缓存称为完全关联。在另一个极端情况下,如果主内存中的每个条目只能在缓存中的一个位置进入一个位置,则直接映射缓存。许多缓存实施了一个折衷方案,其中主内存中的每个条目都可以转到缓存中的n个位置中的任何一个,并被描述为n-way set sossociative。例如, AMD ATHLON中的Level-1数据缓存是双向集合的关联,这意味着主存储器中的任何特定位置均可在Level-1数据缓存中的两个位置中的任何一个中被缓存。

选择合适的关联价值涉及权衡。如果有十个位置策略可以绘制一个内存位置的位置,则要检查该位置是否在缓存中,则必须搜索十个缓存条目。检查更多地方需要更多的功率和芯片区域,并可能更多的时间。另一方面,具有更多关联性的缓存遭受的失误较少(请参阅冲突错过),因此CPU从缓慢的主内存中浪费了更少的时间。一般指南是,从直接映射到双向或从双向到四向,将关联性加倍,对提高命中率的效果与加速尺寸的一倍相同。但是,增加的关联性超过四个并不能提高命中率,并且通常是出于其他原因(请参阅虚拟混叠)。一些CPU可以动态地降低低功率状态中其卡车的关联性,这是一种节能措施。

以更糟糕但更简单但更复杂的顺序:

  • 直接映射的缓存 - 最佳案例时间,但在最坏的情况下无法预测
  • 双向套件的关联缓存
  • 双向偏斜的关联缓存
  • 四向设置缔合缓存
  • 八向设置缔合缓存,这是以后实现的常见选择
  • 12向套件的关联缓存,类似于八路
  • 完全关联的缓存 - 最佳的失误费率,但仅适用于少数条目

直接映射的缓存

在此缓存组织中,主内存中的每个位置只能在缓存中的一个条目中进行。因此,直接映射的缓存也可以称为“单向集合关联”缓存。它没有安置政策,因为别无选择地驱逐了哪些缓存输入内容。这意味着,如果两个位置映射到同一条目,它们可能会不断地互相撞倒。尽管更简单,但直接映射的缓存需要比关联的缓存要大得多,才能提供可比的性能,并且更不可预测。令x为缓存中的块号, y为内存的块数,而n为缓存中的块数,然后在方程式x = y mod n的帮助下进行映射。

双向套件的关联缓存

如果主存储器中的每个位置都可以在缓存中的两个位置中的任何一个位置中缓存,则一个逻辑问题是:两者中的哪一个?上图右图中显示的最简单,最常用的方案是使用内存位置索引的最小显著位作为缓存内存的索引,并为每个索引有两个条目。该方案的一个好处是,存储在高速缓存中的标签不必包括高速存储器索引所暗示的主内存地址的那一部分。由于缓存标签的位较少,因此它们需要更少的晶体管,在处理器电路板或微处理器芯片上占用更少的空间,并且可以更快地读取和比较。同样, LRU算法特别简单,因为每对只需要存储一个位。

投机执行

直接映射缓存的优点之一是它允许简单而快速的猜测。计算地址后,已知可能在内存中具有该位置副本的一个缓存索引。可以读取该缓存条目,并且处理器可以在完成该数据之前继续使用该数据,以检查标签实际上与所请求的地址匹配。

在标签匹配项完成之前,让处理器使用缓存数据的想法也可以应用于关联缓存。标签的一个子集(称为提示)可用于仅选择可能的缓存条目之一映射到请求的地址。然后,提示选择的条目可以与检查完整标签并行使用。如下所述,当在地址翻译的上下文中使用时,提示技术最有效。

双向偏斜的关联缓存

已经提出了其他方案,例如偏斜的缓存,其中0的索引是直接的,如上所述,但是使用Hash函数形成了Way 1的索引。良好的哈希功能具有解决与直接映射冲突的属性,往往不会与哈希功能进行映射,因此,由于病理访问,程序遭受了出乎意料的大量冲突而遭受的可能性较小图案。缺点是计算哈希函数的额外延迟。此外,当要加载新线路并驱逐旧线路时,可能很难确定最近使用的现有行,因为新线路与各种方式的数据与不同索引的数据冲突;通常以每集的基础进行非旋转缓存的LRU跟踪。然而,偏斜的缔合缓存比传统的设定缔合性具有主要优势。

伪缔合缓存

真实的设置缔合缓存使用类似于内容的内存之类的东西,同时测试所有可能的方式。伪缔合性缓存一次测试每种可能的方法。 hash浏览缓存和列求解缓存是伪缔合性缓存的示例。

在常见的情况下,以第一种测试的方式找到命中率,伪缔合性缓存与直接映射的缓存一样快,但冲突率的冲突率远低于直接映射的高速缓存,接近未接近错率的速率完全关联的缓存。

多列缓存

与直接映射的缓存相比,集合的关联缓存具有减少其高速缓存索引的位数量,该索引映射到缓存集,其中多个方法或块停留,例如2个套件的关联缓存和2个块4向套件的关联缓存4个块。与直接映射的缓存相比,未使用的缓存索引位成为标签位的一部分。例如,一个2向组的关联高速缓存对标签贡献了1位,而4向组的关联缓存为标签贡献了2位。多列缓存的基本思想是使用集合索引将缓存集映射到一个常规的协会高速缓存,并使用添加的标签位在集合中以索引索引。例如,在4向组的关联缓存中,两个位分别用于索引00,方式01,路10和路11。该双缓存索引称为“主要位置映射”,其延迟等效于直接映射访问。多柱缓存设计的广泛实验表明,主要位置的命中率高达90%。如果高速缓存映射与主要位置中的缓存块发生冲突,则现有的高速缓存块将移至同一集合中的另一种缓存方式,这称为“选定位置”。由于新索引的高速缓存块是最近使用的(MRU)块,因此将其放置在多列缓存中的主要位置,并考虑到时间位置。由于多列缓存设计用于具有高关联性的缓存,因此每组中的多种方法数量很高;因此,很容易在集合中找到选定的位置。在缓存块中的主要位置维护了其他硬件的选定位置索引。

由于其较高的关联性,多列缓存仍然是高命中率,并且由于其在主要位置的命中率很高,因此具有可比直接映射缓存的低延迟。多列缓存中主要位置和选定位置的概念已用于ARM Cortex R芯片的几个缓存设计,IBM可重新配置的多路关联缓存内存和Oracle的DynamiC替换方式选择基于地址选项卡位。

缓存输入结构

缓存行条目通常具有以下结构:

标签 数据块 国旗位

数据块(缓存线)包含从主内存中获取的实际数据。该标签包含(一部分)从主内存中获取的实际数据的地址。下面讨论了国旗位。

缓存的“大小”是它可以保留的主内存数据的数量。可以将此大小计算为每个数据块中存储的字节数乘以缓存中存储的块数量。 (尽管标签,标志和错误校正代码位在大小中不包含,尽管它们确实会影响缓存的物理区域。)

与缓存线(内存块)一起进行的有效内存地址将( MSBLSB )分为标签,索引和块偏移量。

标签 指数 块偏移

该索引描述了已放入数据的缓存集。索引长度为 S缓存集的位。

块偏移指定缓存行中存储的数据块中所需的数据。通常,有效地址为字节,因此块偏移长度为位,其中b是每个数据块的字节数。该标签包含地址的最重要位,这些位置与当前集合中的所有行进行了检查(索引已检索到集合),以查看此集合是否包含请求的地址。如果确实如此,则会发生缓存。位的标签长度​​如下:

tag_length = address_length -index_length -block_offset_length

一些作者将块偏移简单地称为“偏移”或“位移”。

例子

原始的Pentium 4处理器的四向相关L1数据缓存尺寸为8 KIB ,具有64个字节缓存块。因此,有8 KIB / 64 = 128个缓存块。集合数量等于缓存块的数量除以关联方式的数量,导致128 /4 = 32集的数量,因此2 5 = 32不同的指标。有2个6 = 64个可能的偏移。由于CPU地址为32位宽,这意味着标签字段的32-5-6 = 21位。

原始的Pentium 4处理器还具有一个八个套件的关联L2集成缓存256 KIB,具有128个字节的高速缓存块。这意味着标签字段的32-8-7 = 17位。

国旗位

指令缓存每个缓存行条目中只需要一个标志位:一个有效的位。有效的位指示是否已加载了缓存块有效数据。

在电源上,硬件将所有缓存中的所有有效位设置为“无效”。某些系统在其他时间还设置了对“无效”的有效位,例如,当多主总线在一个处理器的高速缓存中窥探​​硬件时,听到了其他一些处理器的地址,并意识到本地高速缓存中的某些数据块是现在陈旧,应该被标记为无效。

数据缓存通常每个缓存线需要两个标志位 - 有效的位和一个肮脏的位。拥有一个肮脏的位集表示自从主要内存(“ dirty”)读取关联的高速缓存线已经更改了,这意味着处理器已将数据写入该行,而新值并未一直传播到主内存。

缓存小姐

缓存失败是在缓存中读取或写入一块数据的失败尝试,这导致延迟更长的主内存访问。缓存错过了三种:指令阅读错过,数据阅读失误和数据写入错过。

指令缓存中读取误解通常会导致最大的延迟,因为处理器或至少执行线程必须等待(失速),直到从主内存中获取指令为止。从数据缓存中读取的缓存读取通常会导致较小的延迟,因为可以发出不依赖缓存读取的说明并继续执行,直到从主内存返回数据为止,并且依赖指令可以恢复执行。缓存写入数据缓存通常会导致最短的延迟,因为写入可以排队,并且对后续说明的执行几乎没有限制。处理器可以继续,直到队列已满。有关错过类型的详细介绍,请参见缓存性能测量和指标

地址翻译

大多数通用CPU实现了某种形式的虚拟内存。总而言之,要幺在计算机上运行的每个程序都可以看到其自己的简化地址空间,该空间仅包含该程序的代码和数据,要幺在通用虚拟地址空间中运行的所有程序。程序通过计算,比较,阅读和写作与其虚拟地址空间的地址而不是物理地址空间的地址来执行,从而使程序更简单,因此更易于编写。

虚拟内存要求处理器将程序生成的虚拟地址转换为主内存中的物理地址。进行此翻译的处理器的部分称为内存管理单元(MMU)。通过MMU的快速路径可以执行存储在翻译lookaide buffer (TLB)中的翻译,该翻译是从操作系统的页面表,片段表或两者兼而有之的映射缓存。

出于本讨论的目的,地址翻译的三个重要特征:

  • 延迟:物理地址可以从MMU的某个时间(也许是几个周期)获得,此后可从地址生成器获得虚拟地址。
  • 混信:多个虚拟地址可以映射到单个物理地址。大多数处理器保证对该单个物理地址的所有更新都将按程序顺序进行。为了提供该保证,处理器必须确保在任何给定时间中只有一个物理地址的一个副本位于缓存中。
  • 粒度:虚拟地址空间分为页面。例如,可以将4 GIB虚拟地址空间切成1,048,576页,为4 KIB大小,每个KIB大小都可以独立映射。可能支持多个页面尺寸;请参阅虚拟记忆以进行详细记忆。

一个早期的虚拟内存系统,即IBM M44/44X ,需要在每个编程的主存储器访问中访问核心内存中保存的映射表。没有缓存,并且映射表存储器以与主内存相同的速度运行,这有效地将内存访问的速度缩短了一半。两台在主内存中使用页面表进行映射的早期机器,即IBM System/360 Model 67GE 645 ,都有一个小的关联内存作为缓存,可用于访问内存中的页面表。这两台机器都早于使用用于主内存的高速缓存的第一台机器,即IBM System/360 Model 85 ,因此计算机系统中使用的第一个硬件缓存不是数据或指令缓存,而是TLB。

根据索引或标签对应于物理或虚拟地址,可以将缓存分为四种类型:

  • 物理索引,物理标记(PIPT)缓存使用索引和标签的物理地址。尽管这很简单,并且避免了混叠问题,但它也很慢,因为必须查找物理地址(可能涉及TLB失误并访问主内存),然后才能在缓存中查找该地址。
  • 实际上是索引的,几乎是标记(VIVT)缓存,使用索引和标签的虚拟地址。此缓存方案可能会导致查找更快,因为不需要首先咨询MMU即可确定给定虚拟地址的物理地址。但是,Vivt遇到了混杂问题,其中几个不同的虚拟地址可能指的是相同的物理地址。结果是,尽管指的是相同的内存,但仍会单独缓存此类地址,从而导致相干性问题。尽管存在解决此问题的解决方案,但它们对标准连贯协议不起作用。另一个问题是同音词,其中相同的虚拟地址映射到几个不同的物理地址。不可能仅通过查看虚拟索引本身来区分这些映射,尽管潜在解决方案包括:在上下文开关后冲洗缓存,强迫地址空间不重叠,用地址空间ID(ASID)标记虚拟地址(ASID) )。此外,存在一个问题,即虚拟到物理映射可以改变,这需要潮红线路线,因为VAS不再有效。如果标签使用物理地址(VIPT),则所有这些问题都是不存在的。
  • 实际上是索引,物理标记的(vipt)缓存使用标签中的索引和物理地址的虚拟地址。比PIPT的优势是较低的延迟,因为高速缓存线可以与TLB翻译并行查找,但是在物理地址可用之前,不能比较标签。比VIVT的优势在于,由于标签具有物理地址,因此缓存可以检测谐声。从理论上讲,vipt需要更多的标签位,因为虚拟地址和物理地址之间的某些索引位可能有所不同(例如,在4 KIB页面上的位12及以上),并且必须包括在虚拟索引和物理标签中。实际上,这不是问题,因为为了避免连贯性问题,VIPT caches被设计为没有此类索引位(例如,通过限制索引的总数,块偏移到4 KIB页面为12)) ;这将VIPT缓存的大小限制为页面尺寸乘以缓存的关联性。
  • 在物理上索引,实际上标记的(PIVT)缓存通常在文献中被认为是毫无用处和不存在的。但是, MIPS R6000使用此缓存类型作为唯一已知实现。 R6000在发射器耦合的逻辑中实现,这是一种极快的技术,不适用于诸如TLB之类的大记忆。 R6000通过将TLB存储器放入芯片上具有很小的高速TLB“ slice”的第二级缓存的一部分来解决问题。缓存由从TLB切片获得的物理地址索引。但是,由于TLB切片仅翻译索引缓存所需的虚拟地址位且不使用任何标签,因此可能会发生错误的缓存命中,这可以通过使用虚拟地址进行标记来解决。

这种复发的速度(负载潜伏期)对于CPU性能至关重要,因此大多数现代级别的缓存实际上都是索引的,至少允许MMU的TLB查找可以与从缓存RAM中获取数据并行进行。

但是虚拟索引并不是所有缓存级别的最佳选择。处理虚拟别名的成本随着缓存的大小而增长,结果大多数级别2和较大的缓存都是物理索引的。

尽管虚拟标记现在不常见,但在历史上,缓存标签的虚拟和物理地址历史上都使用了虚拟和物理地址。如果TLB查找可以在缓存RAM查找之前完成,则可以及时使用物理地址进行标签比较,并且无需虚拟标记。因此,大型卡车往往会被物理标记,并且实际上只有很小的,非常低的延迟缓存。在最近的通用CPU中,如下所述,虚拟标记已被Vhints取代。

同义词和同义词问题

依赖虚拟索引和标记的缓存在将相同的虚拟地址映射到不同的物理地址(同型)之后,可以不一致,该地址可以通过使用物理地址进行标记或将地址空间标识符存储在高速缓存线中。但是,后一种方法无助于解决同义词问题,其中几个缓存线最终会为同一物理地址存储数据。写入此类位置可能仅更新缓存中的一个位置,而其他位置则留出不一致的数据。可以通过在不同地址空间使用非重叠的内存布局来解决此问题,或者在映射更改时,必须刷新缓存(或部分)。

虚拟标签和Vhints

虚拟标签的最大优势是,对于关联缓存,它们允许在虚拟到物理翻译完成之前进行标签匹配。但是,连贯的探针和驱逐提出了一个物理地址。该硬件必须具有将物理地址转换为缓存索引的一些方法,通常是通过存储物理标签和虚拟标签。为了进行比较,物理标记的缓存不需要保留虚拟标签,这更简单。当从TLB中删除虚拟到物理映射时,将必须以某种方式将带有这些虚拟地址的缓存条目进行冲洗。另外,如果在未由TLB映射的页面上允许使用缓存条目,则在页面表中更改这些页面的访问权限时,这些条目将必须冲洗。

操作系统也有可能确保没有虚拟别名同时居住在缓存中。操作系统通过执行页面着色来提供此保证,如下所述。一些早期的RISC处理器(SPARC,RS/6000)采用了这种方法。它最近没有使用,因为检测和驱逐虚拟别名的硬件成本已经下降,并且软件复杂性和完美页面着色的惩罚已经上升。

在关联缓存中区分标签的两个函数可能很有用:它们用于确定要选择的条目设置的方式,并用于确定缓存是否命中或错过。第二个功能必须始终是正确的,但是第一个功能可以猜测并偶尔获得错误的答案。

一些处理器(例如早期SPARC)具有带有虚拟和物理标签的缓存。虚拟标签用于选择方法,并且物理标签用于确定命中或错过。这种缓存享有几乎标记的缓存的延迟优势,以及物理标记的缓存的简单软件接口。但是,它具有重复标签的增加成本。同样,在错过的处理过程中,必须探究“缓存线”索引的替代方法,以探测虚拟别名和任何驱逐的匹配项。

可以通过在每个缓存输入而不是虚拟标签的情况下保持虚拟提示来减轻额外的区域(和某些延迟)。这些提示是虚拟标签的子集或哈希,并用于选择从中获取数据和物理标签的缓存方式。就像虚拟标记的缓存一样,可能会有一个虚拟提示匹配,但是物理标签不匹配,在这种情况下,必须驱逐带有匹配提示的缓存条目,以便在此地址处的高速缓存填充后的高速缓存访​​问只有一个提示匹配。由于虚拟提示比虚拟标签彼此区分的虚拟标签少,因此实际上暗示的高速缓存比实际上标记的缓存更大的冲突错过了。

也许在五角星4(Willamette和Northwood Cores)中可以找到虚拟提示的最终减少。在这些处理器中,虚拟提示实际上是两个位,并且缓存是四向集的关联。有效地,硬件从虚拟地址到高速缓存索引可保持一个简单的排列,因此选择正确的四种方式之一,不需要内容添加的内存(CAM)。

页面着色

大型物理索引的缓存(通常是次要缓存)遇到了一个问题:操作系统而不是应用程序中页面上页面相互碰撞的应用程序控制。从一个程序到下一个程序的页面分配差异会导致缓存碰撞模式的差异,这可能会导致程序性能差异很大。这些差异可能会使基准运行的一致时机保持一致且可重复的时机非常困难。

要了解问题,请考虑使用1个MIB物理索引的直接映射2级缓存和4 KIB虚拟内存页面的CPU。顺序物理页面映射到缓存中的顺序位置,直到256页后,模式包裹着。我们可以用0-255的颜色标记每个物理页面,以表示在缓存中可以使用的位置。具有不同颜色的物理页面内的位置不会在缓存中发生冲突。

试图最大程度地使用缓存的程序员可以安排其程序的访问模式,以便在任何给定时间只需缓存1个MIB数据,从而避免容量失误。但是他们还应确保访问模式没有冲突。考虑此问题的一种方法是将程序使用的虚拟页面分配,并以与物理颜色分配给物理页面相同的方式分配虚拟颜色。然后,程序员可以安排其代码的访问模式,以便同时使用具有相同虚拟颜色的两个页面。有关于这种优化的广泛文献(例如循环巢优化),主要来自高性能计算(HPC)社区。

障碍是,尽管在任何给定时刻使用的所有页面都可能具有不同的虚拟颜色,但有些可能具有相同的物理颜色。实际上,如果操作系统将物理页面分配给虚拟页面,则将某些页面具有相同的物理颜色,然后这些页面的位置将在缓存中碰撞(这是生日悖论)。

解决方案是让操作系统尝试将不同的物理色页分配给不同的虚拟颜色,这是一种称为页面着色的技术。尽管从虚拟到物理颜色的实际映射与系统性能无关,但奇数映射很难跟踪且没有好处,因此大多数页面着色方法都可以使物理和虚拟页面颜色保持相同。

如果操作系统可以保证每个物理页面映射仅为一个虚拟颜色,则没有虚拟别名,并且处理器可以使用几乎索引的库,而无需在错过处理过程中额外的虚拟别名探针。另外,OS可以在从一种虚拟颜色更改为另一种的一个虚拟颜色时从缓存中汇总一个页面。如上所述,这种方法用于一些早期的SPARC和RS/6000设计。

软件页面着色技术已被用来有效地对多核心处理器中的共享最后一个级别缓存(LLC)进行分区。英特尔已经采用了多功能处理器中基于操作系统的LLC管理。

现代处理器中的缓存层次结构

AMD推土机服务器的内存层次结构

现代处理器具有多个片上片上的相互作用。特定缓存的操作可以通过缓存大小,缓存块大小,集合中的块数,缓存集替换策略和缓存写入策略(写入或写入或写入)完全指定。

虽然特定缓存中的所有缓存块都是相同的大小,并且具有相同的关联性,但通常“下层”缓存(称为1级缓存)具有较小数量的块,较小的块大小,而块中的块较少设置,但访问时间很短。 “高级”缓存(即2级及以上)具有越来越多的块,更大的块大小,集合中的块更多,并且访问时间相对较长,但仍然比主内存快得多。

缓存输入替换策略由已选择由处理器设计人员选择实现的缓存算法确定。在某些情况下,为不同类型的工作负载提供了多种算法。

专门的缓存

管道CPU访问存储器从管道中的多个点:指令获取,虚拟到物理地址翻译和数据获取(请参阅经典RISC管道)。自然设计是为每个点使用不同的物理缓存,以便不必安排一个物理资源来为管道中的两个点提供服务。因此,管道自然而然地以至少三个单独的缓存(指令, TLB和数据)结束,每个缓存都专门针对其特​​定作用。

受害者缓存

受害者缓存是一个缓存,用于固定在更换时从CPU缓存中驱逐的块。受害者缓存位于主要缓存及其补充路径之间,并且仅保存从主要缓存中驱逐的数据块。受害者缓存通常是完全关联的,旨在减少冲突错过的数量。许多常用的程序不需要所有访问的关联映射。实际上,程序的记忆访问只有一小部分需要高关联性。受害者缓存仅通过向这些访问提供高度关联来利用此属性。它是由诺曼·乔皮(Norman Jouppi)从1990年12月介绍的。

Haswell处理器的Intel Crystalwell变体引入了包装128 MIB EDRAM 4级缓存,该缓存是处理器3级高速缓存的受害者缓存。在Skylake微体系结构中,第4级缓存不再是受害者缓存。

跟踪缓存

缓存专业化的最极端示例之一是在Intel Pentium 4微处理器中发现的跟踪缓存(也称为执行跟踪缓存)。痕量缓存是通过存储已经被获取和解码的指令的痕迹来增加指令获取带宽和降低功耗的机制。

跟踪缓存解码后或退休后存储指令。通常,添加指令以在代表单个基本块或动态指令轨迹的组中跟踪缓存。 Pentium 4的Trace Cache存储了由解码X86指令产生的微功能,还提供了微操作缓存的功能。这样,下次需要指令时,不必再次将其解码为微型操作。

写入合并缓存(WCC)

写入合并缓存是一个特殊的缓存,它是AMD推土机微体系结构中L2缓存的一部分。模块中两个L1D缓存的商店都经过WCC,并在那里被缓冲和合并。 WCC的任务是将写入数量减少到L2缓存。

微型操作(μop或UOP)缓存

微型操作缓存μop缓存UOP缓存UC )是一种专门的缓存,可存储解码说明的微功能,直接从指令解码器或指令缓存中获得。当需要解码指令时,将检查μOP缓存的解码形式,该形式被重新使用,如果被缓存。如果不可用,则指令将解码然后缓存。

将μOP缓存描述为英特尔P6处理器家族的替代前端的早期作品之一是2001年纸质“微操作缓存:可变指令长度ISA的电源意识前端” 。后来,英特尔在其沙质桥处理器中包括μop缓存以及连续的微体系结构中,例如Ivy BridgeHaswell 。 AMD在其Zen微体系结构中实现了μOP缓存。

提取完整的预述指令无需重复将可变长度复杂指令解码为更简单的固定长度微功能,并简化了预测,获取,旋转,旋转和对齐提取的说明的过程。 μOP缓存有效地卸载了提取和解码硬件,从而减少功耗并改善了解码微操作的前端供应。 μOP缓存还通过更始终如一地向后端传递解码的微功能并消除了CPU的提取和解码逻辑中的各种瓶颈,从而提高了性能。

μOP缓存与痕量缓存具有许多相似之处,尽管μOP缓存要简单得多,从而提供了更好的功率效率。这使其更适合在电池供电设备上实施。跟踪缓存的主要缺点,导致其功率低效率,是其在缓存和重复使用动态创建的指令轨迹上决定其启发式的硬件复杂性。

分支目标指令缓存

分支目标缓存分支目标指令缓存ARM微处理器上使用的名称是一个专门的缓存,该缓存将前几个说明保存在带有分支的目的地。低功率处理器不需要正常的指令缓存,因为内存系统能够快速提供指令以满足CPU而无需提供指令。但是,这仅适用于按顺序的连续指令。仍需要几个循环才能在新地址重新启动指令获取,从而导致几个管道气泡在控制转移后。分支目标缓存为那些避免大多数分支后延迟延迟的几个周期提供指令。

这允许与传统的全日制指令缓存相比,具有小得多的缓存的全速操作。

智能缓存

SMART CACHE是由Intel开发的多个执行核心的2级3级缓存方法。

SMART CACHE共享多核处理器内核之间的实际缓存内存。与专用的每核缓存相比,当核心不需要相等的缓存空间时,总的高速缓存率降低。因此,单个核心可以使用全级别2或3级缓存,而其他核心则不活动。此外,共享的缓存使在不同执行内核之间共享内存变得更快。

多层缓存

另一个问题是缓存延迟和命中率之间的基本权衡。较大的缓存率更高,但延迟较长。为了解决这一权衡,许多计算机使用多个级别的缓存,而小快速缓存的较小速度较小,较慢的缓存。多级缓存通常通过检查最快的高速缓存,第1级L1 ),首先进行操作;如果撞击,处理器将高速进行。如果较小的缓存错过,则在访问外部内存之前,检查了下一个最快的缓存,第2级L2 ),等等。

随着主内存和最快的缓存之间的延迟差异变得更大,一些处理器已经开始利用多达三个级别的片上缓存。价格敏感的设计用它来拉动整个芯片上的整个高速缓存层次结构,但是到2010年代,一些最高表现的设计返回到具有大型芯片芯片缓存,通常在Edram中实现并安装在多芯片模块上,作为第四个缓存级别。在极少数情况下,例如在大型机CPU IBM Z15 (2019)中,Edram都实现了所有级别的L1,完全替换了SRAM (对于Cache,SRAM仍用于寄存器)。基于ARM的Apple M1为四个高性能核心中的每一个都有192 KIB L1 CACHE,这非常大。但是,这四个高效核心只有128 KIB。

L3和L4缓存的好处取决于应用程序的访问模式。结合L3和L4缓存的产品的示例包括以下内容:

最后,在内存层次结构的另一端,可以将CPU寄存器文件本身视为系统中最小,最快的缓存,并具有安排在软件中的特殊特征,该特征是由编译器分配给寄存器,因为它可以分配寄存器来保留寄存器以持有例如,从主内存中检索的值,例如,循环巢优化。但是,随着寄存器的重命名,大多数编译器寄存器分配是通过运行时将硬件动态重新分配到注册库中的,从而使CPU可以打破错误的数据依赖关系,从而缓解管道危害。

寄存器文件有时也具有层次结构: Cray-1 (大约1976年)有八个地址“ A​​”和八个标量数据“ S”寄存器,通常是可用的。还有一组64个地址“ B”和64个标量数据“ t”寄存器,这些寄存器需要更长的时间才能访问,但比主内存更快。提供了“ B”和“ T”寄存器,因为Cray-1没有数据缓存。 (但是,Cray-1确实有指令缓存。)

多核芯片

在考虑具有多个内核的芯片时,存在一个问题,即是否应共享卡车或与每个核心进行本地化。实施共享的缓存不可避免地会引入更多的接线和复杂性。但是,随着每个芯片而不是核心的一个缓存大大减少了所需的空间量,因此可以包括较大的缓存。

通常,共享L1缓存是不希望的,因为延迟的增加会使每个核心运行速度都比单核芯片慢得多。但是,对于最高级别的缓存,最后一个在访问内存之前调用了最后一个,因此需要有多种原因,例如允许单个核心使用整个缓存,从线程共享缓存的数据,并降低使用的缓存相干协议的复杂性。例如,一个具有三个级别的八核芯片可能包括每个核心的L1缓存,一个中间的L2高速缓存,每对核心以及所有内核之间共享一个L3缓存。

在访问内存之前,共享最高级别的缓存通常称为最后一个级别的缓存(LLC)。当多个内核之间共享LLC时,还使用其他技术来提高并行性水平,包括将其切成多个零件,这些片段正在解决某些内存地址范围,并且可以独立访问。

单独与统一

在单独的缓存结构中,指令和数据分别缓存,这意味着缓存线用于缓存指令或数据,但并非两者兼而有之。通过单独的数据和指令翻译lookaSide缓冲液证明了各种好处。在统一的结构中,该约束不存在,并且缓存线可用于缓存指令和数据。

独家与包容性

多层缓存推出了新的设计决策。例如,在某些处理器中,L1缓存中的所有数据也必须在L2缓存中。这些缓存被称为严格包容性。其他处理器(例如AMD ATHLON )具有独家的缓存:保证数据最多是L1和L2缓存中的一个,从来没有两者。还有其他处理器(例如Intel Pentium IIIII4 )不需要L1高速缓存中的数据也位于L2缓存中,尽管它通常可以这样做。此中间政策没有普遍接受的名称;两个通用名称为“非排他性”和“部分包含”。

独家缓存的优点是它们存储了更多数据。当独有的L1高速缓存与L2高速缓存相当时,该优势就会更大,并且如果L2高速缓存比L1 Cache大的倍,则会减小。当L1错过访问时L2击中时,L2中的命中式缓存线与L1中的一条线交换。这种交换不仅要将一行从L2复制到L1,这是一个包容性的缓存所做的要多得多。

严格包容性缓存的一个优点是,当多处理器系统中的外部设备或其他处理器希望从处理器中删除缓存线时,它们只需要处理器检查L2缓存即可。在不强制包含包含的缓存层次结构中,也必须检查L1缓存。作为一个缺点,L1和L2缓存之间的关联性之间存在相关性:如果L2高速缓存至少没有所有L1缓存的方式,则限制L1缓存的有效关联性。包容性缓存的另一个缺点是,每当在L2缓存中驱逐时,L1中的(可能)相应的线也必须被驱逐以保持包容性。这是相当多的工作,并且会导致L1较高的失误。

包容性缓存的另一个优点是,较大的高速缓存可以使用较大的缓存线,从而降低了次级缓存标签的大小。 (独家缓存要求两个缓存具有相同大小的高速缓存线,因此可以将缓存线换在L1失误上,l2命中。)如果次级缓存是比主要的数量级大的数量级,并且缓存数据是一个比缓存标签大的数量级,保存的此标签区域可以与存储L1缓存数据存储在L2中所需的增量区域相提并论。

ScratchPad内存

ScratchPad内存(SPM),也称为ScratchPad,ScratchPad RAM或计算机术语中的本地商店,是一种高速内存,用于临时存储计算,数据和其他正在进行的工作。

示例:K8

为了说明专业化和多级缓存,这是AMD Athlon 64 CPU中K8核心的缓存层次结构。

AMD Athlon 64 CPU中K8核心的缓存层次结构

K8有四个专门的缓存:指令缓存,指令TLB ,数据TLB和一个数据缓存。这些缓存中的每一个都是专业的:

  • 指令缓存保留了64个字节线的副本,并获取每个周期的16个字节。此缓存中的每个字节都存储在十个位而不是8位,其中额外的位标记了指令的边界(这是预编码的一个示例)。缓存仅具有奇偶校验保护而不是ECC ,因为奇偶校验较小,并且任何损坏的数据都可以用内存获取的新数据替换(始终具有指令的最新副本)。
  • 指令TLB保留页面表条目(PTE)的副本。每个周期的指令获取的虚拟地址通过此TLB转换为物理地址。每个条目是内存中的四个或八个字节。由于K8具有可变的页面大小,因此每个TLB都分为两个部分,一个部分保留映射4 KIB页面的PTE,一个用于保留映射4 MIB或2个MIB页面的PTE。拆分允许每个部分中的完全关联的匹配电路更简单。操作系统绘制具有不同大小PTE的虚拟地址空间的不同部分。
  • 数据TLB有两个副本,可保持相同的条目。这两个副本允许每个周期两个数据访问将虚拟地址转换为物理地址。像指令TLB一样,此TLB分为两种条目。
  • 数据缓存保留了64个字节的内存线的副本。它分为8个银行(每个存储8 KIB数据),只要这些数据在不同的银行中,每个周期就可以获取两个8字节数据。标签有两个副本,因为每条64个字节线都在所有八家银行之间传播。每个标签副本都处理每个周期的两个访问之一。

K8还具有多层缓存。有第二级指令和数据TLB,它们仅存储PTES映射4 KIB。指令和数据缓存以及各种TLB都可以从大型统一的L2缓存中填充。该缓存是L1指令和数据缓存的独特之处,这意味着任何8字节线只能在L1指令缓存之一,L1数据缓存或L2缓存中。但是,数据缓存中的一条线可能具有一个也是TLB之一中的PTE,当操作系统更新时,操作系统负责通过冲洗部分来保持TLBS相干。

K8还缓存了从未存储在内存中的信息 - 预测信息。这些缓存在上图中未显示。与此类CPU相同,K8具有相当复杂的分支预测,其表有助于预测是否占用分支,并且可以预测分支和跳跃目标的其他表。其中一些信息与指令有关,在1级指令缓存和统一的辅助缓存中。

K8使用一个有趣的技巧来存储辅助缓存中指令的预测信息。次级缓存中的线受到ECC还是平等性的偶然数据损坏(例如Alpha粒子打击)的偶然数据损坏,具体取决于这些线是从数据还是从数据中驱逐的主要caches。由于奇偶校代码所需的位比ECC代码少,因此指令缓存的行有一些备用位。这些位用于缓存与这些说明关联的分支预测信息。最终结果是分支预测器具有更大的有效历史表,因此具有更好的准确性。

更多层次结构

其他处理器具有其他类型的预测变量(例如,在DEC Alpha 21264中的商店到负载旁路预测变量),并且在未来的处理器中可能会蓬勃发展。

这些预测因素是缓存,因为它们存储了计算昂贵的信息。讨论预测因子时使用的某些术语与缓存相同(一个在分支预测因子中的命中),但通常不认为预测因子是缓存层次结构的一部分。

K8将指令和数据缓存在硬件中保持一致,这意味着在商店指令之后,商店紧密地进入指令将改变以下说明。其他处理器,例如Alpha和MIPS家族的处理器,都依靠软件来保持指令缓存相干。在程序调用操作系统设施以确保连贯性之前,不能保证商店出现在指令流中。

标签公羊

在计算机工程中,使用标签RAM来指定当前在CPU缓存中存储哪些可能的内存位置。对于简单,直接映射的设计,可以使用快速SRAM 。较高的关联缓存通常采用可添加内容的内存

执行

缓存读取是最常见的CPU操作,它需要超过一个周期。程序执行时间往往对级别1数据缓存命中的延迟非常敏感。大量的设计工作以及通常的电源和矽区域都在花费,从而使缓存尽可能快。

最简单的缓存是虚拟索引的直接映射缓存。虚拟地址是用加法器计算的,该地址是提取的地址的相关部分,用于索引SRAM,返回加载数据。数据字节在字节变速杆中对齐,从那里绕过下一个操作。无需在内部循环中进行任何标签检查 - 实际上,这些标签甚至不需要读取。稍后,在管道中,但是在退休加载指令之前,必须读取加载数据的标签,并针对虚拟地址进行检查,以确保有缓存命中率。在错过时,使用请求的缓存线更新了缓存,并重新启动管道。

关联缓存更为复杂,因为必须读取某种形式的标签以确定要选择的缓存条目。 n向设置 - 缔合级别1个缓存通常并行读取所有n可能的标签和n个数据,然后选择与匹配标签关联的数据。级别2缓存有时通过首先读取标签来节省电源,因此只有一个数据元素从数据SRAM中读取。

读取2路关联缓存的路径

相邻图旨在阐明使用地址的各个字段的方式。地址位31是最重要的,位0最不重要。该图显示了4 KIB的SRAM,索引和多路复用,其中有4 KIB,2向设置求和,几乎是索引和几乎标记为64个字节(B)行,一个32位读取宽度和32位读取的虚拟地址。

由于缓存为4 kiB并且具有64 B行,因此缓存中只有64行,我们一次从一个带有32行的标签SRAM读取了两条线,每个行都有21位标签。尽管虚拟地址位31至6的任何功能都可以用来索引标签和数据SRAM,但最简单的使用最不重要的位是最简单的。

同样,由于缓存为4 KIB并且具有4 B读取路径,并且可以读取每种访问的两种方式,因此数据SRAM为512行乘8个字节宽。

一个更现代的缓存可能是16 KIB,四向设置缔合性,几乎是索引,几乎暗示和物理标记,具有32 B行,32位读取宽度和36位物理地址。此类缓存的读取路径复发看起来与上面的路径非常相似。 Vhints读取并与虚拟地址的子集进行匹配,而不是标签。稍后,在管道中,虚拟地址通过TLB翻译成一个物理地址,并且读取物理标签(仅一个,因为Vhint提供了用于阅读的缓存方式)。最后,将物理地址与物理标签进行比较,以确定是否发生了命中。

一些SPARC设计通过将虚拟地址加法器崩溃到SRAM解码器中,从而提高了L1缓存的速度。请参阅汇总解码器

历史

缓存技术的早期历史与虚拟内存的发明和使用密切相关。由于半导体记忆的稀缺性和成本,1960年代的早期大型机计算机使用了复杂的物理内存层次结构,并映射到程序使用的平坦虚拟内存空间上。内存技术将跨越半导体,磁芯,鼓和盘。程序所看到和使用的虚拟内存将是平坦的,并且在处理器访问之前,将使用缓存将数据和说明用于最快的内存。进行了广泛的研究以优化缓存尺寸。发现最佳值在很大程度上取决于Algol使用的编程语言,需要最小的和Fortran和Cobol,需要最大的缓存尺寸。

在微型计算机技术的早期,内存访问仅比注册访问稍慢一些。但是自1980年代以来,处理器和内存之间的性能差距一直在增长。微处理器的进步速度快得多,尤其是在其工作频率方面,因此内存成为了性能瓶颈。尽管从技术上讲,所有主要内存都可以像CPU一样快,但已经采取了更经济可行的道路:使用大量的低速记忆,但也引入了一个小的高速缓存内存来减轻性能差距。这提供了一个数量级的能力(以相同的价格),仅略微降低了综合性能。

第一个TLB实现

TLB的第一个记录用途是在GE 645IBM 360/67上,两者都将关联存储器用作TLB。

第一个指令缓存

CDC 6600上的第一个记录使用指令缓存的使用。

第一个数据缓存

数据缓存的第一个记录使用是在IBM System/360 Model 85上。

在68K微处理器中

68010于1982年发行,具有“循环模式”,可以将其视为一个小的特殊案例指令缓存,该缓存加速了仅包含两个指令的循环。 68020于1984年发布,用典型的指令缓存为256个字节,这是第一个68k系列处理器,它具有True On-Chip Cache内存。

1987年发布的68030基本上是一个68020核心,具有额外的256字节数据缓存,一个片上存储器管理单元(MMU),过程收缩,并为缓存增加了突发模式。 68040于1990年发布,分别分配了四个千字节的数据缓存。 68060于1994年发行,具有以下内容:8 KIB数据缓存(四方关联),8 KIB指令缓存(四向关联),96字节FIFO指令缓冲区,256-Entry Branch Cache和64-Entry地址翻译缓存MMU缓冲区(四向关联)。

在X86微处理器中

带有I386微处理器(33 MHz),64 KIB CACHE(25 ns; 8芯片左下角)的主板示例,2个MIB DRAM(70 NS;高速缓存的8个SIMM )和一个缓存控制器( Austek A38202 ;在处理器的右侧)

随着X86微处理器在386中达到20 MHz及以上的时钟速率,在系统中开始出现少量快速缓存存储器以提高性能。这是因为用于主内存的DRAM具有明显的潜伏期,最大120 ns以及刷新周期。该缓存是由更昂贵但更快的SRAM存储单元构建的,当时的SRAM存储单元的潜伏期约为10-25 ns。早期缓存是处理器外部的,通常以八个或九个浸入设备的形式位于主板上,以将缓存作为可选的额外或升级功能。

英特尔386处理器的某些版本可以支持16至256 KIB的外部缓存。

使用486处理器,将8 KIB缓存直接集成到CPU模具中。该缓存称为1级或L1缓存,以将其与较慢的母板或2级(L2)缓存区分开。这些母板的缓存要大得多,最常见的尺寸为256 KIB。有一些系统板,其中包含Intel 485 Turbocache Daughtercard的插座,其均具有64或128 KBYTE的缓存内存。在奔腾MMX时代一直持续过母板缓存的流行,但由于引入SDRAM以及公交时钟速率和CPU时钟速率之间的差异而使其越来越多,这导致室内板缓存的速度仅比主内存快一些。

X86微处理器中高速缓存实现的下一个开发始于Pentium Pro ,该过程将辅助缓存带到与微处理器相同的包装上,该软件是与微处理器相同的频率。

由于AMD K6-2AMD K6-III处理器仍然使用了插座7 ,因此在母板上的caches持续了很长时间,英特尔先前使用了插座7。 K6-III包括256个KIB ON-DIE L2 CACHE,并利用了板上的缓存作为第三级高速缓存,名为L3(生产了2个MIB的板载缓存的主板)。插座7过时后,X86系统中消失了母板缓存。

在引入多个处理器核心时,首先再次使用三级缓存,其中L3缓存被添加到CPU模具中。在较新的处理器几代中,总的高速缓存尺寸越来越大,最近(截至2011年)找到3级高速缓存尺寸的数十兆字节并不少见。

英特尔Haswell Microharchitecture一起引入了4级的包装缓存。 Crystalwell Haswell CPU,配备了Intel Intel的Iris Pro图形的GT3E变体,实际上在同一软件包上具有128 MIB的嵌入式DRAM( EDRAM )。该L4缓存在ON-DIE GPU和CPU之间动态共享,并充当CPU L3缓存的受害者缓存

在手臂微处理器中

Apple M1 CPU具有每个核心的128或192 KIB指令L1 CACHE(对于延迟/单线程性能很重要),具体取决于核心类型。对于任何CPU类型(不仅针对笔记本电脑),这是一个异常大的L1缓存;对于笔记本电脑来说,总缓存存储器大小并不异常大(对于吞吐量而言更重要),并且在IBM的大型机中提供了更大的总(例如L3或L4)尺寸。

目前的研究

早期缓存设计完全集中在缓存和RAM的直接成本以及平均执行速度上。最近的缓存设计还考虑了能源效率,容错性和其他目标。

计算机建筑师有几种工具可帮助探索缓存周期,能源和区域之间的权衡。仙人掌缓存模拟器和SimpleScalar指令集模拟器是两个开源选项。

多端口缓存

多端口缓存是一个缓存,一次可以提供多个请求。访问传统缓存时,我们通常使用单个内存地址,而在多端口的缓存中,我们可以一次请求n个地址 - n是通过处理器和缓存连接的端口数。这样做的好处是,管道的处理器可以从其管道中的不同阶段访问内存。另一个好处是,它允许通过不同的缓存级别概念超级量表处理器。

也可以看看