简介
CPU快取(Cache Memory)是位于CPU与记忆体之间的临时存储器,它的容量比记忆体小得多但是交换速度却比记忆体要快得多。快取的出现主要是为了解决CPU运算速度与记忆体读写速度不匹配的矛盾,因为CPU运算速度要比记忆体读写速度快很多,这样会使CPU花费很长时间等待资料到来或把资料写入记忆体。在快取中的资料是记忆体中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量资料时,就可避开程式直接从记忆体中调用,从而加快读取速度。由此可见,在CPU中加入快取是一种高效的解决方案,这样整个记忆体储器(快取+记忆体)就变成了既有快取的高速度,又有记忆体的大容量的存储系统了。快取对CPU的性能影响很大,主要是因为CPU的资料交换顺序和CPU与快取间的频宽引起的。
原理
快取的工作原理是当CPU要读取一个资料时,首先从快取中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从记忆体中读取并送给CPU处理,同时把这个资料所在的资料块调入快取中,可以使得以后对整块资料的读取都从快取中进行,不必再调用记忆体。 正是这样的读取机製使CPU读取快取的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的资料90%都在快取中,只有大约10%需要从记忆体读取。这大大节省了CPU直接读取记忆体的时间,也使CPU读取资料时基本无需等待。总的来说,CPU读取资料的顺序是先快取后记忆体。
目前快取基本上都是採用SRAM存储器,SRAM是英文Static RAM的缩写,它是一种具有静态存取功能的存储器,不需要重新整理电路即能储存它内部存储的资料。不像DRAM记忆体那样需要重新整理电路,每隔一段时间,固定要对DRAM重新整理充电一次,否则内部的资料即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM记忆体可以设计为较小的体积,但是SRAM却需要很大的体积,这也是目前不能将快取容量做得太大的重要原因。它的特点归纳如下:优点是节能、速度快、不必配合记忆体重新整理电路、可提高整体的工作效率,缺点是集成度低、相同的容量体积较大、而且价格较高,只能少量用于关键性系统以提高效率。
分类
按照资料读取顺序和与CPU结合的紧密程度,CPU快取可以分为一级快取,二级快取,部分高端CPU还具有三级快取,每一级快取中所储存的全部资料都是下一级快取的一部分,这三种快取的技术难度和製造成本是相对递减的,所以其容量也是相对递增的。当CPU要读取一个资料时,首先从一级快取中查找,如果没有找到再从二级快取中查找,如果还是没有就从三级快取或记忆体中查找。一般来说,每级快取的命中率大概都在80%左右,也就是说全部资料量的80%都可以在一级快取中找到,只剩下20%的总资料量才需要从二级快取、三级快取或记忆体中读取,由此可见一级快取是整个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对比中,分别对比各种功能快取大小才有一定的意义。
作用
但是一级快取和二级快取的大,它究竟有多少好处呢?你得告诉我们经销商,实际上你得用最普通的话跟他讲。所以我们给他们打个比方,说这个就好比你开汽车的时候,后备箱是整个的二级快取,假如说扶手裏面有一个小箱子,那是你的一级快取。一级快取大好在哪裏呢?就是你随时开车的时候,随时在裏面都可以取东西了。假如你一级快取小的话,你还得把车停下来,到后备箱裏取东西。
首先我们来简单了解一下一级快取。目前所有主流处理器大都具有一级快取和二级快取,少数高端处理器还集成了三级快取。其中,一级快取可分为一级指令快取和一级资料快取。一级指令快取用于暂时存储并向CPU递送各类运算指令;一级资料快取用于暂时存储并向CPU递送运算所需资料,这就是一级快取的作用。
那麽,二级快取的作用又是什麽呢?简单地说,二级快取就是一级快取的缓沖器:一级快取製造成本很高因此它的容量有限,二级快取的作用就是存储那些CPU处理时需要用到、一级快取又无法存储的资料。同样道理,三级快取和记忆体可以看作是二级快取的缓沖器,它们的容量递增,但单位製造成本却递减。需要注意的是,无论是二级快取、三级快取还是记忆体都不能存储处理器操作的原始指令,这些指令只能存储在CPU的一级指令快取中,而余下的二级快取、三级快取和记忆体仅用于存储CPU所需资料。
资料快取设计
根据工作原理的不同,目前主流处理器所採用的一级资料快取又可以分为实资料读写快取和资料代码指令追蹤快取2种,它们分别被AMD和Intel所採用。不同的一级资料快取设计对于二级快取容量的需求也各不相同,下面让我们简单了解一下这两种一级资料快取设计的不同之处。
AMD快取设计
AMD採用的一级快取设计属于传统的"实资料读写快取"设计。基于该架构的一级资料快取主要用于存储CPU最先读取的资料;而更多的读取资料则分别存储在二级快取和系统记忆体当中。做个简单的假设,假如处理器需要读取"AMD ATHLON 64 3000+ IS GOOD"这一串资料(不记空格),那麽首先要被读取的"AMDATHL"将被存储在一级资料快取中,而余下的"ON643000+ISGOOD"则被分别存储在二级快取和系统记忆体当中(如下图所示)。
需要注意的是,以上假设只是对AMD处理器一级资料快取的一个抽象描述,一级资料快取和二级快取所能存储的资料长度完全由快取容量的大小决定,而绝非以上假设中的几个位元组。"实资料读写快取"的优点是资料读取直接快速,但这也需要一级资料快取具有一定的容量,增加了处理器的製造难度(一级资料快取的单位製造成本较二级快取高)。
Intel快取设计
自P4时代开始,Intel开始採用全新的"资料代码指令追蹤快取"设计。基于这种架构的一级资料快取不再存储实际的资料,而是存储这些资料在二级快取中的指令代码(即资料在二级快取中存储的起始地址)。假设处理器需要读取"INTEL P4 IS GOOD"这一串资料(不记空格),那麽所有资料将被存储在二级快取中,而一级资料代码指令追蹤快取需要存储的仅仅是上述资料的起始地址(如下图所示)。
由于一级资料快取不再存储实际资料,因此"资料代码指令追蹤快取"设计能够极大地降低CPU对一级资料快取容量的要求,降低处理器的生产难度。但这种设计的弊端在于资料读取效率较"实资料读写快取设计"低,而且对二级快取容量的依赖性非常大。


















