缓冲/存储技术
本文主要是关于二级缓存的介绍,并探讨了二级缓存的速度大小及其大小上限。
CPU二级缓存是更具CPU的型号来定位的,没有固定值。
缓存大小也是CPU的重要指标之一,且缓存的结构和大小对CPU速度的影响大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率大于系统内存和硬盘。工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可大幅度提升CPU内部读取数据的命中率,而不用到内存或者硬盘上寻找,提高系统性能。CPU芯片面积和成本的因素来考虑,缓存很小。
L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,高速缓冲存储器均由静态RAM组成,结构较复杂,在CPU管芯面积不太大的情况下,L1级高速缓存的容量不能做得太大。
一般服务器CPU的L1缓存的容量通常在32—256KB。
L2 Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片。内部的芯片二级缓存运行速度与主频相同,而外部的二级缓存则只有主频的一半。L2高速缓存容量也会影响CPU的性能,原则是越大越好,现在家庭用CPU容量最大的是512KB,而服务器和工作站上用CPU的L2高速缓存更高达25。
我们都知道,CPU的运算速度是非常快的,而且远比硬盘要快的多,这样在实际运算过程中就产生了一个问题,由于硬盘的读写速度远远跟不上CPU的运算速度,这样在这两者之间就会出现断档,也就是CPU在处理完一部分数据后就没用工作可做,要等待硬盘把后续数据传输过来之后才能继续工作,这样显然会影响CPU的工作效率,这才最初期的电脑当中体现的还不是很明显,随着电脑的发展,这种断档越来越大,于是就产生了内存,内存的原理就是一个缓冲存储,电脑在运行程序时,先将要处理的数据由硬盘转移到内存中,然后再由内存传送给CPU,由于内存的速度要远大于硬盘(但是也还是赶不上CPU的运算速度),所以之前我们提到的断档问题就在一定程度上得到了结局,不过由于存储原理和制作工艺、还有成本的问题,内存并不能够像硬盘用作大容量数据存储。
以上的内存的原理,接下来的高速缓存就类似了,由于内存的速度也比不上CPU的运算速度,所以就诞生了Cache,与内存和硬盘这类存储设备不同,Cache是集成在CPU内部的,而且制作工艺更加先进,所以速度非常之快,从LZ的软件测试结果中也能看出来,它能够更好的解决硬盘和CPU的断档问题,但是由于Cache的制作工艺更加困难,所以直到现在还处在MB级别上。
其实在一个程序的运行当中,有部分数据是需要反复运算的,也就是说有一部分数据的使用频率高,于是电脑会根据使用频率的不同,把最常用到得一部分数据放在Cache中,其次在内存,最后才在硬盘上,这样CPU在计算时,首先扫描Cache,如果没有找到所需要的数据,它才会一次扫描内存和硬盘,这样就可以大量减少数据检索、传输的速度,也就是减少数据存储与计算间的断档。
随着技术的发展,Cache中也出现了一级Cache、二级Cache之分,在高端CPU中,还会有三级Cache,他们都是为了减少数据断档,提高CPU的速度而存在的,一级最快,二级次之,三级再次,但是只要是Cache,都肯定要比内存的硬盘更快,LZ试想一下,按照我上段所说的计算原理,如果你只有一级Cache,这样CPU如果在Cache中没有找到要用的数据,它就会到速度比Cache慢上很多的内存中去寻找,这样数据的检索与传输速度立刻就降下了一大截,而如果你有二级甚至三级Cache的话,CPU会按照一级Cache——>二级Cache——>三级Cache——>内存——>硬盘的顺序寻找数据,这样就可以最大程度的减少数据断档了。
在现阶段的CPU产品中,一级缓存的容量基本在4KB到64KB之间,二级缓存的容量分为128KB、256KB、512KB、1MB、2MB等。一级缓存容量各产品之间相差不大,而二级缓存容量则是提高CPU性能的关键。二级缓存容量的提升是由CPU制造工艺所决定的,容量增大必然导致CPU内部晶体管数的增加,要在有限的CPU面积上集成更大的缓存,对制造工艺的要求也就越高历年来Intel都是通过二级缓存的大小来划分产品线,初期只有奔腾和赛扬两种规格,到了酷睿2时代Intel达到了登峰造极的境界:仅仅是双核产品就拥有512K、1M、2M、3M、4M、6M多达六个版本,四核产品也有4M、6M、8M、12M四个版本,令人眼花缭乱!而三级缓存从2MB增加到6MB!
英特尔处理器在游戏方面历来就是二级缓存非常的敏感,其实这与一级缓存的设计是分不开的。英特尔的处理器采用的是“数据代码指令追踪缓存”设计,基于这种架构设计的的一级缓存不存储实际的数据,而仅仅存储这些数据在二级缓存中的指令代码,如此一来,所有数据都将被存储到二级缓存中,而一级数据所需要存储的仅仅是数据在二级缓存中的起始地址而已。由于一级数据缓存不再存储实际数据,因此该设计能够在很大程度上降处理器对一级缓存容量的要求,进而降低处理器的生产难度和成本,这也就可以解释了为什么酷睿2处理器的一级缓存仅仅为32KB+32KB。此时我们也就可以知道这种设计的弊端,那就是处理器对于二级缓存的容量会有很大的依赖,也因此使得英特尔处理器对于二级缓存非常的敏感。
AMD处理器的一级缓存设计采用的是传统的“实数据读写缓存”设计,基于该设计的一级缓存主要用于存储CPU最先读取的数据,而其余的预读取数据则分别存储在二级缓存和系统内存当中。这种设计的有点在于更加直接快速的读取数据,缺点在于对一级缓存的容量有更高的要求,同时增加了处理器的制造难度和成本(因为一级缓存集成在处理器内核的内部,二级缓存则独立存在于处理器内核的外部,并且一级缓存的成本要高于二级缓存)。以AMD Athlon 64处理器为例,由于其已经具备了64KB一级指令缓存和64KB一级数据缓存,只要处理器的二级缓存容量大于等于128KB就能够存储足够的数据和指令,正是因为这个设计,让AMD的处理器对于二级缓存并不如英特尔处理器那样敏感。
通过前面的测试我们对于二级缓存对英特尔酷睿2处理器性能的影响有了一个清楚的认识,在网络办公、音视频编解码处理等方面,当二级缓存达到一定的容量时,提高二级缓存容量并不会给处理器带来什么明显的性能提升。而在3D游戏这种对处理器浮点运算能力要求很高的应用中,二级缓存的增加无疑会更好的提高性能。当然在这里我们还有一点是不能否认的,那就是更高的二级缓存对于多核心处理器来说还是具有无法替代的助力。
我们知道,CPU执行指令时,会将执行结果放在一个叫“寄存器”的元件中,由于“寄存器”集成在CPU内部,与ALU等构成CPU的重要元件,因此寄存器中的指令很快被CPU所访问,但毕竟寄存器的容量太小,CPU所需的大量指令和数据还在内存(RAM)当中,所以CPU为了完成指令操作,需要频繁地向内存发送接收指令、数据。
由于内存的处理速度远远低于CPU,所以传统的系统瓶颈在这里就产生了,CPU在处理指令时往往花费很多时间在等待内存做准备工作。
为了解决这个问题,人们在CPU内集成了一个比内存快许多的“Cache”,这就是最早的“高速缓存”。
L1高速缓存是与CPU完全同步运行的存储器,也就是我们常说的一级缓存,如果CPU需要的数据和指令已经在高速缓存中了,那么CPU不必等待,直接就可以从一级缓存(L1)中取得数据,如果数据不在L1中,CPU再从二级缓存(L2)中提取数据,大大提高了系统的工作效率。
没有CPU缓存前
我们可以形象地把CPU的运算单元想象成是一间坐落在城市中心的工厂,把内存看成是工厂设置在郊区的一间面积很大的仓库A。
工厂生产所需要的原材料每次都要花时间去远处的仓库A调运,而且到达仓库后,还要等待仓库准备好材料,中间浪费了不少时间。这就是CPU频率未变的情况下,CPU与内存的数据交换不同步的现象。
而突然有一天,由于资金短缺,仓库A从近郊区“搬到”了远郊区,这样原料和成品在工厂与仓库A之间的运输所花费的时间就更长了,工厂生产所需的原料供应不足,经常处于空运转的状态下。这就是说当CPU频率增加后,CPU与内存交换数据等待需时间会变得更长
增加L1 Cache
要解决CPU与内存交换数据不同步这个系统瓶颈问题,其中一个办法是在靠近工厂的市区设置一个小型的仓库B(L1 Cache)。
平时把生产最迫切需要、用得最多的原材料(指令和数据)从仓库A(内存)调配到仓库B(L1 Cache),这样工厂生产所需要的原材料就可以很快地调配过来,减少空运转的时间。当所需的原材料在仓库B中找不到(缓存未命中)时,仍然要到仓库A(内存)里调配,虽然无可避免地使工厂又进入空运转,或部分空运转(CPU等待若干个时钟周期),但这样毕竟使等待时间大大降低了。
小知识:缓存有一个“预读”功能,也就是可以通过一定的算法,猜测接下来所要的数据,并预先取入缓存。
再添L2 Cache
随着CPU的频率提高,与内存之间交换数据不同步的现象更明显了,可以理解为仓库A(内存)搬离郊区,迁到更远的地方了。解决这一问题的一个更好的办法就是在城市的边缘再设立一个比仓库B大的仓库C,也就是我们说的二级缓存。
它的作用是把郊区之外的仓库A(内存)中最迫切用的材料(指令)运到仓库C,而工厂如果在仓库B中找不到所需的材料,就可以到仓库C中找,而不必老远跑到仓库A那里找,节省了不少时间。
通常情况下,L2包括L1所有的数据,另外还有一些附加的数据。换言之,L1与L2、L2与内存之间是子母关系,所以CPU缓存的出现更有效地解决了CPU空等待所造成的资源浪费问题。
关于二级缓存的相关介绍就到这了,如有不足之处欢迎指正。
全部0条评论
快来发表一下你的评论吧 !