超标量处理器设计——第二章_Cache

参考《超标量处理器》姚永斌著

文章目录

  • 超标量处理器设计——第二章_Cache
    • Cache的一般设计
      • 2.1.1 cache组成方式
      • 2.1.2 Cache的写入
      • 2.1.3 Cache的替换策略
        • 1. LRU (Least Recently Used)
        • 2. 随机替换
    • 2.2 提高Cache的性能
      • 2.2.1 写缓存
      • 2.2.2 写D-Cache流水线
      • 2.2.3 多级结构
      • 2.2.4 Victim Cache
      • 2.2.5 Filter Cache
      • 2.2.5 预取
    • 2.3 多端口Cache
      • 2.3.1 True Multi-port
      • 2.3.2 Multiple Cache Copies
      • 2.3.3 Multi-banking
      • 2.3.4 AMD Opteron的多端口Cache
    • 2.4 超标量处理器的取指令

Cache的一般设计

  • Cache缺失(miss)的3C定理:

    1. Compulsory , 第一次访问失效
    2. Capcity, 由于cache满引发的miss
    3. Conflict, 有多个数据映射到cache同一个位置

2.1.1 cache组成方式

  1. 直接映射:

    • 对所有index相同的存储地址, 会寻址到同一个cache line
  2. 组相连:

  • 对所有index相同的存储地址, 会寻址到多个cache line

  • n-way的组相连结构一个index对应n个line, 这些line称为一个cache set

  • 可以显著降低cache miss

  • 因为需要从set中比较得到一个line, 延迟较大

  • tag和data通常分成两个SRAM, 称为tag sram 和data sram

    1. 并行访问:
    1. 串行访问:
    • 串行访问虽然增加了一拍延时, 但是省掉了way mux ,节省功耗, 可以提升流水频率
    • 增加的一拍延时, 在乱序机中可以填充其他指令, 性能影响不大;但是对顺序机而言可能会降低性能
  1. 全相连
  • 没有index, 一个地址的数据可以在cache的任意位置找到
  • 将tag与所有cache line比较
  • 相当与CAM 内容寻址存储器(Content Address Memory)
  • 一般TLB采用这种结构

2.1.2 Cache的写入

  • 一般I-Cache不会直接写入内容, 即使程序有self-modifying自修改的情况, 也是先把改写的指令写入D-Cache, 将D-cache内容写回下级存储器, 之后将I-cache所有内容置为无效, 这样处理器再次执行就会发生miss, 迫使I-cache从下级存储取指令

  • 写D-cache的方式:

    1. 写通(Write-Through): 数据写到D-Cache的同时, 也写到下级存储器
    2. 写回(Write-Back): 通过脏位标记D-cache中被修改的line, 当该line要被替换时才将其写到下级存储器
  • 写D-Cache时发生写miss:

    1. Non-Write Allocate : 直接将要写的内容写到下级存储器, 不写到D-Cache中
    2. Write Allocate: 先从下级存储器中将发生缺失的地址对应的数据块取出, 与要写入到D-cache中的数据合并后再将该数据写入D-Cache
  • 写通一般配合Non-Write Allocate; 写回则一般配合Write Allocate:

  • 写回+Write Allocate的方法相对而言可以减少对下级存储器的访问频率

2.1.3 Cache的替换策略

  • 替换发生在某个Cache set中所有的line都满了的情况

1. LRU (Least Recently Used)

  • 为每个Cache line设置一个年龄部分, 每当way被访问, 年龄部分就会增加, 年龄最小的way就是要被替换的way

  • 实际实现是通常采用PLRU(Pesudo Least Recently Used):

  • 对于8个way的Cache, 需要三级年龄位, 每个年龄位为0表示标号小的那些way最近未被使用, 为1表示编号大的那一组最近未被使用

  • 每次访问某个way都会更新三级年龄位

  • 代码实例[[PLRU-伪LRU的一种优雅实现方式]]

2. 随机替换

  • 一般采用时钟算法, 开一个计数器, 计数宽度等于Cache的相关度, 每个时钟周期加一, 需要替换时就用当前的计数值选择替换的way

2.2 提高Cache的性能

2.2.1 写缓存

  • 起因: L2-Cache一般只有一个读写端口, 当D-Cache发生缺失, 需要从下级存储读取数据, 并写道Cache line中, 如果这个line是脏的, 需要先将其写回下级存储. 所以对L2-Cache的需要先写再读, 串行完成. 这样增加了从下级存储读入数据到Cache的延迟
  • 解决: (写延迟策略) 增加一个write buffer, 当脏的line需要写回时先放到write buffer中, 等到下级存储有空的时候才会将write buffer中的数据写回夏季存储
  • 对于写通类型的缓存, 写下级存储的次数较多, 因此写缓存较为重要
  • 缺陷: 会增加复杂度, 因为写缓存中也要加入地址比较CAM电路, D-Cache发生缺失时, 不仅要从下级存储器查找,还需要从写缓存中查找最新数据

PS. 写延迟的方法用处很多, 例如可以据此实现单端口SRAM的FIFO:
[[FIFO那些事儿——单端Sram实现的同步FIFO]]

2.2.2 写D-Cache流水线

  • 对读Cache来说, 可以实现tag和data的读取并行
  • 写Cache需要先比较tag, 通过之后才能写入data, 所以需要串行
  • 当sw后紧接着一条ld, 此时ld的地址可能正好在Delayed Store Data寄存器中, 因此上述流水线添加了一个旁路, 可以将load data直连到Delayed store data寄存器上

2.2.3 多级结构

  • 一般L2 Cache会采用Write Back

  • 对于多核处理器, L1 Cache采用Write Through可以简化流水线

  • Inclusive和Exclusive:

  • Exclusive : 避免浪费, 可以获得更大的Cache可用容量, 提高处理器性能

  • Inclusive : 写数据时可以直接写入L1 Cache, 不需要再读下级存储出来合并后再写入, 且一致性管理更简单

2.2.4 Victim Cache

  • 如果cache中被踢出的数据马上又要被用, 又不能增加cache的way数, 可以采用VC

  • VC用于保存最近被踢出的数据, 本质是相当与增加了way数:

  • 一般VC是全相连的, 容量较小(4-16)

  • VC相当于是L1-cache的一个Exclusive Cache

2.2.5 Filter Cache

  • VC是在L1 Cache之后, 而FC是在L1 Cache之前, 当一个数据第一次被使用, 不会放到L1 中,而是放到FC中, 再次被使用才会放入Cache

  • 可以过滤一些偶然使用的数据

2.2.5 预取

  • 硬件预取:

    • 指令是很容易预取的(顺序特性), 通常可以将指令预取一部分到一个buffer

    • 对于数据的预取, 通常是将要访问的数据的下一个数据快也预取出来

  • 软件预取:
    • 编译器知道程序的细节, 所以可以通过编译器控制程序进行预取

2.3 多端口Cache

  • 超标量处理器一次可以取出多条指令, 因此需要多端口的Cache

2.3.1 True Multi-port

  • SRAM中的每个Cell都需要支持两个读端口

  • 面积, 延时, 功耗都会增大, 一般不会这么使用

2.3.2 Multiple Cache Copies

  • 直接复制一份, 相当于pingpong
  • 面积和功耗浪费都更大

2.3.3 Multi-banking

  • 将Cache分成多个bank, 每个bank都只有一个端口, 只要保证一个周期内Cache的访问地址们不在同一个bank中即可

  • 可以增加bank数来减少bank冲突

2.3.4 AMD Opteron的多端口Cache

  • 数据块分成8个bank
  • 2-way, 两路的电路采用复制的方法
  • Virtually-indexed, Physicaly-tagged, 直接使用VA寻址Cache

2.4 超标量处理器的取指令

  • 对于一个32位n-way的超标量处理器(一个周期可以取n条指令),如果取指令地址是n字对齐的, 那么就可以一个周期取出n条指令
  • 实际情况是取指令很可能不是n个字对齐的,例如分支跳转到一个非n字对齐的地址。此时一次只能从cache line中读出一部分fetch group:
  • 通常取指会将取出来的指令放到指令缓存(Instruction Buffer)中, 这样可以保证即使某一次没有取出一个完整fetch group的指令, 仍能保证后续流水线能被取到足够的指令
  • 当第一条指令位于00位置, 一次可以取4条;当位于01, 一次可以取3条…可以推算出这种类型的cache每个周期可以取指的个数是1/4*4+1/4*3+1/4*2+1/4*1 = 2.5, 对于一个4-way的处理器来说就不太够了
  • 当然上面的分析是基于四种情况都是等概率事件发生的,而实际上过于悲观, 因为某次不对齐取指后,下一次就是对齐的了;也就是说实际每周期取指个数>2.5
  • 如何提升每周期取指个数?
    1. 一种方式是增加每个line的数据量,例如一个拥有8字的line的cache,它的每周期平均指令个数是3.25
    2. 仍然采用4个字的line, 但让每个tag管两行line,通过一个重排逻辑得到正确顺序的4条指令(处理跨行的情况):

公众号已开通,想了解更多相关内容可以扫一扫下方二维码~

超标量处理器设计——第二章_Cache相关推荐

  1. 超标量处理器设计——第七章_寄存器重命名

    超标量处理器设计--第七章_寄存器重命名 参考<超标量处理器>姚永斌著 文章目录 超标量处理器设计--第七章_寄存器重命名 7.1 简述 7.2 寄存器重命名方式 7.2.1 用ROB进行 ...

  2. 超标量处理器设计——第四章_分支预测

    超标量处理器设计--第四章_分支预测 参考<超标量处理器>姚永斌著 4.1 简述 分支预测主要与预测两个内容, 一个是分支方向, 还有一个是跳转的目标地址 首先需要识别出取出的指令是否是分 ...

  3. 超标量处理器设计——第十章_提交

    参考<超标量处理器>姚永斌著 文章目录 超标量处理器设计--第十章_提交 10.1 概述 10.2 重排序缓存 10.2.1 一般结构 10.2.2 端口需求 10.3 管理处理器的状态 ...

  4. linux系统管理设计ppt,操作系统原理与Linux实例设计--第二章.ppt

    操作系统原理与Linux实例设计--第二章.ppt 2.5.4 实时系统与实时任务调度 实时系统与实时任务 实时系统:能及时响应外部请求,并作出反应的系统. 是一个相对的概念. 是否周期执行来划分: ...

  5. 超标量处理器设计——第八章_发射

    超标量处理器设计--第八章_发射 参考<超标量处理器>姚永斌著 文章目录 超标量处理器设计--第八章_发射 8.1 简述 8.1.1 集中式 VS. 分布式 8.1.2 数据捕捉 VS. ...

  6. 超标量处理器设计 姚永斌 第8章 指令发射 摘录

    8.1 概述 何为发射?它就是将符合一定条件的指令从发射队列issue queue中选出来,并送到FU中执行的过程.发射队列页可以叫做保留站reservation station. 发射队列会按照一定 ...

  7. 超标量处理器设计 姚永斌 第9章 指令执行 摘录

    9.1 概述 执行阶段负责指令的执行,在流水线的之前阶段做了那么多的事情,就是为了将指令送到这个阶段进行执行.在执行阶段,接受指令的源操作数,对其进行规定的操作,例如加减法.访问存储器.判断条件等,然 ...

  8. 单片机原理与应用设计第二章(AT89S51)

    目录 目录 一.硬件组成 AT89S51单片机片内结构 AT89S51引脚功能 3.并行I/O口引脚 P0口 P0口:地址/数据总线 数据输出 数据输入 P0口:通用输入输出功能 P1口 P2组I/O ...

  9. 思科—计算机网络课程设计—第二章静态路由概念测试

    题目一 哪条 IPv6 静态路由将作为通过 OSPF 学习的动态路由的备份路由? 选择一项: Router1(config)# ipv6 route 2001:db8:acad:1::/32 2001 ...

最新文章

  1. 使用kuberbuilder创建工程示例
  2. 北京活动:4月20号《科技媒体、SEO与PM》主题活动
  3. 什么是长期存储在计算机外存上的有结构,数据库是长期存储在计算机主存内
  4. php angular使用,如何使用angular.js PHP从mysql显示数据?
  5. python中通过pip安装套件
  6. 在 TableLayoutPanel 控件中对齐和拉伸控件
  7. 测试基础-01-软件测试的定义与分类
  8. 安装sphinx的心得和错误处理
  9. 思科室外AP无法注册到WLC
  10. ## 数据结构之单向链表的基本操作详细总结 爆肝总结超详细万字长文C语言版
  11. 企业信息安全整体架构
  12. Linux tcpdump命令实战
  13. Alcor(安国)AU6983量产工具(100421)量产成功教程
  14. imu 里程计融合_视觉里程计IMU辅助GPS融合定位算法研究
  15. android手机控制家用电器,手机遥控电脑!教你用手机控制家里电脑
  16. 二叉树、满二叉树、完全二叉树、平衡二叉树、二叉排序树、线索二叉树
  17. 超有爱的并查集 6666
  18. 工作笔记:如何用Django连接Kerberized甲骨文(Oracle)数据库
  19. MTK6735 竖屏横用、旋转90度、MTK_LCM_PHYSICAL_ROTATION
  20. 最小生成树(普里姆算法)

热门文章

  1. stm32 软件怎么设置写保护_STM32F407 读保护,写保护,解锁过程【芯片已设置读保护,无法读取更多信息】...
  2. QQ概念版试用体会(转)
  3. 如何在本地搭建一个EasyPlayer的H5 demo 播放H265视频流?
  4. Jenkins的简单使用,小白式教程
  5. 《操作系统真象还原》第二章 ---- 编写MBR主引导记录 初尝编写的快乐 雏形已显!
  6. 嵌入式SQL数据库连接简便操作
  7. Ubuntu配置git的比较工具-Meld
  8. 邮件推广遇到每天只能发100封的限制,已解决,看这一篇就够了!
  9. 中年百度,舒适又失落的前半生
  10. php页面表格导出excel表格数据类型,php页面表格导出excel表格数据类型-php导出excel是不是导出整个表的?可不可以导出指......