快取( 三 )


快取

文章插图
快取的工作方式举个简单的例子,比如在播放DVD影片的时候,DVD数据由一系列位元组组成,这个时候CPU会依次从头处理到尾地调用DVD数据,如果CPU这次读取DVD数据为1分30秒,那幺下次读取的时候就会从1分31秒开始,因此这种情况下有序排列的数据都是依次被读入CPU进行处理 。从数据上来看,对于Word一类的应用程式通常都有着较好的空间局部性 。用户在使用中不会一次打开7、8个文档,不会在其中某一个文档中打上几个词就换另一个 。大多数用户都是打开一两个文档,然后就是长时间对它们进行处理而不会做其他事情 。这样在记忆体中的数据都会集中在一个区域中,也就可以被CPU集中处理 。从程式代码上来考虑,设计者通常也会儘量避免出现程式的跳跃和分支,让CPU可以不中断地处理大块连续数据 。游戏、模拟和多媒体处理程式通常都是这方面的代表,以小段代码连续处理大块数据 。不过在办公运用程式中,情况就不一样了 。改动字型,改变格式,保存文档,都需要程式代码不同部分起作用,而用到的指令通常都不会在一个连续的区域中 。于是CPU就不得不在记忆体中不断跳来跳去寻找需要的代码 。这也就意味着对于办公程式而言,需要较大的快取来读入大多数经常使用的代码,把它们放在一个连续的区域中 。如果快取不够,就需要快取中的数据,而如果快取足够大的话,所有的代码都可以放入,也就可以获得最高的效率 。同理,高端的数据套用以及游戏套用则需要更高容量的快取 。CPU快取介绍CPU快取(Cache Memory)是位于CPU与记忆体之间的临时存储器,它的容量比记忆体小的多但是交换速率却比记忆体要快得多 。快取的出现主要是为了解决CPU运算速率与记忆体读写速率不匹配的矛盾,因为CPU运算速率要比记忆体读写速率快很多,这样会使CPU花费很长时间等待数据到来或把数据写入记忆体 。在快取中的数据是记忆体中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开记忆体直接从快取中调用,从而加快读取速率 。由此可见,在CPU中加入快取是一种高效的解决方案,这样整个记忆体储器(快取+记忆体)就变成了既有快取的高速率,又有记忆体的大容量的存储系统了 。快取对CPU的性能影响很大,主要是因为CPU的数据交换顺序和CPU与快取间的频宽引起的 。
快取

文章插图
CPU快取快取基本上都是採用SRAM存储器,SRAM是英文Static RAM的缩写,它是一种具有静态存取功能的存储器,不需要刷新电路即能保存它内部存储的数据 。不像DRAM记忆体那样需要刷新电路,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM记忆体可以设计为较小的体积,但是SRAM却需要很大的体积,这也是不能将快取容量做得太大的重要原因 。它的特点归纳如下:优点是节能、速率快、不必配合记忆体刷新电路、可提高整体的工作效率,缺点是集成度低、相同的容量体积较大、而且价格较高,只能少量用于关键性系统以提高效率 。工作原理1、读取顺序CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从记忆体中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用记忆体 。正是这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从记忆体读取 。这大大节省了CPU直接读取记忆体的时间,也使CPU读取数据时基本无需等待 。总的来说,CPU读取数据的顺序是先Cache后记忆体 。2、快取分类Intel从Pentium开始将Cache分开,通常分为一级高速快取L1和二级高速快取L2 。在以往的观念中,L1 Cache是集成在CPU中的,被称为片内Cache 。在L1中还分数据Cache(D-Cache)和指令Cache(I-Cache) 。它们分别用来存放数据和执行这些数据的指令,而且两个Cache可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能 。3、读取命中率CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问记忆体 。从理论上讲,在一颗拥有2级Cache的CPU中,读取L1 Cache的命中率为80% 。也就是说CPU从L1 Cache中找到的有用数据占数据总量的80%,剩下的20%从L2 Cache读取 。由于不能準确预测将要执行的数据,读取L2的命中率也在80%左右(从L2读到有用的数据占总数据的16%) 。那幺还有的数据就不得不从记忆体调用,但这已经是一个相当小的比例了 。在一些高端领域的CPU(像Intel的Itanium)中,我们常听到L3 Cache,它是为读取L2 Cache后未命中的数据设计的—种Cache,在拥有L3 Cache的CPU中,只有约5%的数据需要从记忆体中调用,这进一步提高了CPU的效率 。一级快取一级快取(Level 1 Cache)简称L1 Cache,位于CPU核心的旁边,是与CPU结合最为紧密的CPU快取,也是历史上最早出现的CPU快取 。由于一级快取的技术难度和製造成本最高,提高容量所带来的技术难度增加和成本增加非常大,所带来的性能提升却不明显,性价比很低,而且现有的一级快取的命中率已经很高,所以一级快取是所有快取中容量最小的,比二级快取要小得多 。一级快取可以分为一级数据快取(Data Cache,D-Cache)和一级指令快取(Instruction Cache,I-Cache) 。二者分别用来存放数据以及对执行这些数据的指令进行即时解码,而且两者可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能 。大多数CPU的一级数据快取和一级指令快取具有相同的容量,例如AMD的Athlon XP就具有64KB的一级数据快取和64KB的一级指令快取,其一级快取就以64KB+64KB来表示,其余的CPU的一级快取表示方法以此类推 。Intel的採用NetBurst架构的CPU(最典型的就是Pentium 4)的一级快取有点特殊,使用了新增加的一种一级追蹤快取(Execution Trace Cache,T-Cache或ETC)来替代一级指令快取,容量为12KμOps,表示能存储12K条即12000条解码后的微指令 。一级追蹤快取与一级指令快取的运行机制是不相同的,一级指令快取只是对指令作即时的解码而并不会储存这些指令,而一级追蹤快取同样会将一些指令作解码,这些指令称为微指令(micro-ops),而这些微指令能储存在一级追蹤快取之内,无需每一次都作出解码的程式,因此一级追蹤快取能有效地增加在高工作频率下对指令的解码能力,而μOps就是micro-ops,也就是微型操作的意思 。它以很高的速率将μops提供给处理器核心 。Intel NetBurst微型架构使用执行跟蹤快取,将解码器从执行循环中分离出来 。这个跟蹤快取以很高的频宽将uops提供给核心,从本质上适于充分利用软体中的指令级并行机制 。Intel并没有公布一级追蹤快取的实际容量,只知道一级追蹤快取能储存12000条微指令(micro-ops) 。所以,不能简单地用微指令的数目来比较指令快取的大小 。实际上,单核心的NetBurst架构CPU使用8Kμops的快取已经基本上够用了,多出的4kμops可以大大提高快取命中率 。而要使用超执行绪技术的话,12KμOps就会有些不够用,这就是为什幺有时候Intel处理器在使用超执行绪技术时会导致性能下降的重要原因 。例如Northwood核心的一级快取为8KB+12KμOps,就表示其一级数据快取为8KB,一级追蹤快取为12KμOps;而Prescott核心的一级快取为16KB+12KμOps,就表示其一级数据快取为16KB,一级追蹤快取为12KμOps 。在这里12KμOps绝对不等于12KB,单位都不同,一个是μOps,一个是Byte(位元组),而且二者的运行机制完全不同 。所以那些把Intel的CPU一级快取简单相加,例如把Northwood核心说成是20KB一级快取,把Prescott核心说成是28KB一级快取,并且据此认为Intel处理器的一级快取容量远远低于AMD处理器128KB的一级快取容量的看法是完全错误的,二者不具有可比性 。在架构有一定区别的CPU对比中,很多快取已经难以找到对应的东西,即使类似名称的快取在设计思路和功能定义上也有区别了,此时不能用简单的算术加法来进行对比;而在架构极为近似的CPU对比中,分别对比各种功能快取大小才有一定的意义 。二级快取二级快取(Level2cache),它是处理器内部的一些缓冲存储器,其作用跟记忆体一样 。上溯到上个世纪80年代,由于处理器的运行速率越来越快,慢慢地,处理器需要从记忆体中读取数据的速率需求就越来越高了 。然而记忆体的速率提升速率却很缓慢,而能高速读写数据的记忆体价格又非常高昂,不能大量採用 。从性能价格比的角度出发,英特尔等处理器设计生产公司想到一个办法,就是用少量的高速记忆体和大量的低速记忆体结合使用,共同为处理器提供数据 。这样就兼顾了性能和使用成本的最优 。而那些高速的记忆体因为是处于cpu和记忆体之间的位置,又是临时存放数据的地方,所以就叫做缓冲存储器了,简称“快取” 。它的作用就像仓库中临时堆放货物的地方一样,货物从运输车辆上放下时临时堆放在快取区中,然后再搬到内部存储区中长时间存放 。货物在这段区域中存放的时间很短,就是一个临时货场 。最初快取只有一级,后来处理器速率又提升了,一级快取不够用了,于是就添加了二级快取 。二级快取是比一级快取速率更慢,容量更大的记忆体,主要就是做一级快取和记忆体之间数据临时交换的地方用 。为了适应速率更快的处理器p4ee,已经出现了三级快取了,它的容量更大,速率相对二级快取也要慢一些,但是比记忆体可快多了 。快取的出现使得cpu处理器的运行效率得到了大幅度的提升,这个区域中存放的都是cpu频繁要使用的数据,所以快取越大处理器效率就越高,同时由于快取的物理结构比记忆体複杂很多,所以其成本也很高 。