超标量处理器设计2-cache

news/2025/1/18 9:41:21/

1. cache 介绍

影响Cache缺失的情况有3种:

  1. Compulsory: 第一次被访问的指令或者数据肯定不会在cache中,需要通过预取来减少这种缺失
  2. Capcity: Cache容量越大,缺失就可以更少, 程序频繁使用的三个数据来源于3个set, 但是,核由于面积的约束,只有2个set
  3. Conflict, 指多个数据映射到Cache中的同一个位置, 程序频繁使用的三个数据来源于同一个Cache set;可以使用Victim Cache来缓解这个问题

1.1 cache的结构

cache主要由两部分组成,Tag部分和Data部分。Data部分用来保存一片连续地址的数据,而Tag部分则是存储这片连续数据的公共地址,一个Tag和它对应的所有数据组成的一行称为一个Cache line; 而Cache line中的数据部分称为数据块(Cache data block), 如果一个数据块可以存储在Cache中的多个地方,这些被同一个地址找到的多个Cache line称为一个Cache set。如TLB和Victim Cache多采用了全相连结构,而普通的I-cache和D-cache则采用组相连结构
在这里插入图片描述

1.2 Cache的实现方式

并行访问:如果同时访问Tag SRAM和Data SRAM, 我们称之为并行访问。将读出来的地址和数据都送到一个多路选择器上,这个多路选择器受到Tag比较结构的控制。然后根据存储器地址中的block offset的值选出合适的字节,一般将选择字节的过程称为数据对齐。

  1. 地址计算: 计算得出存储器的地址
  2. 冲突检查: 对load/store指令之间存在的相关性进行检查
  3. 并行访问Tag SRAM和Data SRAM, 并使用结果进行选择
  4. 使用存储器中的block offset 从data block 种选出最终需要的数据

截屏2025-01-17 22.28.12.png

串行访问:访问SRAM这一级少了mux, 对于时序较为友好,但是多了一个cycle。串行访问的功耗也更为友好,因为是根据比较之后的结果进行访问
截屏2025-01-17 22.33.10.png

Note: 如果处理器是超标量处理器,可以乱序执行,那么我们选择串行访问效果更好,因为访问cache多的这个时钟周期可以通过执行其它指令来掩盖掉,并且通过串行访问,可以减少delay, 提高时钟频率。如果是普通的顺序执行的处理器,选择并行访问比较好。

1.3 cache的写入

写通:当数据写到D-cache的同时,也写入到它的下级存储器中
写回:当数据写到D-cache时,不会立即写入到下级存储器中,只会在cache line中做一个记号,只有当该cache line需要被替换时,才会写入到下一级存储器中
上述情况都是默认要写入的地址总是在D-Cache中,如果发现这个地址不在D-cache上时,就发生了写缺失(write miss), 此时最简单的处理方法就是将数据写到下级存储器,称为non-write allocate.
如果发生写缺失时,将发生缺失的地址对应的整个数据块取出来,将数据合并到这个数据块中,然后将被改过的数据块写入到D-Cache中(wirte allocate), 之后也需要将这个数据块写入到下级存储器中(write allocate)
NOTE: 写通方式的优点是结构简单,方便一致性管理。缺点是执行效率不高,每一次写入都需要修改下级存储器。在一般的处理器当中,L2 Cache会采用写回的方式,但对于L1 cache来看,写通的方式也是可以接受的,这样可以简化流水线的设计,便于在多核的情况下管理内存一致性。

1.4 提高cache的性能

  1. write buffer

截屏2025-01-17 22.35.54.png

  1. 多级cache

截屏2025-01-17 22.38.07.png

现在L1 cache一般都做成inclusive的模式,因为实现简单,并且方便管理
3. victim cache
victim cache可以保存最近被提出cache 的数据, 因此所有的cache set 都可以利用它来提高way 的个数, 通常victim cache 采用全相连的方式,容量都比较小。
截屏2025-01-17 22.39.09.png

  1. 硬件预取 prefetch
    由于程序本身是串行执行的,因此只需要访问I-Cache中的一个数据块的时候,将它后面的数据块也取出放到I-cache中就可以了,但是存在分支指令,使得不会使用的指令进入了I-cache, 这一方面降低了I-Cache实际可用的容量,一方面占用了可能有用的指令,称为Cache 污染。为了避免这种情况的发生,我们可以将预取的指令放到一个单独的缓存
    截屏2025-01-17 22.40.00.png
  2. 多端口cache
    5.1 true multi-port
    真的使用一个多端口的SRAM来实现多端口的Cache,SRMA中的每个cell支持两个读端口和一个写端口。缺点是多端口的CELL需要驱动多个读端口,因此需要更多的访问时间,功耗也会增大。
    5.2 Multiple Cache copies
    将SRAM进行复制来实现多端口的读写,这样可以基本消除读处理周期时间的影响,但是,这种方法浪费面积,并且需要保持两个CAche的同步,功耗也比较大。
    5.3 multi-banking
    每个bank都只有一个端口,如果在一个周期之内,CACHE的多个访问地址位于不同的bank, 则不会发生问题,如果处于同一个bank, 则会引起bank 冲突

2. cache的分类

2.1 virtual cache

  1. TLB只是加速了从虚拟地址到物理地址的转换,但是要直接从物理内存中取数据依然很慢,因此可以用cache将物理地址到数据的转换过程缓存起来。
    截屏2025-01-17 22.46.32.png

  2. 我们可以直接将虚拟地址和物理存储中的数据对应起来,这样就简化了查找TLB的过程。但是会引入两个问题,一个是不同的虚拟地址对应同一个物理位置,由于不同的虚拟地址会占用不同的cache line, 因此浪费了宝贵的cache空间,造成cache容量的减少,二是执行store指令时,本质上应该对同一个物理地址的cache line都应该修改。
    截屏2025-01-17 22.48.27.png

  3. 由于虚拟地址和物理地址的低12位(4K)是相等的,因此如果cache的容量小于4K, 那么寻址cache的地址就不会大于12位,此时即使两个不同的虚拟地址对应一个物理位置,他们寻址cache的地址也会相同。

  4. 当cached的容量大于页的大小时,我们需要通过bank结构来解决这种重命名的问题,可以使用L2 CAche来实现这个功能,使L2 cache中包括所有的L1 cache的内容,也就是之前的inclusive的方式
    截屏2025-01-17 22.51.11.png
    截屏2025-01-17 22.51.40.png

小结

cache的内容较多,涉及到cache pipeline的设计(并行结构,串行结构),cache的大小计算,cache 内部结果的设计(multi-bank, 组相连,全相联等),对于这些分知识点,后续也需要单独介绍。


http://www.ppmy.cn/news/1564114.html

相关文章

浅谈计算机网络04 | 现代网络需求与技术支撑

现代网络需求与技术支撑 一、网络和因特网流量的类型剖析1.1 弹性流量的自适应特征1.2 非弹性流量的刚性特征1.3 实时流量特性 二、特定领域的网络需求解析2.1 大数据环境下的网络需求分析2.2 云计算环境下的网络需求分析2.3 移动数据环境下的网络需求分析 三、QoS和QoE&#x…

标准通上线标准「全文检索」功能,提升查询精准度!

前言 标准全文检索:在大量文档或数据库中查找与特定标准相关的全文内容。这种检索方式对于获取详细、精确的信息非常有用,尤其是在需要查找特定标准、规范或法规的详细条款时。 如何在大量的标准中准确、快速地获取所需的标准信息,同时还能…

微信小程序wx.showToast在真机显示时时间设置无效,显示时间很短问题

问题 小程序中,使用showToast,设置duration来控制提示显示时长 发现在微信开发者工具正常,在真机中显示时间比较短,并且设置duration不生效。 原因: 因为在调用showToast之后,又调用了hideLoading() &am…

使用 JUnit 和 SuiteRunner 测试私有方法

我第一次使用 JUnit 是为了为 ServiceUI API 构建一个一致性测试工具包 [ 1 ]。一致性测试工具包的目的是帮助确保同一 API 的替代实现与 API 的规范兼容。由于 API 规范仅定义 API 的公共接口,而不是 API 的实现,因此一致性测试仅测试公共接口。换句话说…

vue2 升级为 vue3+第三方库升级+vue2与vue3混合交互

文章目录 vue2 项目升级为vue3 项目经验分享vue2升级为vue3-第三方库兼容vue2升级为vue3-vuex变化应用vue2与vue3语法交互应用 vue2 项目升级为vue3 项目经验分享 以下是将 Vue2 项目升级为 Vue3 项目的一般步骤: 一、准备工作 备份项目:在开始升级之…

SpiderFlow平台v0.5.0之引入selenium插件

引入selenium插件 首先到码云下载插件点击下载​编辑到本地并导入到工作空间或安装到maven库在spider-flow/spider-flow-web/pom.xml中引入插件 <!-- 引入selenium插件 --> <dependency><groupId>org.spiderflow</groupId><artifactId>spider-…

微信原生小程序自定义封装组件(以导航navbar为例)

封装 topnav.js const App getApp(); Component({// 组件的属性列表properties: {pageName: String, //中间的titleshowNav: { //判断是否显示左上角的按钮 type: Boolean,value: true},showHome: { //判断是否显示左上角的home按钮type: Boolean,value: true},showLocat…

拆分工作簿转换PDF格式文件一步到位-Excel易用宝

今天一大早老板急匆匆的跑进办公室说&#xff0c;快快快&#xff0c;&#xff0c;快把这个工作簿中的工作表拆分出来&#xff0c;然后转换成PDF格式文件发给客户。 我一看这么多工作表&#xff0c;又是拆分表格&#xff0c;又是转换文件&#xff0c;这么复杂的工作&#xff0c…