笔记——Cache

本文详细探讨了Cache的起源,如何解决冯诺依曼结构的主存-CPU分离问题,阐述了Cache的局部性原理和组织结构,包括指令和数据Cache、Cache行和多层Cache。还介绍了Cache的地址映射、替换策略以及六种基本优化技术,如增大块容量、增加Cache容量、提高相联度等,以及它们对性能的影响。
摘要由CSDN通过智能技术生成

Cache出现背景

冯诺依曼结构瓶颈:主存和CPU之间的分离。
Cache是解决冯诺依曼瓶颈最广泛使用的方法之一。
2个优势:一次内存访问传送给多的数据或者更多的指令;将部分数据块或者代码存放在离CPU更近的cache中。

局部性原理

在访问完一个内存区域(指令或者数据),程序会在不久的将来(时间局部性)访问邻近的区域(空间局部性)。
在这里插入图片描述

根据这一原理,只要将CPU近期要用到的程序和数据提前存入主存中,同时也要存相邻的指令和数据。
因为代码中往往有很多循环,所以相比于数据cache,指令cache的重要性要稍低,指令cache的不命中率与数据高速缓存相比也要低很多。

引入Cache行

以单个数据作为内存和cache之间的传输单位,每次数据的加载都会有很大的开销,所以引入cache行的组织结构,它的优势在于,在cache不命中时,开销只发生在数据项第一次不命中的时候,但相邻的数据项能够以更低的延迟从cache中取出,提升命中率。
每次取一个字节:只利用时间局部性(下次再取自己才可能命中)
每次取一个cache行:利用时间和空间局部性(下次再取自己和相邻数据可命中,此部分占数据访问的绝大多数情况)

多层cache

Cache分为不同的层,第一层(L1)最小但最快,更高层Cache(L2,L3,···)更大但相对较慢。Cache通常是用来存储速度较慢的存储器中信息的副本,但是,有些多层Cache不会复制已在其他层Cache中存在的信息,对于这种Cache,L1Cache中的变量不会存储在其他层Cache,但会存储在主存中。

Cache读写操作

读:
CPU发出主存地址,首先判断该存储字是否在Cache中。若命中,直接访问Cache,将字送至CPU;若未命中,一方面要访问主存,将该字传送给CPU,与此同时,将字所在主存块装入Cache,若已满,执行替换算法。
写:
会引起数据一致性问题
单个Cache与内存之间的一致性问题
在这里插入图片描述
多核系统的Cache一致性问题
在多核系统中,各个核的Cache存储相同变量的副本,当一个处理器更新Cache中该变量的副本时,其他处理理器中Cache的副本也应该更新。
方法一:监听Cache一致性协议
监听协议的想法来自于基于总线的系统:当多个核共享总线时,总线上传递的信号都能被连接到总线的所有核“看”到。因此,当核0更新它Cache中x的副本时,如果它也将这个更新信息在总线上广播,并且假如核1正在监听总线,那么它会知道x已经更新了,并将自己Cache中的X的副本标记为非法的。
关于监听,有几点必须要考虑的。第一,互连网络不一定必须是总线,只要能够支持从每个处理器广播到其他处理器。第二,监听协议能够在写直达和写回Cache上都能工作,原则上,如果互连网络可以像总线那样被Cache共享,如果是写直达Cache,那么就不需要额外的互连网络开销,因为每个核都能“ 监测”写;如果是写回Cache,那么就需要额外的通信,因为对Cache的更新不会立即发送给内存。
不幸的是,在大型网络上,广播是非常昂贵的。监听Cache-致性协议 每更新一个 变量时就需要一次广播。所以监听Cache一致性协议是不可扩展的,因为对于大型系统,它会导致性能的下降,在互连网络间的广播相对于访问局部内存是相当慢的。
方法二:基于目录的Cache一致性协议
基于目录的Cache一致性协议通过使用一 个叫做目录( directory)的数据结构来解决上面的问题。目录存储每个内存行的状态。一般地, 这个数据结构是分布式的,每个核/内存对负责存储一部分的目录。这部分目录标识局部内存对应高速缓存行的状态。因此,当一个高速缓存行被读入时,如核0的Cache,与这个高速缓存行相对应的目录项就会更新,表示核0有这个行的副本。当一个变量需要更新时,就会查询目录,并将所有包含该变量高速缓存行置为非法。显然目录需要大量额外的存储空间,但是,当一个Cahe变量更新时,只需要与存储这个变量的核交涉(对应的部分目录在这个核上)。

Cache的地址映射

Cache的容量很小,它保存的内容只是主存内容的一个子集,且Cache与主存的数据交换是以块为单位的。为了把信息放到Cache中,必须应用某种函数把主存地址定位到Cache中,这称为地址映射。在信息按这种映射关系装入Cache后,CPU执行程序时,会将程序中的主存地址变换成Cache地址,这个变换过程叫做地址变换。
1、全相联映射:全相联映射允许主存中每一个字块映射到Cache中任何一块位置
在这里插入图片描述
主存字块标记t+c位,Cache标记增多,并且访问Cache时主存字块标记需要和Cache中的全部标记位进行比较(一般使用相联存储器)。
优点:方式灵活,命中率更高,缩小了块冲突率。
缺点: 逻辑电路多,成本高。与直接映射相比,主存字块标记的位数变成了t+c位,进行比较的比较器位数增加。需和Cache中全部标记进行比较才能判断所访问地址内容是否已经在Cache中。

2、直接映射:
在这里插入图片描述

Cache的标记:主存字块标记(t位)、有效位、脏位(写回)
当Cache收到来自CPU的贮存地址后,只需要根据中间c位确定Cache字块,然后根据其标记是否与主存的高t位相符来判断。
优点:实现简单。
缺点:不够灵活,每个主存块只能固定的对应某个缓存块,即使缓存内还空着许多位置也不能占用,使缓存的存储空间得不到充分的利用(叫冲突缺失)。此外,如果程序恰好要重复访问对应同一缓存位置的不同主存块,就要不停的进行替换,而且降低命中率(Cache颠簸)。

3、组相联映射:
在这里插入图片描述
利用主存字块标记字段来检查组中所有块,而组地址用来选择组,字块内地址是块内期望数据的地址。
主存中的某一字块可以映射到Cache某组中的任一字块
主存中的第j块与Cache第i组为一一映射关系,主存第j块可以映射到Cache第i组中任意一块。

Cache组相联结构举例

在这里插入图片描述
在cache中的数据是以cache line为单位组织的,一条cache line对应于内存中一个连续的字节块。这个cache使用了64字节的cache line。这些cache line被保存在cache bank中,也叫way。每一个way都有一个专门的目录(directory)用来保存一些登记信息。你可以把每一个way连同它的目录想象成电子表格中的一列,而表的一行构成了cache的一个set。列中的每一个单元(cell)都含有一条cache line,由与之对应的目录单元跟踪管理。图中的cache有64 组、每组8路,因此有512个含有缓存线的单元,合计32KB的存储空间。

作者:yuwh_507
链接:https://www.jianshu.com/p/2b51b981fcaf
來源:简书

Cache的替换策略

替换问题与Cache的组织方式紧密相关:对直接映射Cache来说,只要把此可用位置上的主存块换出Cache即可;对全相联和组相联Cache来说,要从若干个可用位置中选取一个位置,把其中的主存块换出Cache。
1、先进先出(FIFO)算法
FIFO算法选择最早调入Cache的字块进行替换,它不需要记录各字块的使用情况,比较容易实现,开销小,但没有根据访存的局部性原理,故不能提高Cache的命中率。
2、近期最少使用(LRU)算法
LRU(Least Recently Used)算法是把CPU近期最少使用的块替换出去。这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。每块也设置一个计数器,Cache每命中一次,命中块计数器清零,其他各块计数器增1。当需要替换时,将计数值最大的块换出。(要比从零计数,访问加一,替换计数值最小的要好,保护最新调入的块)
LRU算法相对合理,但实现起来比较复杂,系统开销较大。这种算法保护了刚调入Cache的新数据块,具有较高的命中率。LRU算法不能肯定调出去的块近期不会再被使用,所以这种替换算法不能算作最合理、最优秀的算法。但是研究表明,采用这种算法可使Cache的命中率达到90%左右。
3、随机替换
最简单的替换算法是随机替换。随机替换算法完全不管Cache的情况,简单地根据一个随机数选择一块替换出去。随机替换算法在硬件上容易实现,且速度也比前两种算法快。缺点则是降低了命中率和Cache工作效率。

六种基本的Cache优化

对于存储层次结构的评价方法:
平均存储器访问时间=命中时间+缺失率 * 缺失代价
把6种Cache 的优化策略归结为以下三类:
降低缺失率∶增大块容量,增大Cache 容量,增加相联度。
减少缺失代价∶多级Cache,读缺失优先于写。
减少 Cache命中时间∶避免索引 Cache 时的地址转换。

3C缺失模型:
强制缺失∶对一个块的第一次访问一定不在Cache中,所以该块必须被调人到Cache 中。这也称为冷启动缺失或是首次访问缺失。
容量缺失∶如果Cache容纳不了一个程序执行所需要的所有块,将会发生容量缺失(还会发生强制缺失),某些块将被丢弃,随后再被调人。
冲突缺失∶如果块替换策略是组相联或是直接映射的,并且有太多的块被映射到同一组中,则某一个块被放弃,之后重新再调入,这时就发生了冲突缺失(另外还有强制缺失和容量缺失)。这也称为碰撞缺失或干涉缺失。也即在全相联Cache中命中,却在n路组相联Cache中缺失,这是由于对某些组块数的要求越过了n。
● 第一种优化技术∶增加块容量来降低缺失率
最简单降低缺失率的方法是增加块容量。增加块容量会降低强制缺失率。这是由于局部性原理有两个组成部分时间局部性和空间局部性。增加块容量利用了空间局部性原理。
更大的块也增加了缺失代价。因为它减少了Cache中的块数,所以更大的块可能会导致冲突缺失,而且如果Cache容量较小时,甚至会有容量缺失。缺失代价的增加可能会抵消缺失率的降低。
在所有这些技术中,Cache的设计者都在尽力使缺失率和缺失代价达到最小。块容量的选择取决于较低层存储器的时延和带宽∶在高时延和高带宽存储器中,较大容量的块更有效,因为这样在每次缺失时,Cache可以获得更多的字节,而缺失代价只有少量的增加。相反,低时延和低带宽的存储器希望块容量小一些,因为较大的块并不能节省多少时间。
● 第二种优化技术∶增加 Cache 容量来降低缺失率
降低容量缺失率最直接的方法就是增加Cache 的容量。但这样做的结果将使得Cache命中时间延长,开销增大。这种技术在片外的 Cache 中常常采用。
● 第三种优化技术∶增加相联度来降低缺失率
两条一般性经验规律:
第一条规律是∶ 从应用角度看,8路组相联和相同容量的全相联Cache 在降低缺失率方面同样有效。
第二条规律是:2∶1 Cache 经验规律——就是容量为N的直接映射Cache与容量为N/2的2路组相联的Cache 有几乎相同的缺失率。正是基于此,Cache 的容量一般少于128KB。
增加块容量虽会降低缺失率,但会增加缺失代价。
● 第四种优化技术∶使用多级 Cache 来降低缺失代价
通过在原来的Cache和存储器之间增加一级Cache,就可以同时优化Cache的性能并增大容量。第一级Cache可以小到足以与快速的处理器运行时钟周期时间相匹配;而第二级 Cache 能够大到足以捕捉到对内存进行的大多数访问,从而有效地减小了缺失代价。
考虑二级Cache 的参数:
1、首先需要确定的是二级Cache的容量。因为一级Cache中的所有信息都可能会出现在二级Cache 中,因此,二级Cache 应该比一级Cache大得多。如果二级Cache只是稍微大一点,局部缺失率会很高。
2、设计二级Cache为组相联,可以减少二级Cache 的缺失率,降低缺失代价。
3、另一级Cache中的数据是否都包含在二级Cache中。
多级包含:存储器层次结构的自然属性,即一级Cache的数据总是包含在二级Cache 中。这是我们期望的,因为这样I/O 和Cache 之间(或者是在多处理器的Cache 之间)的一致性,就能够仅仅通过检查二级Cache来确定。其缺点是容量较小的一级Cache要用较小的块,而容量较大的二级Cache要用较大的块。在这种情况下,为了保持这种包含关系,在二级Cache 缺失时要做很多工作。当二级Cache中块被替换出去时,要使一级Cache中与这些块有映射关系的块无效,这将导致一级 Cache 的缺失率略微升高。
多级独占∶一级Cache中的数据都不在二级Cache 中再现。典型的多级独占Cache 中,一级 Cache 的缺失只会使一级Cache 和二级Cache中的块发生交换,而不会用二级Cache中的块替换一级Cache中的块。这种方法防止了二级 Cache空间浪费。
所有Cache设计的本质都是在加快命中和减少缺失间进行折中。二级 Cache相对于一级Cache 有较低的命中数,因此,重点放在减少缺失次数方面,即选用大容量 Cache以及采用降低缺失率的技术,如选择较高相联度和较大的块容量。
● 第五种优化技术:确定读缺失对写的优先级来降低缺失代价
对于一个写直达Cache,最重要的改进是设置容量适中的写缓存。然而,因为写缓存中可能包含读缺失时所需的更新数据,这将导致存储器访问变得更复杂。解决这个问题最简单的方法就是读缺失等待,直到写缓存为空为止。另外一个方案是在读缺失时查看写缓存的内容,如果没有冲突且存储器系统可以访问,就让读缺失继续。实际上,所有的桌面处理器和服务器都采用了后一种方法,使读缺失优先于写缺失。
● 第六种优化技术∶在Cache 索引过程中避免地址转换来减少命中时间

基本Cache优化总结
在这里插入图片描述
("+“表示该技术改善相应特性,”_"表示该技术会对相应特性有不利影响,空白表示没有影响。存储层次结构复杂度是主观定义的,0表示最简单,3表示最复杂)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值