0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

小编科普一下超标量处理器中的Cache

安芯教育科技 来源:极术社区 2023-01-08 10:56 次阅读

超标量处理器中,Cache和分支预测会直接影响着性能,分支预测的内容将在其它博文中介绍,本文重点关注超标量处理器中的Cache。

Cache之所以存在,是因为存储器的速度远远滞后于处理器的速度,人们观察到在计算机的世界中,存在如下的两个现象:

时间相关性(temporal locality):如果一个数据现在被访问了,那么以后很有可能也会被访问;

空间相关性(spatial locally):如果一个数据现在被访问了,那么它周围的数据在以后可能也会被访问;

处理器中的各种cache示意如图1所示,现代超标量处理器都是哈佛结构,为了增加流水线的执行效率,L1 Cache一般都包括两个物理的存在,指令Cache(I-Cache)和数据Cache(D-Cache),本质上两者是一样的,I-Cache只会发生读情况,D-Cahce既可以读也可以写,所以更复杂点,L1 Cach紧密耦合在处理器的流水线中,主打功能就是求快。

L2通常是指令和数据共享,它和处理器的速度不必保持同样,可以容忍慢点,它存在的主要意义是尽量保存更多的内容,即求全。

在L1 Cache miss的情况下,会去访问L2 Cache,加入L2 Cache在缺失时去访问物理内存(一般是DRAM),这个访问时间很长,因此要尽可能地提高L2 Cache的命中率。

L1 Cache和L2 Cache是和处理器联系最紧密的,通常采用SRAM实现。物理主存Main memory通常是采用DRAM实现的。

再往下就是硬盘(Disk)和闪存(Flash)。层层嵌套,CPU拥有存储器相当于硬盘的大小和SRAM的速度。

L1 Cache和L2 Cache通常和处理器是在一块实现的。

在SoC中,主存和处理器之间通过总线SYSBUS连接起来。

b7dbd840-8e80-11ed-bfe3-dac502259ad0.png 

图1 处理器中的各种Cache

Cache主要由两部分组成,Tag部分和Data部分。因为Cache是利用了程序中的相关性,一个被访问的数据,它本身和它周围的数据在最近都有可能被访问,因此Data部分就是用来保存一片连续地址的数据,而Tag部分则是存储着这片连续地址的公共地址,一个Tag和它对应的所有数据Data组成一行称为Cache line,而Cache line中的数据部分成为数据块(Cache data block,也称做Cache block或Data block)。

如果一个数据可以存储在Cache的多个地方,这些被同一个地址找到的多个Cache line称为Cache set。

以上关系如图2所示。

b7f90960-8e80-11ed-bfe3-dac502259ad0.png

图2 Cache的结构

图2中只表示了一种可能的实现方式,在实际当中,Cache有三种主要的实现方式,直接映射(direct-mapped)Cache,组相连(set-associative)Cache和全相连(full-associative)Cache,实现原理如图3所示。

对于物理内存(physical memory)中的一个数据来说,如果在Cache中只有一个地方可以容纳它,它就是直接映射的Cache;如果Cache中有多个地方可以放置这个数据,它就是组相连的Cache;如果Cache中任何的地方都可以放置这个数据,那么它就是全相连的Cache。可以看出,直接映射和全相连映射这两种结构的Cache实际上是组相连Cache的两种特殊情况,现代处理器中的Cache一般属于上述三种方式的一种,例如TLB和Victim Cache多采用全相连结构,而普通的I-Cache和D-Cache则采用组相连结构等。

b81645f2-8e80-11ed-bfe3-dac502259ad0.png

图3 Cache的三种实现方式

1. Cache的组成方式

1.1 直接映射

直接映射结构的Cache是最容易实现的一种方式,处理器访问存储器的地址会被分为三部分:Tag、Index和Block Offset。

如图4所示,使用Index来从Cache中找到一个对应的Cacheline,但是所有Index相同的地址都会寻址到这个Cacheline,因此在Cacheline中还有Tag部分,用来和地址中的Tag进行比较,只有它们相等才表明这个Cacheline就是想要的那个。

在一个Cacheline中有很多数据,通过存储器地址中的Block Offset部分可以找到真正想要的数据,它可以定位到每个字节。

在Cacheline中还有一个有效位(Valid),用来标记这个Cacheline是否保存着有效的数据,只有在之前被访问过的存储器地址,它的数据才会存在于对应的Cacheline中,相应的有效位也会被置为1。

直接映射有个缺点,就是对于所有Index相同的存储器地址,都会寻址到同一个Cacheline,如果两个Index部分相同的存储器地址交互地访问Cache,就会一直导致Cache缺失,严重地降低了处理器的执行效率。

b839446c-8e80-11ed-bfe3-dac502259ad0.png

图4 直接映射Cache

1.2 组相连

组相连的方式是为了解决直接映射结构Cache的不足而提出的,存储器中的一个数据不单单只能放在一个Cacheline中,而是可以放在多个Cacheline中,对于一个组相连结构的Cache来说,如果一个数据可以放在n个位置,则称这个Cache是n路组相连的Cache(n way set-associative Cache),图5为一个两路组相连Cache的原理图。

b86014a2-8e80-11ed-bfe3-dac502259ad0.png

图5 2路组相连映射Cache

这种结构仍旧使用存储器地址的Index部分对Cache进行寻址,此时可以得到两个Cacheline,这两个Cacheline称为一个Cache set,究竟哪个Cacheline才是最终需要的,是根据Tag比较的结果来确定的,如果两个Cacheline的Tag比较结果都不相等,那么就说明这个存储器地址对应的数据不在Cache中,也就是发生了Cache缺失。

这种方式在实际处理器中应用最为广泛,上面提到的Tag部分和Data部分都是分开放置的,称为Tag SRAM和Data SRAM,可以同时访问这两部分。

图5所示为并行访问,如果先访问Tag SRAM部分,根据Tag比较的结果再去访问Data SRAM部分,就称为串行访问。

图6为并行访问方法的示意图,对于并行访问的结构,当某个地址的Tag部分被读取的同时,这个地址在Data部分对应的所有数据也会被读取出来,并送到一个多路选择器,这个多路选择器受到Tag部分比较结果的控制,选出对应的Data block,然后根据存储器地址中Block Offset的值,选择出合适的字节,一般将选择字节的这个过程称为数据对齐(Data Alignment)。

b86b5e98-8e80-11ed-bfe3-dac502259ad0.png

图6 并行访问Cache中的Tag和Data部分

如图7为串行访问实现方式,对于串行访问方法来说,首先对Tag SRAM进行访问,根据Tag比较的结果,就可以知道数据部分中,哪一路的数据时需要被访问的,此时可以直接访问这一路的数据,这样就不在需要图6中的多路选择器,而且,只需要访问数据部分指定的那个SRAM,其它的SRAM由于都不需要被访问,可以将它们的使能信号置为无效,这样可以节省很多功耗,当然串行访问在延迟上会更大。

b86b5e98-8e80-11ed-bfe3-dac502259ad0.png

图7 串行访问Cache中的Tag部分和Data部分

1.3 全相连

在全相连中,一个存储器地址的数据可以放在任何一个cacheline中,如图8所示,存储器地址中将不再有Index部分,而是直接在整个的Cache中进行Tag值比较,找到比较结果相等的那个Cache line,这种方式相当于直接使用存储器的内容来寻址,从存储器中找到匹配的项,这其实就是内容寻址的存储器( Content Address Memory, CAM),实际当中的处理器在使用全相连结构的Cache时,都是使用CAM来存储Tag值,使用普通的SRAM来存储数据的。

当CAM中的某一行被寻址到时,SRAM中对应的行(一般称为word line)也将会被找到,从而SRAM可以直接输出对应的数据。

b8a27ffe-8e80-11ed-bfe3-dac502259ad0.png

图8 全相连

2. Cache的写入

2.1 写通和写回

对于D-Cache来说,它的写操作和读操作有所不同,当执行一条store指令时,如果只是向D-Cache中写入数据,而并不改变它的下级存储器中的数据,这样就会导致D-Cache和下级存储器中,对于这一个地址有着不同的数据,这称作不一致(non-consistent)。

要想保持它们的一致性,最简单的方式就是当数据在写到D-Cache的同时,也写到它的下级存储器中,这种写入方式称为写通(Write Through)。

由于D-cache的下级存储器需要的访问时间相对是比较长的,而store指令在程序中出现的频率又比较高,如果每次执行store指令时,都向这样的慢速存储器中写入数据,处理器的执行效率肯定不会很高了。

如果在执行store指令时,数据被写到D-Cache后,只是将被写入的Cacheline做一个记号,并不将这个数据写到更下级的存储器中,只有当Cache中这个被标记的line要被替换时,才将它写到下级存储器中,这种方式就称为 写回(Write Back),被标记的记号在计算机术语中称为脏(dirty)状态,很显然,这种方式可以减少写慢速存储器的频率,从而获得比较好的性能。

当然,这种方式会造成D-Cache和下级存储器中有很多地址中的数据是不一致的,这会给存储器的一致性管理带来一定的负担。

2.2 Non-Write Allocate和Write Allocate

上面所讲述的情况都是假设在写D-Cache时,要写入的地址总是D-Cache中存在的,而实际当中,有可能发现这个地址并不在D-Cache中,这就发生了写缺失(write miss),此时最简单的处理方法就是将数据直接写到下级存储器中,而并不写到D-Cache中,这种方式称为Non-Write Allocate。

与之相对应的方法就是Write Allocate,在这种方法中,如果写Cache时发生了缺失,会首先从下级存储器中将这个发生缺失的地址对应的整个数据块(data block)取出来,将要写入到D-Cache中的数据合并到这个数据块中,然后将这个被修改过的数据块写到D-Cache中。

如果为了保持存储器的一致性,将这个数据块也写到下级存储器中,这种方法就是上小节说过的写通(Write Through)。

如果只是将D-Cache中对应的line标记为脏(Dirty)的状态,只有等到这个line要被替换时,才将其写回到下级存储器中,则这种方法就是前面提到的写回(Write Back)。

Write Allocate为什么在写缺失时,要先将缺失地址对应的数据块从下级存储器中读取出来,然后在合并后写到Cache中?

因为通常对于写D-Cache来说,最多也就是写入一个字,直接写入Cache的话,会造成数据块中的其它部分和下级存储器中对应的数据不一致,且是无效的,如果这个cacheline由于被替换而写回到下级存储器中时,就会使下级存储器中的正确数据被篡改。

通过上面的描述可以看出,对于D-Cache来说,一般情况下,写通(Write Through)总是配合Non-Write Allocate一起使用的,它们都是直接将数据更新到下级存储器中,这两种方法配合的工作流程如图9所示。

b8baae08-8e80-11ed-bfe3-dac502259ad0.png

图9 Write Through和Non-Write Allocate两种方法配合工作的流程图

在D-Cache中,写回(Write back)的方法和Write Allocate也是配合在一起使用的,它的工作流程如图10所示。

b90992a2-8e80-11ed-bfe3-dac502259ad0.png

图10 Write back和Write Allocate配合工作的流程图

由图10可以看出,在D-Cache中采用写回(Write back)的方法时,不管是读取还是写入时发生缺失,都需要从D-Cache中找到一个line来存放新的数据,这个被替换的line如果此时是脏(dirty)状态,那么首先需要将其中的数据写回到下级存储器中,然后才能够使用这个line存放新的数据。

也就是说,当D-Cache中被替换的line是脏的状态时,需要对下级存储器进行两次访问,首先需要将这个line中的数据写回到下级存储器,然后需要从下级存储器中读取缺失的地址对应的数据块,并将其写到刚才找到的Cache line中。

对于D-Cache来说,还需要将写入的数据也放到这个line中,并将其标记为脏的状态。

从图9和图10可以看出,采用写回和Write Allocate配合工作的方法,其设计复杂度要高于写通和Non-Write Allocate配合工作的方法,但是它可以减少写下级存储器的频率,从而使处理器获得比较好的性能。

3. Cache的替换策略

在一个Cache Set内的所有line都已经被占用的情况下,如果需要存放从下游存储器中读过来的其它地址的数据,那么就需要从其中替换一个,如何从这些有效的Cache line找到一个并替换之,这就是替换(Cache replacement)策略。本节主要介绍几种最常用的替换算法

3.1 近期最少使用法

近期最少使用法(Least Recently Used, LRU)会选择最近被使用次数最少的Cache line,因此这个算法需要追踪每个Cache line的使用情况,这需要为每个Cache line都设置一个年龄(age)部分,每次当一个Cache line被访问时,它对应的年龄部分就会增加,或者减少其它Cache line的年龄值,这样当进行替换时,年龄值最小的那个Cacheline就是被使用次数最少的了,会选择它进行替换。

图11为LRU算法的工作流程。

b93c0a34-8e80-11ed-bfe3-dac502259ad0.png

图11 LRU算法的工作流程

3.2 替换策略

在处理器中,Cache的替换算法一般都是使用硬件来实现的,因此如果做得很复杂,会影响处理器的周期时间,于是就有了随机替换(Random Replacement)的实现方法,这种方法不再需要记录每个way的年龄信息,而是随机地选择一个way进行替换,相比于LRU替换方法来说,这种方法确实的频率会更高一些,但是随着Cache容量的增大,这个差距是越来越小的。

当然,在实际的设计中很难实现严格的随机,一般采用一种称为时钟算法(Clock algorithm)的方法来实现近似的随机,它的工作原理本质上就是一个计数器,这个计数器一直在运转,例如每周期加1,计数器的宽度由Cache的相关度,也就是way的个数来决定,例如一个八路组相连的结构的Cache,则计数器的宽度需要三位,每次当Cache中的某个line需要被替换时,就会访问这个计数器,使用计数器当前的值,从被选定的Cache Set中找到要替换的line,这样就近似地实现了一种随机的替换,这种方法从理论上来说,可能并不能获得最优化的结果,但是它的硬件复杂度比较低,也不会损失过多的性能,因此综合来看是一种不错的折中方法。









审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18275

    浏览量

    222158
  • 存储器
    +关注

    关注

    38

    文章

    7148

    浏览量

    161986
  • TLB电路
    +关注

    关注

    0

    文章

    9

    浏览量

    5225
  • SRAM芯片
    +关注

    关注

    0

    文章

    64

    浏览量

    11950

原文标题:学习分享|CPU Cache知识

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    科普一下RV1126与RV1109具备哪些技术优势呢

    科普一下RV1126与RV1109具备哪些技术优势呢?
    发表于 02-21 06:25

    超标量处理器的微体系结构由哪几部分组成?

    处理器体系结构由哪几部分组成?超标量处理器的微体系结构由哪几部分组成?
    发表于 02-28 07:31

    科普一下RK3288安卓主板的优势特点有哪些呢

    科普一下RK3288安卓主板的优势特点有哪些呢
    发表于 03-03 13:33

    科普一下RK3399 Audio的功能有哪些呢

    科普一下RK3399 Audio的功能有哪些呢?
    发表于 03-04 12:47

    科普一下RK3399/libdrm/modetest

    科普一下RK3399/libdrm/modetest
    发表于 03-07 07:06

    科普一下RK3328 SoC有何功能呢

    科普一下RK3328 SoC有何功能呢?
    发表于 03-09 07:28

    ARM处理器的逻辑cache和物理cache是什么

    ARM处理器的逻辑cache和物理cache是什么?有没有哪位大神可以帮忙解决一下这个问题
    发表于 11-03 15:25

    ARM应用处理器Cache level进化历史阐述

    致性。第代的64位arm处理器大小核系统,还是以CCI-400为cache致性互联。但如上图所示,CCI-400没有snoop fil
    发表于 12-14 16:17

    Arm Cortex-M7处理器产品介绍

    架构的卓越响应性和易用性。 凭借内置的指令和数据高速缓存以及紧密耦合的存储(TCM),这款超标量处理器即使在终端要求最苛刻的处理应用程序
    发表于 08-25 06:25

    什么是超标量技术/FADD?

    什么是超标量技术/FADD? 超标量(superscalar)是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,
    发表于 02-04 10:45 1420次阅读

    处理器中非阻塞cache技术的研究

    现代高速处理器的设计中对于cache技术的研究已经成为了提高处理器性能的关键技术,本文针对在流水线结构中采用非阻塞cache技术进行分析研究,提高c
    发表于 12-28 09:54 8次下载

    PowerPC芯片特点及超标量体系CPU优化技术

    后进行对比实验,装置软件运行效率大大提高,实际效果良好。 1 超标量体系结构PowerPC芯片特点 1.1 超标量体系结构芯片 PowerPC芯片属于超标量体系结构。超标量体系结构是一
    发表于 10-19 11:21 0次下载

    乱序超标量处理器核的功耗优化

    的技术手段,也可以有效降低功耗。对一款乱序超标量处理器核中功耗比较突出的模块寄存器文件和再定序缓冲进行了逻辑设计优化,在程序运行性能几乎不受影响的情况下明显减少了面积,降低了功耗。
    发表于 11-23 17:37 3次下载
    乱序<b class='flag-5'>超标量</b><b class='flag-5'>处理器</b>核的功耗优化

    新思科技推出全新ARC处理器,采用超标量ARCv3指令集架构

    HS5x和64位HS6x处理器有单核和多核版本,采用一种新的超标量ARCv3指令集架构(ISA),在典型条件下,可在16纳米工艺技术中实现高达8750 DMIPS的单核性能,是目前性能最高的ARC处理器
    的头像 发表于 06-01 15:21 5053次阅读

    超标量处理器的指令乱序提交机制综述

    针对超标量处理器中长周期执行指令延迟退休及持续译码导致的重排序缓存(ROB)阻塞问题,提出一种指令乱序提交机制。通过设计容量可配置的多缓存指令提交结构,实现存储器操作指令和ALU类型指令的分类退休
    发表于 06-07 11:39 13次下载