Cache学习(3):Cache地址映射(直接映射缓存组相连缓存全相连缓存)

1 Cache的与存储地址的映射

以一个Cache Size 为 128 Bytes 并且Cache Line是 16 Bytes的Cache为例。首先把这个Cache想象成一个数组,数组总共8个元素,每个元素大小是 16 Bytes,如下图:

image-20231123010312213

现在考虑一个问题,CPU从0x0654地址读取一个字节,由于Cache大小相对于主存来说,是非常小的。所以Cache只能缓存主存中极小一部分数据。如何根据地址在有限大小的Cache中查找数据呢?现在硬件采取的做法是对地址进行散列(可以理解成地址取模操作)。分为如下多种映射方式,他们各有优劣,同时也有着继承与发展的关系

1.1 直接映射缓存(Direct Mapped Cache)

1.1.1 地址映射方式

在前文中讲解了详细的地址映射关系,这里仅做简单的回顾

image-20231126110101981

上面的例子中,直接映射缓存的地址映射分配方式如下:

  • Cache Size是128 Byte
  • Cache Line size是16 Byte-----offset:4bit
  • 共计8个Cache Line-------------index:3bit
  • 假设地址宽度是16 bit-----------tag:9bits

根据直接映射缓存的工作方式,可以计算出不同主存地址段和对应的Cache

地址段Cahce Line Index
0x0000-0x000F,0x0080-0x008F,…0
0x0010-0x001F,0x0090-0x009F,…1
0x0020-0x002F,0x00A0-0x00AF,…2
0x0030-0x003F,0x00B0-0x00BF,…3
0x0040-0x004F,0x00C0-0x00CF,…4
0x0050-0x005F,0x00D0-0x00DF,…5
0x0060-0x006F,0x00E0-0x00EF,…6
0x0070-0x007F,0x00F0-0x00FF,…7

可以看到,地址0x0000-0x007F地址(0x0000-0x000F~0x0070-0x007F)处对应的数据可以覆盖整个Cache。0x0080-0x00FF地址的数据也同样是覆盖整个Cache。

image-20231126112711045

1.1.2 直接映射缓存的优缺点

优点:

  • 优点1:直接映射缓存在硬件设计上会更加简单
  • 优点2:因为优点1,所以成本上也会较低

缺点:

  • 容易出现Cache颠簸(Cache thrashing)

针对这个问题,在后面的文章中引入多路组相连缓存优化规避这一问题。(首先介绍学习两路组相连缓存)

1.2 两路组相连缓存(Two-way Set Associative Cache)

1.2.1 地址映射方式

依然使用本章的例子(Cache Size 128 Bytes ,Cache Line 16 Byte),引入新的概念路(Way),将Cache平均分成多份,每一份就是一路。因此,两路组相连缓存就是将Cache平均分成2份,每份64 Bytes。将所有索引一样的Cache Line组合在一起称之为组(下图中用绿色的框表示)。所以当Way=2时候,Set=4(Set*Way = Cache Line Count)。如下图所示。

image-20231126123440587

  • Cache Size是128 Byte
  • Cache Line size是16 Byte-----Offset:4bit(与直接映射缓存相同,因为Cache Line Size 没有变)
  • 共计4个Set----------------------Index:2bit(因为被平均分成了2 Way,每一个Set有2个Cache Line,共计4个Set,只需要2bit即可完成索引)
  • 假设地址宽度是16 bit-----------Tag:10bits(索引处少了一位,所以tag处需要多1 bit)

依然假设从地址0x0654地址读取一个字节数据。在上述例子中,会有如下操作:

  • 根据Index=01找到第2行Cache Line,第2行对应2个Cache Line,分别对应Way 0和Way 1。因此Index也可以称作Set Index(组索引)。
  • 将Set Index=01的组内的所有Cache Line对应的tag取出来和地址中的tag部分对比,如果其中一个相等就意味着命中。

因此,两路组相连缓存较直接映射缓存最大的差异就是:

  • 某一地址数据可以存储于对应组内的2个Cache Line,而直接映射缓存一个地址只对应一个固定的Cache Line

1.2.2 两路组相连缓存的优缺点

**缺点:**硬件成本相对于直接映射缓存更高:因为其每次比较tag的时候,开销更大。根据Set Index索引到对应组之后,由于组内有两个Cache Line,所以也会对应的有两个Tag。

  • 在硬件实现角度,增加了逻辑复杂性,某些硬件可能会做并行比较,虽然增加比较速度,但进一步增加了硬件设计复杂度)。
  • 比较两个tag,也会有更大的开销,速度可能会有所下降

**优点:**有助于降低Cache颠簸可能性。

根据两路组相连缓存的工作方式,可以画出主存地址0x0000-0x00FF地址对应的Cache分布图。同时在问题“程序试图依次访问地址0x0000、0x0080、0x0100”中比较两者Cache性能。

  • 直接映射缓存:0x0000、0x0080、0x0100地址中index部分是一样的。因此,这3个地址对应的Cache Line是同一个。当分别访问三个地址的时候都会发生Cache缺失,然后数据会发生替换从主存中加载数据。出现Cache颠簸(Cache thrashing)。

  • 两路组相连缓存:0x0000、0x0080、0x0100地址中index部分也是一样的。因此,这3个地址会对应到相同的组,但是由于有两个Way,在第一个数据0x0000加载进来的情况下放置在Way 0,再访问第二个数据0x0080,也不会替换,仅是将他放在Way1 中。避免了Cache颠簸。

    • 好处1:不至于每一次有数据访问都需要发生数据替换(虽然在访问第三个数据的时候还是需要替换,但是随着Way的数量增多,可能存下的数据更多)
    • 好处2:一个组中存了若干个数据,后面可能会继续使用

因此,当Cache size一定的情况下,组相连缓存对性能的提升最差情况下也和直接映射缓存一样,在大部分情况下组相连缓存效果比直接映射缓存好。同时,其降低了Cache颠簸的频率。从某种程度上来说,直接映射缓存是组相连缓存的一种特殊情况,每个组只有一个Cache Line而已。因此,直接映射缓存也可以称作单路组相连缓存。

image-20231126113917369

1.3 全相连缓存(Full associative Cache)

1.3.1 地址映射方式

组相连的另一个极端情况,将Way的数量扩大至最大,这就是全向相连缓存,即为所有的Cache Line都在一个组内。这种缓存就是全相连缓存。

image-20231126123456580

  • Cache Size是128 Byte
  • Cache Line size是16 Byte-----Offset:4bit(与直接映射缓存相同,因为Cache Line Size 没有变)
  • 仅有1个Set----------------------Index:0bit(因为被平均分成了8 Way,每一个Set有8个Cache Line,所有的Cache Line都在1个Set内,因此地址中不需要set index部分。因为,只有一个组让你选择,不需要设置索引即可完成定位。)
  • 假设地址宽度是16 bit-----------Tag:12bits(索引处少了3位,所以tag处需要多3 bit)

1.3.2 全相连缓存优缺点

缺点:

需要根据地址中的tag部分和唯一组内的所有的Cache Line对应的tag进行比较(硬件上可能并行比较也可能串行比较)。哪个tag比较相等,就意味着命中某个Cache Line。因此,在全相连缓存中,任意地址的数据可以缓存在任意的Cache Line中。但是硬件成本上也是更高。

优点:

可以最大程度的降低Cache颠簸的频率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

城市生命线丨桥梁结构健康监测系统的作用

在城市建设当中,有非常多的城市基本建设,建设当中,桥梁作为不可忽视的一环,也需要有很多桥梁建设的智能监测系统,在这个桥梁结构健康监测系统中,桥梁的各个数值都能被监测得到。 WITBEE万宾使用城市生命线智…

高并发内存池

1.什么是内存池 内存池动态内存分配与管理技术,对于程序员来说,通常情况下,动态申请内存需要使用new,delete,malloc,free这些API来申请,这样导致的后果是,当程序长时间运行之后,由于程序运行时所申请的内存…

探索 Rollup:简化你的前端构建流程

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Linux 命令vim(编辑器)

(一)vim编辑器的介绍 vim是文件编辑器,是vi的升级版本,兼容vi的所有指令,同时做了优化和延伸。vim有多种模式,其中常用的模式有命令模式、插入模式、末行模式:。 (二)vim编辑器基本操作 1 进入vim编辑文件 1 vim …

排序算法:归并排序、快速排序、堆排序

归并排序 要将一个数组排序,可以先将它分成两半分别排序,然后再将结果合并(归并)起来。这里的分成的两半,每部分可以使用其他排序算法,也可以仍然使用归并排序(递归)。 我看《算法》…

电源的纹波

电源纹波的产生 我们常见的电源有线性电源和开关电源,它们输出的直流电压是由交流电压经整流、滤波、稳压后得到的。由于滤波不干净,直流电平之上就会附着包含周期性与随机性成分的杂波信号,这就产生了纹波。 在额定输出电压、电流的情况下…

leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解

给你二叉树的根节点 root 和一个整数 limit ,请你同时删除树中所有 不足节点 ,并返回最终二叉树的根节点。假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit,则该节点被称之为 不足节点 ,需要被删除…

SQL Injection (Blind)`

SQL Injection (Blind) SQL Injection (Blind) SQL盲注,是一种特殊类型的SQL注入攻击,它的特点是无法直接从页面上看到注入语句的执行结果。在这种情况下,需要利用一些方法进行判断或者尝试,这个过程称之为盲注。 盲注的主要形式有…

Python之内置函数和模块

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

基于单片机的可升降助眠婴儿床(论文+源码)

1.系统设计 本课题为基于单片机的可升降助眠婴儿床系统,在设计目标上确定如下: 1. 可以实现婴儿床的升降,摇床功能控制; 2. 具有音乐播放功能,并且有多首曲目; 3. 用户可以通过按键或者红外遥控&#x…

Runloop解析

RunLoop 前言 ​ 本文介绍RunLoop的概念,并使用swift和Objective-C来描述RunLoop机制。 简介 ​ RunLoop——运行循环(死循环),它提供了一个事件循环机制在程序运行过程中处理各种事件,例如用户交互、网络请求、定…

Xshell连接VMware虚拟机中的CentOS

Xshell连接VMware虚拟机中的CentOShttps://www.cnblogs.com/niuben/p/13157291.html 步骤: 1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式。(由于只在本机进行连接,所以没有选择桥接模式。当然,桥接模式的配置会…

利用ngrok实现内网穿透(全网最详细教程)

准备工具: 1、phpstudy 用于在本地搭建网站 2、ngrok 用于将自己的本地端口暴露到公网上,从而实现内网穿透 文章开始前给大家分享一个学习人工智能的网站,通俗易懂,风趣幽默 人工智能https://www.captainbed.cn/myon/ ~~~~~…

【教学类-06-12】20231126 (一)二位数 如何让加减乘除题目从小到大排序(以1-20之间加法为例,做正序排列用)

结果展示 优化后 优化前 背景需求: 生成列表 单独抽取显示题目排序方法 存在问题: 我希望 00 01 02……这样排序,但是实际上,除了第一个加数会从小到大排序,第二个被加数的第十位数和个位数都会从小到大排序,也就是…

提示工程-Prompt Engineering

提示工程 提示工程 1、概述 Prompt Engineering: 提示工程 通过自然语言(英语、汉语等)来给AI下达指示,从而让AI完成你指定给他的工作的过程都可以称之为提示工程。(面向自然语言编程) 提示词要素 指令&…

Spring Web MVC

目录 一.简介 二.建立连接(客户端和服务器) 三.请求 1.传递单个参数 2.传递多个参数 3.对象 4.数组/集合 5.JSON 6.URL参数 7.上传文件 8.获取cookie和session (1)获取cookie (2)获取session …

4D Gaussian Splatting:用于实时的动态场景渲染

Wu G, Yi T, Fang J, et al. 4d gaussian splatting for real-time dynamic scene rendering[J]. arXiv preprint arXiv:2310.08528, 2023. 更多参考资料如下: 文章总结:4D Gaussian Splatting for Real-Time Dynamic Scene Rendering;疑难问…

C#,《小白学程序》第二十一课:大数的减法(BigInteger Subtract)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

python中模块的创建及引用(import as,import,from)

模块&#xff08;module&#xff09;简介&#xff1a; 1.模块化&#xff0c;模块化指将一个完整的程序分解为一个一个的小模块&#xff0c; 通过将模块组合&#xff0c;来搭建出一个完整的程序 2.不采用模块化就是统一将所有的代码编写到一个文件中&#xff0c;采用 模块化就是…

Redis-Redis 高并发分布式锁

集群分布式场景高并发 1.negix配置代理和路由 高并发场景超卖问题 1.使用原生redis控制超卖时(若是商品&#xff0c;则可以将商品id作为锁对象)&#xff0c;会遇到的问题 问题一&#xff1a;若直接使用&#xff1a;将获取锁的对象和设置的超时的时间分开&#xff0c;则不能控…