5分钟读懂CPU Cache
时间:12-12
整理:3721RD
点击:
如果有人问你:啥叫CPU Cache?
咋回答?
让我们先来看看Cache与CPU的奇妙纠葛
Cache一词源自法语,其原意是“藏匿处,隐秘的地方”。Cache被应用于计算机科学之后,专指CPU与主内存之间的高速缓冲存储器。 Cache的出现是为了缓解CPU的存储需求与主内存的存取性能之间越来越大的差距。
现代CPU的Cache都是集成在片内的,越靠近CPU流水线的Cache由于需要极其快速的存取速度,只能保持越小的容量,并且单位容量的成本越高。
因此,为了进一步缓解需求与性能之间的差距,并应对不断增大的主内存,最新的CPU都采用三级Cache结构。
1
靠近CPU流水线的L1 Cache速度最快、容量最小
2
L2 Cache速度与容量都居中
3
靠近主内存的L3 Cache则是容量最大,但速度相对最慢(仍然比主内存快很多)。
4
此外,为了能使指令与数据都得到最快的响应,L1 Cache中的指令部分与数据部分是相互独立的, 分别为指令L1-I Cache与数据L1-D Cache;
而L2 Cache与L3 Cache则是将指令与数据混合存储的。
CPU存储结构示意
看到这里 你会觉得
嗯 CPU Cache大约么就是这么回事情嘛
but...如果再问你
CPU Cache的工作原理又是啥呢?
局部性原理
一般的计算机程序对存储器的访问行为,存在很大的局部性,主要分为两个方面:
时间局部性与空间局部性。
→ 时间局部性,即程序会在一个比较短的时间窗口内频繁访问同一个内存地址。
→ 空间局部性,即程序会倾向于访问一组数据或者一个数据相邻的数据。
Cache正是利用了程序访存的这两个局部性特点,将程序最常使用的指令与数据放在离CPU流水线最近的地方,以便在需要时最快地获取这部分指令与数据。
映射关系
Cache中存储的内容是主内存的一个子集,越是常用的指令与数据,越可能出现在离CPU流水线近的Cache中。
主内存中的数据按照一定的映射关系,以块(也称为行)为单位存入Cache中。这其中的映射关系决定了Cache块放置的位置。
Cache与主内存、Cache与Cache之间的映射关系,是影响Cache性能的重要因素之一。
映射关系主要分为三种:
全相联映射、直接映射与组相联映射。
→ 全相联映射
主存中的任一块可以被放置到Cache中的任意一个位置。其特点是空间利用率高,冲突概率最低,实现最复杂。
→ 直接映射
主存中的每一块只能被放置到Cache中的唯一的一个位置。其特点是空间利用率低,冲突概率最高,实现最简单。
→ 组相联映射
主存中的每一块可以被放置到Cache中的唯一的一个组中的任何一个位置。组相联映射是直接映射和全相联映射的一种折中。
→ n路组相联
如果组内有n个块,则称该缓存位置为n路组相联。相联度越高,Cache空间的利用率就越高,块冲突概率就越低,缺失率也就越低。
查找算法
针对常用的组相联映射方式,Cache块的查找是通过查找目录来实现的。
首先将物理地址从低位到高位分为三个部分:
块偏移、索引以及标志(tag)。
块偏移字段从块中选择期望数据,
其位数由块大小决定,
常用的块大小为64B,对应6bit。
索引字段选择组,
组的数量由具体设计决定,
组数确定了索引字段的位数也就确定了。
组选定后,通过对比组中
所有路的标志字段与目标物理地址的标志字段
是否一致来判断是否命中,
若命中即查找到了所需访问的指令或数据。
查找算法对应的物理地址划分
查找Cache块流程示意图
替换策略
当调入一个新块,而Cache被占满时,应该替换哪一块?
对于直接映射,只有一个块别无选择;对于全相联或组相联,则有多个块可以进行选择。
主要的替换方法有以下几种:
随机、FIFO以及LRU。
随机
顾名思义就是随机选择一个块进行替换。
FIFO
即先进先出,将最早进入Cache的块替换出去。
LRU
全称为Least Recently Used,即最近最少使用替换法,也就是将最近最少使用的块替换出去。
LRU是主流的替换算法,为了进一步降低由替换引起的缺失率,在LRU基础上又发展出很多更高级的替换算法,如NRU、MLP以及RRIP等。
写策略
写操作必须是确认在命中后才可进行。
写访问有可能会导致Cache和主存内容不一致。
两种写策略:
→ 直写(write-through):
执行写操作时,不仅写入Cache,
而且也写入下一级存储器。
→ 回写(write-back):
执行写操作时,只写入Cache,
仅当Cache中相应的块被替换时,才写回主存。
两种写策略的比较:
→ 直写(write-through):
简单易实现,所有层次都具有相同的数据,
便于维护一致性,但是写的次数较多,
对带宽需求比较大。
在进行写操作的过程中CPU必须等待。
→ 回写(write-back):
在往主存写时,将多次合为一次。
降低了写主存的次数,降低了带宽,节省功耗,
但需要额外添加一个修改位。
写入分配的比较:
→ 写入分配(Allocate):
写miss时,先把所写单元所在的块调入Cache,
再进行写操作。能够将多次写合为一次,且写与读相似。
→ 无写入分配( No-allocate ):
写miss时,直接写入下一级存储器而不调入Cache。
节省了Cache的空间。
块的粒度
如果块太大,那么块的数目会变少,写操作和读操作会有许多无用的数据,占据带宽较大,功耗大。
相反如果块太小,会导致未完全利用空间局域性,并使用更多的Tag,逻辑消耗大。
块大小与命中率的关系
好啦 关于CPU Cache的碎碎念就到这里
相信以你的聪(xia)明(la)才(su)智(du)
一定分分钟看完啦
要是5分钟没看完....
点击下方"阅读原文"
可至专业IC教育平台「E课网」官网涨知识
咋回答?
让我们先来看看Cache与CPU的奇妙纠葛
Cache一词源自法语,其原意是“藏匿处,隐秘的地方”。Cache被应用于计算机科学之后,专指CPU与主内存之间的高速缓冲存储器。 Cache的出现是为了缓解CPU的存储需求与主内存的存取性能之间越来越大的差距。
现代CPU的Cache都是集成在片内的,越靠近CPU流水线的Cache由于需要极其快速的存取速度,只能保持越小的容量,并且单位容量的成本越高。
因此,为了进一步缓解需求与性能之间的差距,并应对不断增大的主内存,最新的CPU都采用三级Cache结构。
1
靠近CPU流水线的L1 Cache速度最快、容量最小
2
L2 Cache速度与容量都居中
3
靠近主内存的L3 Cache则是容量最大,但速度相对最慢(仍然比主内存快很多)。
4
此外,为了能使指令与数据都得到最快的响应,L1 Cache中的指令部分与数据部分是相互独立的, 分别为指令L1-I Cache与数据L1-D Cache;
而L2 Cache与L3 Cache则是将指令与数据混合存储的。
CPU存储结构示意
看到这里 你会觉得
嗯 CPU Cache大约么就是这么回事情嘛
but...如果再问你
CPU Cache的工作原理又是啥呢?
局部性原理
一般的计算机程序对存储器的访问行为,存在很大的局部性,主要分为两个方面:
时间局部性与空间局部性。
→ 时间局部性,即程序会在一个比较短的时间窗口内频繁访问同一个内存地址。
→ 空间局部性,即程序会倾向于访问一组数据或者一个数据相邻的数据。
Cache正是利用了程序访存的这两个局部性特点,将程序最常使用的指令与数据放在离CPU流水线最近的地方,以便在需要时最快地获取这部分指令与数据。
映射关系
Cache中存储的内容是主内存的一个子集,越是常用的指令与数据,越可能出现在离CPU流水线近的Cache中。
主内存中的数据按照一定的映射关系,以块(也称为行)为单位存入Cache中。这其中的映射关系决定了Cache块放置的位置。
Cache与主内存、Cache与Cache之间的映射关系,是影响Cache性能的重要因素之一。
映射关系主要分为三种:
全相联映射、直接映射与组相联映射。
→ 全相联映射
主存中的任一块可以被放置到Cache中的任意一个位置。其特点是空间利用率高,冲突概率最低,实现最复杂。
→ 直接映射
主存中的每一块只能被放置到Cache中的唯一的一个位置。其特点是空间利用率低,冲突概率最高,实现最简单。
→ 组相联映射
主存中的每一块可以被放置到Cache中的唯一的一个组中的任何一个位置。组相联映射是直接映射和全相联映射的一种折中。
→ n路组相联
如果组内有n个块,则称该缓存位置为n路组相联。相联度越高,Cache空间的利用率就越高,块冲突概率就越低,缺失率也就越低。
查找算法
针对常用的组相联映射方式,Cache块的查找是通过查找目录来实现的。
首先将物理地址从低位到高位分为三个部分:
块偏移、索引以及标志(tag)。
块偏移字段从块中选择期望数据,
其位数由块大小决定,
常用的块大小为64B,对应6bit。
索引字段选择组,
组的数量由具体设计决定,
组数确定了索引字段的位数也就确定了。
组选定后,通过对比组中
所有路的标志字段与目标物理地址的标志字段
是否一致来判断是否命中,
若命中即查找到了所需访问的指令或数据。
查找算法对应的物理地址划分
查找Cache块流程示意图
替换策略
当调入一个新块,而Cache被占满时,应该替换哪一块?
对于直接映射,只有一个块别无选择;对于全相联或组相联,则有多个块可以进行选择。
主要的替换方法有以下几种:
随机、FIFO以及LRU。
随机
顾名思义就是随机选择一个块进行替换。
FIFO
即先进先出,将最早进入Cache的块替换出去。
LRU
全称为Least Recently Used,即最近最少使用替换法,也就是将最近最少使用的块替换出去。
LRU是主流的替换算法,为了进一步降低由替换引起的缺失率,在LRU基础上又发展出很多更高级的替换算法,如NRU、MLP以及RRIP等。
写策略
写操作必须是确认在命中后才可进行。
写访问有可能会导致Cache和主存内容不一致。
两种写策略:
→ 直写(write-through):
执行写操作时,不仅写入Cache,
而且也写入下一级存储器。
→ 回写(write-back):
执行写操作时,只写入Cache,
仅当Cache中相应的块被替换时,才写回主存。
两种写策略的比较:
→ 直写(write-through):
简单易实现,所有层次都具有相同的数据,
便于维护一致性,但是写的次数较多,
对带宽需求比较大。
在进行写操作的过程中CPU必须等待。
→ 回写(write-back):
在往主存写时,将多次合为一次。
降低了写主存的次数,降低了带宽,节省功耗,
但需要额外添加一个修改位。
写入分配的比较:
→ 写入分配(Allocate):
写miss时,先把所写单元所在的块调入Cache,
再进行写操作。能够将多次写合为一次,且写与读相似。
→ 无写入分配( No-allocate ):
写miss时,直接写入下一级存储器而不调入Cache。
节省了Cache的空间。
块的粒度
如果块太大,那么块的数目会变少,写操作和读操作会有许多无用的数据,占据带宽较大,功耗大。
相反如果块太小,会导致未完全利用空间局域性,并使用更多的Tag,逻辑消耗大。
块大小与命中率的关系
好啦 关于CPU Cache的碎碎念就到这里
相信以你的聪(xia)明(la)才(su)智(du)
一定分分钟看完啦
要是5分钟没看完....
点击下方"阅读原文"
可至专业IC教育平台「E课网」官网涨知识