每个现代处理器都具有少量的高速缓存。在过去的几十年中,缓存体系结构变得越来越复杂:CPU缓存级别已增加到三个级别:L1,L2和L3,每个块的大小都已增加,并且缓存关联性也发生了一些变化。

但是,在我们深入研究细节之前,让我问您,高速缓存到底是什么,为什么需要它?此外,现代处理器由L1,L2和L3缓存组成。这些缓存级别之间有什么区别?

高速缓存内存与系统内存:SRAM与DRAM

高速缓存基于更快(且更昂贵)的静态RAM,而系统内存则利用了较慢的DRAM(动态RAM)。两者之间的主要区别在于,前者由CMOS技术和晶体管制成(每个模块六个),而后者则使用电容器和晶体管。

DRAM需要不断刷新(由于漏电),以将数据保留更长的时间。因此,它消耗的功率明显更多,并且速度也较慢。SRAM不必刷新,效率更高。但是,较高的价格阻碍了主流技术的采用,从而限制了其在处理器缓存中的使用。

缓存在处理器中的重要性?

现代处理器比其80年代和90年代初的原始祖先要光明几年。如今,高端消费类芯片的运行频率超过4GHz,而大多数DDR4内存模块的额定频率都低于1800MHz。结果,系统内存太慢而无法直接与CPU一起使用而又不会严重降低它们的速度。这是高速缓存存储器的来源。它充当两者之间的中介,存储小块重复使用的数据,或者在某些情况下,存储那些文件的存储器地址。

L1,L2和L3缓存:有什么区别?

在现代处理器中,按大小增加和速度递减的顺序,高速缓存存储器分为三个部分:L1,L2和L3高速缓存。L3高速缓存是最大也是最慢的(第三代Ryzen CPU具有高达64MB的大型L3高速缓存)高速缓存级别。L2和L1比L3小得多,并且速度更快,并且每个内核都分开。较早的处理器不包括三级L3高速缓存,并且系统内存直接与L2高速缓存交互:

L1缓存进一步分为两部分:L1数据缓存和L1指令缓存。后者包含需要由CPU执行的指令,而前者用于保存将被写回到主存储器的数据。

L1高速缓存不仅充当指令高速缓存,而且还保留预解码数据和分支信息。此外,虽然L1数据高速缓存通常充当输出高速缓存,但L1指令高速缓存的行为类似于输入高速缓存。当进行循环时这很有用,因为所需的指令就在获取单元旁边。

现代CPU最多可为旗舰处理器提供512KB的L1高速缓存(每个内核64KB),而服务器部件的功能几乎是后者的两倍。

L2缓存比L1大得多,但同时也慢一些。旗舰级CPU的大小为4-8MB(每个内核512KB)。每个内核都有自己的L1和L2缓存,而最后一级L3缓存在裸片上的所有内核之间共享。

L3缓存是最低级别的缓存。从10MB到64MB不等。服务器芯片具有多达256MB的三级缓存。此外,与竞争对手的英特尔芯片相比,AMD的Ryzen CPU具有更大的缓存大小。这是因为MCM设计与Intel方面的Monolithic比较。

当CPU需要数据时,它首先搜索关联内核的L1缓存。如果找不到,则接下来搜索L2和L3缓存。如果找到了必要的数据,则称为缓存命中。另一方面,如果缓存中不存在数据,则CPU必须请求将其从主内存或存储设备加载到缓存中。这需要时间,并且会对性能产生不利影响。这称为缓存未命中

通常,当高速缓存大小增加时,高速缓存命中率会提高。在游戏和其他对延迟敏感的工作负载中尤其如此。

看一下内存映射

有了关于高速缓存的基本说明,让我们讨论一下系统内存如何与高速缓存进行通信。这称为缓存或内存映射。高速缓冲存储器分为块或组。这些块又分为n个64字节行。系统存储器被划分为与高速缓存相同数量的块(组),然后将两者链接在一起。

如果您有1GB的系统RAM,则缓存将分为8192行,然后分成多个块。这称为n路关联缓存。使用2路关联高速缓存时,每个块每个包含2行,4路每个包含4行,8路包含8行,16路包含16行。如果总RAM大小为1GB,则内存中的每个块的大小均为512 KB。

如果您具有512 KB 4路关联的高速缓存,则RAM将被分为2,048个块(1GB为8192/4个)并链接到相同数量的4行高速缓存块。

以与16路关联缓存相同的方式,将缓存分为512个块,这些块链接到内存中的512个(2048 KB)块,每个缓存块包含16行。当缓存中的数据块用完时,缓存控制器将用所需的数据重新加载一组新的块,以继续执行处理器。

N向关联缓存是最常用的映射方法。还有另外两种方法,称为直接映射和完全关联的映射。在前者中,高速缓存行与内存之间存在硬链接,而在后者的情况下,高速缓存可以包含任何内存地址。基本上,每一行都可以访问任何主内存块。此方法具有最高的命中率。但是,它的实施成本很高,因此,芯片制造商通常会避免使用它。

哪种映射是最好的?

直接映射是最容易实现的配置,但同时效率最低。例如,如果CPU要求给定的内存地址(在这种情况下为1,000),则控制器将从内存中加载64字节的行并将其存储在高速缓存中(1,000至1,063)。将来,如果CPU需要来自相同地址或此地址之后的地址(1,000到1,063)的数据,它们将已经在高速缓存中。

当CPU在映射到同一高速缓存行的存储块中需要一个接一个的下一个地址时,这将成为一个问题。例如,如果CPU首先请求地址1,000,然后再请求地址2,000,则将发生高速缓存未命中,因为这两个地址位于同一内存块中(128 KB是块大小)。另一方面,映射到它的缓存行是从地址1,000到1,063开始的行。因此,缓存控制器将在第一条缓存行中将地址从2000的行加载到2063,从而淘汰了较旧的数据。这就是为什么直接映射高速缓存是效率最低的高速缓存映射技术并已被广泛放弃的原因。

完全关联映射在某种程度上与直接映射相反。内存高速缓存的行与RAM内存位置之间没有硬链接。缓存控制器可以存储任何地址。上面的问题不会发生。此高速缓存映射技术是最有效的,命中率最高。但是,正如已经说明的那样,它是实现起来最困难,最昂贵的。

结果,使用了在完全关联映射和直接映射之间混合的集合关联映射。在这里,每个内存块都链接到一组线(取决于SA映射的类型),并且每一行都可以保存来自映射内存块中任何地址的数据。在4路集关联缓存中,内存缓存中的每个集最多可容纳来自同一内存块的四行。通过16路配置,该数字将增加到16。

当映射集上的插槽全部用完时,控制器将逐出其中一个插槽的内容,并从同一映射存储块中加载另一组数据。例如,将组关联内存缓存的方式从4路增加到8路,每组就有更多的缓存插槽可用。但是,如果不增加缓存量,则每个链接的内存块的内存大小都会增加。基本上,在不增加整体高速缓存大小的情况下增加集合高速缓存集上可用插槽的数量意味着该集合将链接到更大的内存块,由于刷新次数增加,有效地降低了效率。

另一方面,增加缓存大小意味着每个集合中会有更多行(假设集合大小也增加了)。这意味着每个存储块有更多数量的链接高速缓存行。通常,这会增加命中率,但是可以提高整体数字的限制是有限的。

缓存大小_CPU中的L1,L2和L3缓存之间的区别:缓存是如何工作的?相关推荐

  1. java中static、final 和 static final之间的区别

    java中static.final 和 static final之间的区别 static可以修饰:全局属性,方法,代码块,内部类(静态内部类或嵌套内部类) 由于静态属性和方法是属于该类的所有对象的,所 ...

  2. java中双引号和单引号_Java中的单引号和双引号之间有区别吗?

    问题 Java中的单引号和双引号之间有区别吗? #1 热门回答(126 赞) 对于literalchar使用单引号,对于literalString使用双引号,如下所示: char c = 'a'; S ...

  3. 【整理】Python中的re.search和re.findall之间的区别和联系 + re.finall中带命名的组,不带命名的组,非捕获的组,没有分组四种类型之间的区别

    之前自己曾被搞晕过很多次. 后来使用这些函数次数多了之后,终于比较清楚的弄懂了两者之间的区别和关系了. 尤其是一些细节方面的注意事项了. 在看下面的总结和代码之前,请先确保你对如下基本概念已经有所了解 ...

  4. CPU缓存L1,L2和L3是什么?如何工作?

    本文介绍了CPU的L1,L2,L3缓存以及工作原理: 文章目录 1 前言 2 什么是CPU缓存? 3 CPU缓存如何工作? 4 缓存级别:`L1`,`L2`和`L3` 5 缓存命中或未命中以及延迟 6 ...

  5. java字面量和符号引用_java中字面量,常量和变量之间的区别(附:Integer缓存机制)...

    一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...

  6. Pandas中map,applymap和apply方法之间的区别

    本文翻译自:Difference between map, applymap and apply methods in Pandas Can you tell me when to use these ...

  7. php中this,self,parent三个关键字之间的区别(转载)

    PHP5是一具备了大部分面向对象语言的特性的语言,比PHP4有 了很多的面向对象的特性,但是有部分概念也比较难以理解,这里我主要谈的是 this,self,parent三个关键字之间的区别.从字面上比 ...

  8. sql语句截断_SQL Server中SQL截断和SQL删除语句之间的区别

    sql语句截断 We get the requirement to remove the data from the relational SQL table. We can use both SQL ...

  9. C语言中指针*p、p以及p之间的区别以及*p和**p的区别

    *p.p以及&p之间的区别 假设我们定义一个指针p. 那么会经常使用到三个符号: 1,p: 2,*p; 3,&p; p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用%p来 ...

最新文章

  1. C# .NET访问Oracle的三种方法(转)
  2. JVM:对象的实例化、内存布局与访问定位
  3. python mysql 转义方法
  4. c语言手机通讯录退出程序,通讯录小程序(C/C++)C语言练习小程序
  5. 计算机系统结构结构相关实验报告,计算机系统结构实验报告(中南民族大学).doc...
  6. golang 日志分析_Saferwall:下一代开源恶意软件分析平台
  7. Python2+Selenium入门04-关于WebDriver类
  8. django判断ajax,Django ajax 检测用户名是否已
  9. UCBCS188 AI学习笔记(2)informed search (启发函数搜索)
  10. mysql rds 是什么_mysql.rds.aliyuncs.com
  11. 日期转换和日历的使用方法
  12. linux下c使用lzma_linux 编译lzma
  13. 廖雪峰的0Python教程
  14. C++ POST请求调用百度AI OCR
  15. java 数字转换开发票大写格式_Java转化数字为大写人民币
  16. 有没有比图灵机能力更强的计算模型?
  17. 工程建设项目全套流程,门清!
  18. (纯小白)Python简单爬取图片
  19. 51单片机入门——STC89C52RC控制步进电机进行转动、调速
  20. Fast Ground Segmentation for 3D LiDAR Point Cloud Based on Jump-Convolution-Process实现

热门文章

  1. 网卡绑定技术linux c,Linux多网卡绑定
  2. logstash使用,结果输出到stdout
  3. LDD3源码分析之字符设备驱动程序
  4. 鸿蒙系统的升级名单,首批升级鸿蒙系统的名单确认,华为安卓系统将成为过去式!...
  5. java系统排序_Java实现二进制排序树
  6. Java怎么xml拒绝,Sun Java运行时环境XML解析拒绝服务漏洞
  7. cadence原理图封装pin名称重复_原理图设计篇|单片机设计项目实例分享
  8. 初中python编程教学的困难与解决研究_初中信息技术课程中存在的问题与解决方案研究...
  9. 计算机科学CSTA,学编程,搞懂CSTA K-12计算机科学学习标准
  10. pycharm 类型注释_后端开发使用pycharm的技巧