缓存应用与系统性能

多级缓存

多层缓存结构或多级缓存是指一种内存体系结构,它使用基于不同的缓存数据访问速度的内存存储层次结构。高度请求的数据缓存在高速存取存储器中,允许中央处理单元 (CPU) 内核更快地访问。

多级缓存结构是内存层次结构的一种形式和一部分,可以认为是分层存储的一种形式。 这种设计旨在让 CPU 内核能够更快地处理,尽管主内存访问存在内存延迟。当 CPU 等待数据时,访问主内存可能成为 CPU 内核性能的瓶颈,而使所有主内存都使用高速,可能会非常昂贵。高速缓存是一种折衷方案,允许高速访问 CPU 最常用的数据,从而实现更快的 CPU 时钟。

多级缓存

为每条指令执行访问主存储器可能会导致处理缓慢,时钟速度取决于查找和获取数据所需的时间。为了向处理器隐藏这种内存延迟,使用了数据缓存。每当处理器需要数据时,它就会从主内存中获取并存储在称为缓存的较小内存结构中。如果进一步需要该数据,则在进入主内存之前首先搜索缓存。 就相对于主存储器搜索和获取数据所花费的时间而言,这种结构更靠近处理器。

平均访问时间 (AAT)

使用缓存的优势可以通过计算有缓存和没有缓存的内存层次结构的平均访问时间 (AAT) 来。
缓存的大小很小,可能会导致频繁的未命中——当缓存的搜索没有提供所需的信息时——导致调用主内存以获取数据。因此,AAT 受到它从中搜索数据的每个结构的未命中率的影响。

AAT = 命中时间 + 未命中率 * 未命中存取时间
主存储器的 AAT 由命中时间主存储器给出。缓存的 AAT 可以由下式给出

Hit timecache +(Miss ratecache × Miss Penaltytime 在丢失缓存后进入主存所花费的时间)。

缓存的命中时间小于主存的命中时间,因此当通过缓存而不是主存访问数据时,用于数据检索的 AAT 显着降低。

权衡

虽然使用缓存可能会改善内存存取延迟,但由于缓存的组织和搜索方式,它可能并不总是导致获取数据所花费的时间所需的改进。例如,相同大小的直接映射缓存,通常比完全关联的缓存具有更高的未命中率。这也可能取决于测试处理器的计算机的基准和指令模式。但是使用完全关联的缓存可能会导致更多的功耗,因为它每次都必须搜索整个缓存。因此,功耗(和相关热量)和缓存大小之间的权衡在缓存设计中变得至关重要。

演化

从CPU 上的寄存器和 L1 缓存到 L2、L3到主存储器,其内存大小逐渐增加。
CPU查找特定地址内容,首先查L1,再查L2,然后是L3;最后是主存储器。
在缓存未命中的情况下,使用这种结构的目的将变得毫无用处,计算机将不得不进入主内存以获取所需的数据。
对于多级缓存,如果CPU在最靠近处理器的缓存(一级缓存或 L1)未能找到需要的数据,它将搜索下一个最近的缓存级别,仅在所有的缓存中,都没有需要的数据,才进入主内存。
一般的实践是,保持 L1 缓存较小,并与处理器保持 1-2 个 CPU 时钟周期的距离,较低级别的缓存增加大小,以存储比 L1 更多的数据,因此距离更远但未命中率更低。这会产生更好的 AAT。

性能提升

借助允许在单个芯片上容纳内存系统的技术扩展,大多数现代处理器具有多达三个或四个缓存级别。通过这个例子可以理解 AAT 的减少,其中计算机检查 AAT 的不同配置,最高可达 L3 缓存。

示例:主存储器 = 50 ns,

  • L1 = 1 ns,未命中率为 20%
  • L2 = 5 ns,未命中率为 10%
  • L3 = 10 ns,未命中率为 5%。

无缓存,AAT = 50 ns
L1 缓存,AAT = 1 ns + (0.2 × 50 ns) = 11 ns
L1–2 缓存,AAT = 1 ns + (0.2 × [5 ns + (0.1 × 50 ns)]) = 3 ns
L1–3 缓存,AAT = 1 ns + (0.2 × [5 ns + (0.1 × [10 ns + (0.05 × 50 ns)])]) = 2.25 ns

指令缓存,数据缓存与统一的缓存

指令缓存用于缓存机器指令;数据缓存用于缓存执行指令所需要的数据;而统一的缓存既缓存指令,又缓存数据。

指令缓存/数据缓存

在程序运行时,

统一的缓存

在进程期间,处理器访问 L1 高速缓存(或与其与处理器的连接相关的最高级别高速缓存)以检索指令和数据。要求同时执行这两个操作,需要多个端口和统一缓存中的更多访问时间。拥有多个端口需要额外的硬件和布线,从而导致明显的缓存和处理单元之间的结构。 为避免这种情况,L1 缓存通常被组织成一个组缓存,这会导致更少的端口、更少的硬件和通常更短的访问时间。

现代处理器具有拆分缓存,并且在具有多级缓存的系统中,更高级别的缓存可能会统一,而较低级别的缓存可能会分开。

包容策略

内存系统图显示 L2 中的 L1 副本和 L3 中的 L2 副本。
包含缓存组织
存在于较高缓存层中的块是否也可以存在于较低缓存层中取决于内存系统的包含策略,该策略可以是包含性、独占性或非包含性非独占性 (NINE)。

使用包含策略,上级缓存中存在的所有块也必须存在于下级缓存中。每个上级缓存组件都是下级缓存组件的子集。在这种情况下,由于存在重复的块,因此存在一些内存浪费。但是,检查速度更快。

在排他策略下,所有缓存层次结构组件都是完全排他的,因此上层缓存中的任何元素都不会出现在任何下层缓存组件中。这实现了高速缓存存储器的完全使用。但是,内存访问延迟很高。 [26]

上述政策需要遵循一套规则才能实施。如果这些都不是强制的,则由此产生的包含策略称为非包容性非排他性 (NINE)。这意味着上层缓存可能存在也可能不存在于下层缓存中。

缓存写策略

在写过程中,如何更新缓存,有两种策略,即:直写和回写。

直写策略

在直写策略的情况下,每当缓存块的值发生变化时,它也会改变较低级别的内存。 此策略可确保在整个层次结构中写入数据时,安全地存储数据。

回写策略

在回写策略的情况下,只有当修改的缓存块被释放时,更改的缓存块才会在较低级别的层次结构中更新。一个“脏位”附加到每个缓存块,并在缓存块被修改时设置。 在释放时,设置了脏位的块将被写入较低级别的层次结构。在此策略下,存在数据丢失的风险,因为最近更改的数据副本仅存储在缓存中,因此必须遵守一些纠正技术。

分配,不分配策略

如果写入的字节不在缓存中,字节可能会被带到缓存中,这由写入分配或写入不分配策略决定。 写分配策略规定,在写未命中的情况下,该块在写入之前,从主内存中取出并放入缓存中。
写入不分配策略,在写未命中的情况下,它将写入较低级别的内存层次结构,而不会将该块提取到缓存中。

共享缓存与私有缓存

私有缓存被分配给处理器中的一个特定内核,并且不能被任何其他内核访问。在某些架构中,每个内核都有自己的私有缓存;这会在系统缓存架构中产生重复块的风险,从而导致容量利用率降低。然而,多层缓存架构中的这种设计选择也有利于降低数据访问延迟。

共享缓存是可以被多个内核访问的缓存。 由于它是共享的,缓存中的每个块都是唯一的,因此不会有重复的块,因此具有更高的命中率。然而,随着多个内核尝试访问同一个缓存,数据访问延迟会增加。

在多核处理器中,使缓存共享或私有的设计选择会影响处理器的性能。 在实践中,上层缓存 L1(或有时 L2)实现为私有,而下层缓存实现为共享。这种设计为高级缓存提供了高访问率,为低级缓存提供了低未命中率。

缓存一致性

在计算机体系结构中,缓存一致性是,最终存储在多个本地缓存中的共享资源数据的一致性。当系统中的客户端维护公共内存资源的缓存时,不连贯的数据可能会出现问题,尤其是多处理系统中的 CPU 的情况。

考虑两个客户端都具有来自先前读取的特定内存块的缓存副本。假设底部的客户端更新/更改该内存块,顶部的客户端可能会留下无效的内存缓存,而不会收到任何更改通知。缓存一致性旨在通过维护多个缓存中数据值的一致性视图来管理此类冲突。

在每个处理器都有一个单独的高速缓存的共享内存多处理器系统中,可能有许多共享数据的副本:一份在主内存中,一份在请求它的每个处理器的本地高速缓存中。当其中一个数据副本发生更改时,其他副本必须反映该更改。缓存一致性是确保共享操作数(数据)值的变化及时传播到整个系统的学科。

以下是缓存一致性的要求:

写传播
对任何缓存中数据的更改,必须传播到对等缓存中的其他副本(该缓存行的)。
事务序列化
所有处理器都必须以相同的顺序看到对单个内存位置的读/写。
理论上,一致性可以在加载/存储粒度上执行。然而,在实践中它通常是在缓存块的粒度上执行的。

连贯性定义了对单个地址位置的读取和写入行为。

在不同的高速缓存内存中,同时出现的一种数据称为高速缓存一致性,或在某些系统中称为全局内存。

在多处理器系统中,考虑多个处理器缓存了内存位置 X 的副本。以下条件是实现缓存一致性的必要条件:

  • 在处理器 P 对位置 X 的读操作中,在同一处理器 P 对 X 的写操作之后,在 P 执行的写和读指令之间没有发生另一个处理器对 X 的写操作,X 必须始终返回值P写的
  • 在处理器 P1 对位置 X 的读操作中,在另一个处理器 P2 对 X 的写操作之后,在两次访问之间没有任何处理器对 X 进行其他写操作,并且读和写操作充分分离,X 必须始终返回 P2 写入的值。这个条件定义了记忆的连贯观的概念。将写入传播到共享内存位置可确保所有缓存都具有一致的内存视图。如果处理器 P1 读取 X 的旧值,即使在 P2 写入之后,我们也可以说内存是不连贯的。

上述条件满足缓存一致性所需的写入传播标准。但是,它们还不够,因为它们不满足事务序列化条件。为了更好地说明这一点,请考虑以下示例:

多处理器系统由四个处理器组成——P1、P2、P3 和 P4,所有处理器都包含初始值为 0 的共享变量 S 的缓存副本。处理器 P1 将 S 的值(在其缓存副本中)更改为 10,然后处理器 P2 将自己缓存副本中的 S 值更改为 20。如果我们确保仅写入传播,那么 P3 和 P4 肯定会看到 P1 和 P2 对 S 所做的更改。但是,P3 可能会在看到 P2 所做的更改后看到 P1 所做的更改,因此在读取到 S 时返回 10。另一方面,P4 可能会看到 P1 和 P2 所做更改的顺序,因此读取 S 时返回 20。处理器 P3 和 P4 现在对内存的看法不一致。

因此,为了满足事务序列化,从而实现缓存一致性,必须满足以下条件以及本节中提到的前两个条件:

  • 必须对同一位置的写入进行排序。换句话说,如果位置 X 接收到两个不同的值 A 和 B,按照这个顺序,来自任何两个处理器,处理器永远不能将位置 X 读取为 B,然后将其读取为 A。必须看到位置 X 具有值 A 和 B按那个顺序。

一致性系统的另一种定义是通过顺序一致性内存模型的定义:“缓存一致性系统必须以尊重每个线程的程序顺序的总顺序执行所有线程的加载和存储到单个内存位置” 。因此,缓存一致系统和顺序一致系统之间的唯一区别在于定义所讨论的地址位置的数量(高速缓存一致系统的单个内存位置,以及顺序一致系统的所有内存位置)。

另一个定义是:“如果对同一内存位置的所有写入都以某种顺序执行,则多处理器是缓存一致的”。

很少,但特别是在算法中,连贯性可以指代参考的位置。相同数据的多个副本可以同时存在于不同的缓存中,如果允许处理器自由更新自己的副本,则可能导致内存视图不一致。

一致性机制

确保一致性的两种最常见机制是窥探和基于目录,每种机制都有自己的优点和缺点。如果有足够的带宽可用,基于侦听的协议往往会更快,因为所有事务都是所有处理器看到的请求/响应。缺点是窥探是不可扩展的。每个请求都必须广播到系统中的所有节点,这意味着随着系统变大,(逻辑或物理)总线的大小及其提供的带宽必须增加。另一方面,目录往往具有更长的延迟(具有 3 跳请求/转发/响应),但由于消息是点对点而不是广播,因此使用的带宽要少得多。出于这个原因,许多较大的系统(> 64 个处理器)使用这种类型的缓存一致性。

窥探

窥探是在 1983 年首次引入的,监听是一个过程,其中各个缓存监视地址线以访问它们已缓存的内存位置。 写无效协议和写更新协议利用了这种机制。
对于监听机制,监听过滤器通过维护多个条目来减少监听流量,每个条目代表可能由一个或多个节点拥有的缓存线。当需要替换条目之一时,监听过滤器选择表示由最少节点拥有的一个或多个高速缓存线的条目进行替换,如从每个条目中的存在向量确定的。如果最少的节点拥有多个缓存行,则使用时间或其他类型的算法来优化选择。

基于目录

在基于目录的系统中,共享的数据放置在一个公共目录中,该目录维护缓存之间的一致性。该目录充当过滤器,处理器必须通过它请求许可才能将条目从主内存加载到其缓存。当一个条目被改变时,该目录要么使用该条目更新其他缓存,要么使其他缓存失效。
分布式共享内存系统模仿这些机制,试图在松散耦合系统中保持内存块之间的一致性。

一致性协议

一致性协议在多处理器系统中应用缓存一致性。目的是两个客户端绝不能看到相同共享数据的不同值。

协议必须实现一致性的基本要求。它可以为目标系统或应用程序量身定制。

协议也可以归类为窥探或基于目录的。通常,早期系统使用基于目录的协议,其中目录将跟踪共享的数据和共享者。在史努比协议中,事务请求(读取、写入或升级)被发送到所有处理器。所有处理器都会监听请求并做出适当的响应。

窥探协议中的写入传播可以通过以下任一方法实现:
写无效
当观察到对缓存具有副本的位置的写入操作时,缓存控制器会使它自己的窥探内存位置副本无效,这会强制在下次访问时从主内存读取新值。
写更新
当观察到对高速缓存具有副本的位置的写入操作时,高速缓存控制器用新数据更新其自己的窥探存储器位置副本。
如果协议设计规定每当共享数据的任何副本发生更改时,所有其他副本都必须“更新”以反映更改,那么它就是写更新协议。如果设计规定任何处理器对缓存副本的写入需要其他处理器丢弃或使其缓存副本无效,则它是写入无效协议。

然而,可扩展性是广播协议的一个缺点。

已经设计了各种模型和协议来保持一致性,例如 MSI、MESI、MOSI、MOESI、MERSI、MESIF、一次写入、Synapse、Berkeley、Firefly 和 Dragon 协议。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值