标题：指令缓存
技术简介
  CPU缓存（Cache Memory）位于CPU与内存之间的临时存储器，它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分，但这一小部分是短时间内CPU即 将访问的，当CPU调用大量数据时，就可避开内存直接从缓存中调用，从而加快读取速度。由此可见，在CPU中加入缓存是一种高效的解决方案，这样整个内存储器（缓存+内存）就变成了既有缓存的高速度，又有内存的大容量的存储系统了。缓存对CPU的性能影响很大，主要是因为CPU的数据交换顺序和CPU与缓 存间的带宽引起的。　 
缓存的工作原理是当CPU要读取一个数据时，首先从缓存中查找，如果找到就立即读取并送给CPU处理；如果没有找到，就用相对慢的速度从内存中 读取并送给CPU处理，同时把这个数据所在的数据块调入缓存中，可以使得以后对整块数据的读取都从缓存中进行，不必再调用内存。 
正是这样的读取机制使CPU读取缓存的命中率非常高（大多数CPU可达90%左右），也就是说CPU下一次要读取的数据90%都在缓存中，只有 大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间，也使CPU读取数据时基本无需等待。总的来说，CPU读取数据的顺序是先缓存后内存。 
最早先的CPU缓存是个整体的，而且容量很低，英特尔公司从Pentium时代开始把缓存进行了分类。当时集成在CPU内核中的缓存已不足以满 足CPU的需求，而制造工艺上的限制又不能大幅度提高缓存的容量。因此出现了集成在与CPU同一块电路板上或主板上的缓存，此时就把 CPU内核集成的缓 存称为一级缓存，而外部的称为二级缓存。一级缓存中还分指令缓存（I-Cache）和数据缓存（D-Cache）。二者分别用来存放数据和执行这些数据的 指令，而且两者可以同时被CPU访问，减少了争用Cache所造成的冲突，提高了处理器效能。英特尔公司在推出Pentium 4处理器时，还新增了一种一级追踪缓存，容量为12KB.
随着CPU制造工艺的发展，二级缓存也能轻易的集成在CPU内核中，容量也在逐年提升。再用集成在CPU内部与否来定义一、二级缓存，已不 确切。而且随着二级缓存被集成入CPU内核中，以往二级缓存与CPU大差距分频的情况也被改变，此时其以相同于主频的速度工作，可以为CPU提供更高的传 输速度。
二级缓存是CPU性能表现的关键之一，在CPU核心不变化的情况下，增加二级缓存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二级缓存上有差异，由此可见二级缓存对于CPU的重要性。
CPU在缓存中找到有用的数据被称为命中，当缓存中没有CPU所需的数据时（这时称为未命中），CPU才访问内存。从理论上讲，在一颗拥有二级 缓存的CPU中，读取一级缓存的命中率为80%。也就是说CPU一级缓存中找到的有用数据占数据总量的80%，剩下的20%从二级缓存中读取。由于不能准 确预测将要执行的数据，读取二级缓存的命中率也在80%左右（从二级缓存读到有用的数据占总数据的16%）。那么还有的数据就不得不从内存调用，但这已经 是一个相当小的比例了。
较高端的CPU中，还会带有三级缓存，它是为读取二级缓存后未命中的数据设计的—种缓存，在拥有三级缓存的CPU中，只有约 5%的数据需要从内存中调用，这进一步提高了CPU的效率。
Intel二级缓存
Intel的双核心CPU主要有Pentium D、Pentium EE、Core Duo三种，其中Pentium D、Pentium EE的二级缓存方式完全相同。Pentium D和Pentium EE的二级缓存都是CPU内部两个内核具有互相独立的二级缓存，其中，8xx系列的Smithfield核心CPU为每核心1MB，而9xx系列的 Presler核心CPU为每核心2MB。这种CPU内部的两个内核之间的缓存数据同步是依靠位于主板北桥芯片上的仲裁单元通过前端总线在两个核心之间传 输来实现的，所以其数据延迟问题比较严重，性能并不尽如人意。
Core Duo使用的核心为Yonah，它的二级缓存则是两个核心共享2MB的二级缓存，共享式的二级缓存配合Intel的“Smart cache”共享缓存技术，实现了真正意义上的缓存数据同步，大幅度降低了数据延迟，减少了对前端总线的占用，性能表现不错，是双核心处理器上最先进的二级缓存架构。今后Intel的双核心处理器的二级缓存都会采用这种两个内核共享二级缓存的“Smart cache”共享缓存技术。
AMD双二级缓存
Athlon 64 X2 CPU的核心主要有Manchester和Toledo两种，他们的二级缓存都是CPU内部两个内核具有互相独立的二级缓存，其中，Manchester 核心为每核心512KB，而Toledo核心为每核心1MB。处理器内部的两个内核之间的缓存数据同步是依靠CPU内置的System Request Interface(系统请求接口，SRI)控制，传输在CPU内部即可实现。这样一来，不但CPU资源占用很小，而且不必占用内存总线资源，数据延迟也 比Intel的Smithfield核心和Presler核心大为减少，协作效率明显胜过这两种核心。不过，由于这种方式仍然是两个内核的缓存相互独立， 从架构上来看也明显不如以Yonah核心为代表的Intel的共享缓存技术Smart Cache。
二级缓存事项
缓存是数据由内存通往CPU的桥梁。它的速度比内存快得多，但是容量也比内存小的多。同时缓存依据读取速度和容量进一步分为一级和二级。在CPU需要数据的时候，遵循一级缓存—〉二级缓存—〉内存的顺序，从而尽量提高读取速度。这样“缓存+内存”的系统就同时兼具了速度和容量的优点。二级缓存容量对性能的影响是渐渐减弱的，当二级缓存从没有增长到128KB时，带来的性能提升可能是直线上升的。但是当它从2MB增长到4MB的时候，可能使用者甚至感觉不到性能的提升。这是因为在当前CPU所处理数据的过程中，几乎无时不刻需要用到128KB以下的缓存，但是需要用到1MB以上缓存的时候很少（2%左右）。因此虽然二级缓存越涨越大，实际上对CPU性能的影响却是越来越小的。因此，完全不必要盲目追求二级缓存的高容量，够用就好。​
指令缓存和指令追踪缓存
缓存存储的内容不止是数据，也包括指令，但是由于指令具备的以下性质，导致指令缓存的机制远没有数据缓存那么复杂：
需要执行的代码量通常都是比较固定的，和问题的复杂度有关 程序指令通常由编译器产生，产生过程中就能得到一定的优化 相比数据存取机制，程序流程的可预测度要强得多，更有利于prefeching 代码一般都具有很好的空间和时间局部性 
随着技术的发展，CPU的执行过程都流水化了，指令的执行都是分成阶段的，一开始安心等在指令缓存中，等待被处理单元执行时才取出，然后解码，准备相关参数，最后执行。这种过程有两个缺点，首先某些 x86 指令非常复杂，经由解码器时需耗费太多的时间来解码，尤其是以X86为代表的CISA家族，最糟的情况下所有解码单元忙于解码复杂指令，以至于阻碍处理器的执行管道。另一个问题则是如果在小循环的代码中，每当这些代码进入执行路径几次，编码就得进行几次，造成时间的浪费。而且大家知道的流水管线是越做越长，这也就意味着，一旦流水线遭遇不测发生中断，或者出现分枝预测的错误，造成的延时就会很大。可以说，这算是一个一直困扰CPU设计人员的问题。
从Pentium 4开始，Intel采用了一种新的缓存类型，叫trace cache，俗称指令追踪缓存。这玩意不是用来和一般的指令缓存一样存储指令的原始字节序列，而是被用来存储解码单元送出来的微操作。
指令追踪缓存位于指令解码器和内核第一层计算管线之间，指令在解码单元内获取和解码之后，微操作必须先经过追踪缓存的存储和和输出，才能到达内核第一层计算管线被执行。这样可以有效弥补上述两个缺点，因为此时所取的都是解码后的指令，还避免了指令的重复调用。更重要的是，追踪缓存确保处理器管道持续处于指令满载的状态，避免执行路径由于解码单元延迟的情况。应该说，指令追踪缓存确实是一个值得称道的技术。
当然，这些分析都是基于L1I缓存分析的，至于L2的缓存，因为是数据和指令统一存储，自然就不可能作出和追踪缓存类似的架构了。​
CPU的L1指令缓存和L1高速缓存的关系
L1高速缓存，也就是我们经常说的一级高速缓存。在CPU里面内置了高速缓存可以提高CPU的运行效率。内置的L1高速缓存的容量和结构对CPU的性能影响较大，不过高速缓冲存储器均由静态RAM组成，结构较复杂，在CPU管芯面积不能太大的情况下，L1级高速缓存的容量不可能做得太大。采用回写(Write Back)结构的高速缓存。它对读和写*作均有可提供缓存。而采用写通(Write-through)结构的高速缓存，仅对读*作有效。在486以上的计算机中基本采用了回写式高速缓存。在目前流行的处理器中，奔腾Ⅲ和Celeron处理器拥有32KB的L1高速缓存，奔腾4为8KB，而AMD的Duron和Athlon处理器的L1高速缓存高达128KB。 
L2高速缓存，指CPU第二层的高速缓存，第一个采用L2高速缓存的是奔腾 Pro处理器，它的L2高速缓存和CPU运行在相同频率下的，但成本昂贵，市场生命很短，所以其后奔腾 II的L2高速缓存运行在相当于CPU频率一半下的。接下来的Celeron处理器又使用了和CPU同速运行的L2高速缓存，现在流行的CPU,无论是AthlonXP和奔腾4，其L2高速缓存都是和CPU同速运行的。除了速度以外，L2高速缓存容量也会影响CPU的性能，原则是越大越好，现在家庭用CPU容量最大的是512KB，而服务器和工作站上用CPU的L2高速缓存更高达1MB-3MB。 
cpuL1缓存首先是CPU的内部结构决定，CPU是由硅晶原片切割而成的，一块晶原片切割的CPU块有限，所以一个CPU的结构要非常合理地搭配L1，L2缓存大小，P4640比P4630高频，所以内部结构有所不同。而L1缓存的作用是数据交换的“超高速”通道，所以其大小不是重点，内部参数才是关键，只要参数（CL值，延迟等）够快，完全可以弥补大小的差距，像P-M 1。7G的CPU由于L1缓存的参数够高，虽然容量有不足，但在性能测试上L1缓存的速度比P4 630快的多。所以不必刻意要求L1缓存大小。（另外，CPU的缓存速度比一般内存快的多，大概快几十倍）
高速缓存英文是cache。一种特殊的存储器子系统，其中复制了频繁使用的数据，以利于CPU快速访问。存储器的高速缓冲存储器存储了频繁访问的 RAM 位置的内容及这些数据项的存储地址。当处理器引用存储器中的某地址时，高速缓冲存储器便检查是否存有该地址。如果存有该地址，则将数据返回处理器；如果没有保存该地址，则进行常规的存储器访问。因为高速缓冲存储器总是比主RAM 存储器速度快，所以当 RAM 的访问速度低于微处理器的速度时，常使用高速缓冲存储器。
技术应用
为了提高高速DSP或通用处理器的程序执行速度,描述了一种指令缓存单元的有效架构,特别是实现细节和性能分析.因所提出的指令缓存单元是为一种高性能VLIW结构的DSP核而设计,使用了并行的标签比较逻辑和寄存器堆的结构,芯片面积、关键路径延迟、功耗都大大减小.该指令缓存单元使用高层次的RTL(使用Verilog)编码,并由Synopsys的Design Compiler综合,使用不同的StarCoreTM基准程序测试比较,并进行性能分析.比较结果表明,所提出的结构是有效的,适合用于任何高速的处理器。
一级指令缓存
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处理器在使用超线程技术时会导致性能下降的重要原因[1]。
三级指令缓存

  三级缓存机构图三级指令缓存是为读取二级缓存后未命中的数据设计的—种缓存，在拥有三级缓存的CPU中，只有约5%的数据需要从内存中调用，这进一步提高了CPU的效率。运作原理其运作原理在于使用较快速的储存装置保留一份从慢速储存装置中所读取数据且进行拷贝，当有需要再从较慢的储存体中读写数据时，CACHE能够使得读写的动作先在快速的装置上完成，如此会使系统的响应较为快速。 三级缓存分类Cache(三级缓存)，分为两种，早期的是外置，以后的升级产品都是内置的。而它的实际作用即是，L3缓存的应用可以进一步降低内存延迟，同时提升大数据量计算时处理器的性能。降低内存延迟和提升大数据量计算能力对游戏都很有帮助。而在服务器领域增加L3缓存在性能方面仍然有显著的提升。比方具有较大L3缓存的配置利用物理内存会更有效，故它比较慢的磁盘I/O子系统可以处理更多的数据请求。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。
其实最早的L3缓存被应用在AMD发布的K6-III处理器上，当时的L3缓存受限于制造工艺，并没有被集成进芯片内部，而是集成在主板上。在只能够和系统总线频率同步的L3缓存同主内存其实差不了多少。后来使用L3缓存的是英特尔为服务器市场所推出的Itanium处理器。接着就是P4EE和至强MP。Intel还打算推出一款9MB L3缓存的Itanium2处理器，和以后24MB L3缓存的双核心Itanium2处理器。 
但基本上L3缓存对处理器的性能提高显得不是很重要，比方配备1MB L3缓存的Xeon MP处理器却仍然不是Opteron的对手，由此可见前端总线的增加，要比缓存增加带来更有效的性能提升
一级指令缓存，一级数据缓存和二级缓存的区别一级缓存（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的一级缓存表示方法以此类推。 
二级缓存是CPU性能表现的关键之一，在CPU核心不变化的情况下，增加二级缓存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二级缓存上有差异，由此可见二级缓存对于CPU的重要性。