一、CPU缓存(Cache)
CPU处理的数据是来自于硬盘和内存,但随着CPU技术的发展,CPU的处理、运算能力已经大大超过了存储系统的供应能力,于是出现CPU在存储系统提供足够的数据前处于等待状态,而且每当CPU的频率提升这样的差距就更明显。那么在CPU等待期时,硬盘、内存所提供、准备供CPU处理的数据存放在哪里呢?其实这些数据都暂时存在CPU的缓存之内。
目前台式CPU的缓存分二级:L1(一级缓存)和L2(二级缓存),当处理器要读取数据时,首先要在L1缓存中查找,然后才在L2缓存中查找,最后才去系统内存查找。
每一级缓存中的数据都是下面一级数据的一部分,即L1缓存中的数据在L2缓存、系统内存、页文件中都有。由于CPU首先读取L1缓存中的数据,因此内置的L1高速缓存的容量和结构对中央处理器的性能影响较大,容量越大,性能也相对会提高不少。这也正是一些公司力争加大L1级高速缓存容量的原因。不过高速缓存均由静态随机存储器组成,结构较复杂(L1缓存是采用了速度非常高的SRAM,这种内存单晶元使用4到6个晶体管,比我们常见的内存芯片要复杂多了),受处理器内核面积、制造工艺的限制,L1缓存的容量不可能做得太大。而且当L1缓存增大到一定程度后性能便难以明显提高,因为CPU等待数据期间存在一个临界点──在处理器工作时,停滞时间长短保持为一个常量。此外,增大L1缓存也会使生产成本提高不少,在权衡成本和系统性能提升后,最好的方法应该是为L1缓存加附加缓存──即L2缓存。L2缓存位于L1缓存和系统内存之间,通常存储L1缓存中数据的扩充部分,而L1则主要存放的是CPU最常用的代码和数据(因此L1又分L1指令缓存、L1数据缓存),可以这么说,L1缓存是L2缓存的子集。
总的来说,较大的缓存带来的好处是可以减少访问相对较慢的系统内存的需求、改进文件系统效率并减少从主内存到较慢磁盘子系统的请求数量、提供更有效的文件系统缓存行为及较短消息和处理器队列长度。新一代CPU产品都在往大缓存方向发展:目前主流台式CPU的L2缓存已经提升到512KB,而迅驰移动处理器、Opteron处理器及未来的Prescott处理器的L2缓存将达1MB。
此外,为了进一步发挥缓存的效用、改进内存性能并使之与CPU发展同步来维护系统平衡,CPU生产厂商(如Intel)在CPU中使用了控制缓存的指令。这里有两类缓存控制指令。一类是数据预存取指令,能够增加从内存到缓存的数据流。数据预存取指令允许应用识别出所需的信息,并预先将它们从主存中取出存入缓存。这样一来,处理器便可以更快地获取信息,从而改进应用性能。另一类是内存流优化处理指令,能够增加从处理器到主存的数据流。内存流优化处理指令允许应用越过缓存直接访问内存。通常情况下,处理器写出的数据都将暂时存储在缓存中以备处理器稍后使用。如果处理器不再使用它们,数据最终将被移至内存。这两类指令都赋予了应用开发人员对缓存内容更大的控制能力,使他们能够控制缓存操作以满足其应用的需求。
注:鉴于缓存对CPU性能影响较大,目前缓存大小已经成为CPU厂商用来划分CPU等级的标准之一。
二、指令集
指令集是CPU所能执行的所有指令的集合,是提高处理器效率的最有效工具之一。目前随着新核心、新工艺的应用,新一代CPU的时钟频率提升到3GHz以上,但对于应用层面来说,新一代CPU是否能更有效地处理数据才是软件开发人员所最为关注的。虽然增加处理器内部的高速缓存容量可以提高在读/写方面的速度,不过这并不能从根本上解决问题:当数量巨大的数据需要处理时,过于冗杂的指令会严重影响电脑的工作效率。那么此时CPU中所使用、支持的指令集这时就起到了至关重要的作用了。从现阶段主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分。而从具体运用看,多媒体指令集又是其中我们最熟悉、最引人注目的一种。目前多媒体指令集主要有以下几种:
MMX指令集
MMX指令集是Intel在1996年开发的一项多媒体指令增强技术,其英文名称可以翻译为“多媒体扩展指令集”。它是为多媒体而建立的扩展指令集,使用MMX能够处理多媒体数据、图像和声音。支持MMX指令的处理器具有57条多媒体指令、8个64位的MMX寄存器。但MMX只能够处理整数类型,支持1、2、4、8字节的数据,也就是说MMX寄存器能够存储8组、4组、2组或1组操作数。被存储在MMX寄存器中的数据能够进行加、减、乘计算。MMX指令集是Pentium、PentiumⅡ时代的最主要标志之一。
3D Now!指令集
3D Now!是AMD推出的指令集,被AMD广泛应用于其K6-2、K6-3以及Athlon系列处理器。3DNow!指令集技术拥有21条机器码的扩展指令集,具有8个新的寄存器,应用于浮点数处理和几何运算,并且支持加法运算、乘法运算、除法运算、求精度平方根等操作方式。与Intel公司的MMX技术侧重于整数运算有所不同,3DNow!指令集主要针对三维建模、坐标变换和效果渲染等三维应用场合,在软件的配合下,可以大幅度提高3D处理性能。后来针对Intel的SEE指令集,AMD在Athlon上开发了Enhanced 3DNow!(也被称为3DNow!+)。在Enhanced 3DNow!中,AMD融入了一些SSE代码,指令也增加到52个,这样使用其CPU可以从针对SSE做最佳化的软件中获得更好的执行效能。总的来说,3D Now!指令集也相当出色,但由于当时的Intel在市场上具有传统的强势地位,因此一直得不到软件开发商的广泛支持。
SEE与SEE2指令集
SSE指令是Intel在PentiumⅢ处理器中推出的新一代指令集,它有70条指令,其中包含提高3D图形运算效率的50条SIMD浮点运算指令、12条MMX整数运算增强指令、8条优化内存中连续数据块传输指令。理论上这些指令对图像处理、浮点运算、3D运算、视频处理、音频处理等诸多多媒体应用起到全面优化的作用。支持SSE的处理器除了有配备标准的x87寄存器外,还需要有额外的8个128位寄存器,每个寄存器存放4个32位浮点数。能够对每个寄存器中的4个浮点数进行以下算术操作:两组浮点数相加、相减、相乘或相除;也可以反过来对浮点数求平方根。寄存器中的内存能够任意转移,但是移动数据没有增加数据快捷,因此SSE最有效率的方式是封装好数据之后再执行。SSE兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。虽然SEE指令与3D Now!指令彼此互不兼容,但SSE包含了3D Now!技术的绝大部分功能,只是两者实现的方法不同而已。鉴于SSE得到了众多软件开发商的支持,AMD在其Athlon XP处理器上推出支持SSE指令集的Enhanced 3DNow!,虽然也能够使用SSE对普通的指令进行优化处理,不过效率要略稍于Pentium Ⅲ/4。
后来在研发Pentium 4时,Intel又在SSE的基础上增加了一套包括144条新建指令的SSE2指令集来提升Pentium 4处理器性能。SSE2是当前市场上x86处理器最新的SIMD扩展指令集,它由两个不同的部分所组成:SSE部分和MMX部分。前者主要负责处理浮点数,后者则专门计算整数。SSE2寄存器容量是MMX寄存器的两倍,寄存器存储数据也增加了两倍,在指令处理速度保持不变的情况下,通过SSE2优化后的应用软件运行速度也将提高2倍。由于SSE2指令集与MMX相兼容,因此被MMX优化过的程序很容易被SSE2再次深层次优化。值得一提的是Opteron也兼容了SSE2指令集,AMD在Opteron处理器内部增加了对应的16个128位 SSE2寄存器单元,数量比Pentium 4还要多出一倍。不过,Opteron的SSE2功能是通过“解释执行”来完成:SSE2指令代码被识别后,必须被转换为Opteron可识别的x86-64中间指令,然后再进行处理。所以Opteron在执行SSE2指令时要比Pentium 4要慢许多。
三、寻址位宽
位宽对处理器性能的影响绝不亚于主频。位宽是指微处理器一次执行指令的数据宽, 处理器的寻址位宽增长很快,业界已使用过4、8、16位寻址再到目前主流的32位,而64位寻址浮点运算将成为未来CPU发展趋势。受虚拟和实际内存尺寸的限制,目前主流的32位在性能执行模式方面存在一个致命的缺陷:当面临大量的数据流时,32位的寄存器和指令集不能及时进行相应的处理运算。32位处理器一次只能处理32位的数据,也就是4个字节的数据;而64位处理器一次就能处理64位(即8个字节)的数据。如果我们将总长128位的指令分别按照32位、64位为单位进行编辑的话:32位的处理器需要4个指令,而64位处理器则只要两个指令。显然,在工作频率相同的情况下,64位处理器的处理速度比32位的更快。
大家比较一下图2中的32位与64位处理器,64位的代码流的数量没有改变,其宽度随着指令代码的宽度而变化;而数据流的宽度则增加了一倍,这是为了在同一时间内传输更多的数据,寄存器和内部数据通道也必须加倍。此外,在64位处理器中的寄存器位数是32位处理器中的两倍,不过正在实行指令的指令寄存器却都是一样的。此外64位处理器的程序计数器也加倍了。
目前64位寻址越来越普及,近年来Intel和AMD公司相继推出64位处理器便是这种发展趋势的表现。不过,64位处理器要与64位操作系统、64位应用软件相结合才能全面发挥优势。