微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 5分钟读懂CPU Cache

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课网」官网涨知识

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top