来源:新浪VR
每个现代处理器都具有少量的高速缓存。在过去的几十年中,缓存体系结构变得越来越复杂: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路,每组就有更多的缓存插槽可用。但是,如果不增加缓存量,则每个链接的内存块的内存大小都会增加。基本上,在不增加整体高速缓存大小的情况下增加集合高速缓存集上可用插槽的数量意味着该集合将链接到更大的内存块,由于刷新次数增加,有效地降低了效率。
另一方面,增加缓存大小意味着每个集合中会有更多行(假设集合大小也增加了)。这意味着每个存储块有更多数量的链接高速缓存行。通常,这会增加命中率,但是可以提高整体数字的限制是有限的。