核心指令集发展回顾

来源:百度文库 编辑:神马文学网 时间:2024/04/26 07:16:12
什么是CPU指令集?
CPU作为一台电脑中的核心,它的作用是无法替代的。而CPU本身只是在块硅晶片上所集成的超大规模的集成电路,集成的晶体管数量可达到上亿个,是由非常先进复杂的制造工艺制造出来的,拥有相当高的科技含量。然而如此一颗精密的芯片为什么能够控制一个庞大而复杂的电脑系统呢?这就是CPU中所集成的指令集。所谓指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。

再强大的处理器也需要指令集的配合才行(图片出自电影《机械公敌》)
CPU的指令集从主流的体系结构上分为精简指令集和复杂指令集,而在普通的计算机处理器基本上是使用的复杂指令集。在计算机早期的发展过程中,CPU中的指令集是没有划分类型的,而是都将各种程序需要相配合的指令集成到CPU中,但是随着科技的进步,计算机的功能也越来越强大,计算机内部的元件也越来越多,而且越来越复杂,CPU的指令也相应的变得十分复杂,而在使用过程中,并不是每一条指令都要完全被执行,在技术人员的研究过程中发现,约有80%的程序只用到了20%的指令,而一些过于冗余的指令严重影响到了计算机的工作效率,就这一现象,精简指令集的概念就被提了出来。
精简指令集RISC就是(Reduced Instruction SetComputing)的缩写,而复杂指令集CISC则是(Complex Instruction SetComputing)的缩写。它们之间的不同之处就在于RISC指令集的指令数目少,而且每条指令采用相同的字节长度,一般长度为4个字节,并且在字边界上对齐,字段位置固定,特别是操作码的位置。而CISC指令集特点就是指令数目多而且复杂,每条指令的长度也不相等。在操作上,RISC指令集中大多数操作都是寄存器到寄存器之间的操作,只以简单的Load(读取)和Sotre(存储)操作访问内存地址。因此,每条指令中访问的内存地址不会超过1个,指令访问内存的操作不会与算术操作混在一起。在功能上,RISC指令集也要比复杂指令集具有优势,精简指令集可以大大简化处理器的控制器和其他功能单元的设计,不必使用大量专用寄存器,特别是允许以硬件线路来实现指令操作,从而节约的处理器的制造成本。而采用CISC指令集的处理器是使用微程序来实现指令操作,在执行速度上不如RISC指令集。另外,RISC还加强了并行处理能力,非常适合于采用处理器的流水线、超流水线和超标量技术,从而实现指令级并行操作,提高处理器的性能。而且随着VLSI(Very Large ScaleIntegration超大规模集成电路)技术的发展,整个处理器的核心甚至多个处理器核心都可以集成在一个芯片上。RISC指令集的体系结构可以给设计单芯多核处理器带来很多好处,有利于处理器的性能提高。
由于RISC指令集自身的优势,在处理器的高端服务器领域的处理器上得到了广泛的运用,而CISC指令集主要运用桌面领域的处理器产品中,比如Intel的Pentium系列和AMD的K8系列处理器。然而现在RISC指令集也不断地向桌面领域渗入,相信以后的处理器指令集会慢慢的向RISC体系靠拢,使得处理器的指令集结构更加完善,功能更为强大,技术也越来越成熟。
指令集的发展史
而说到指令集的发展,就不得提到目前主流处理器所采用的X86架构。所谓X86架构的处理器就是采用了IntelX86指令集的处理器,X86指令集是Intel公司为其第一块16位处理器i8086所专门开发的。而IBM在1981年所推出的第一台PC机上所使用的处理器i8088(i8086的简化版)也是使用的X86指令集,但是为了增加计算机的浮点运算能力,增加了X87数学协助处理器和加入了X87指令集,于是就将采用了X86指令集和X87指令集的处理器统称为X86架构的处理器。

第一块支持X86指令集的Intel i8086处理器
到目前为止,Intel公司所生产的大部分处理器都是属于X86架构的处理器,包括像i80386、i80486和Pentium系列处理器等等。而Intel公司以外,AMD和Cyrix等厂商也在生产集成了X86指令集的处理器产品,而这些处理器都能够与支持Intel处理器的软件和硬件相兼容,所以也就形成了今天庞大的X86架构的处理器阵容。
然而随着处理器技术的发展,虽然处理器的主频和制造工艺都有一定的进步,但是处理器的性能确不能非常明显的提高,其中一个非常重要的原因就是受到了X86所采用的SISC指令集的限制。这一点Intel方面也非常清楚。而目前IA-32(IntelArchitechure-32英特尔32位体系架构)的X86系列处理器存在着一系列的问题,使得Intel方面已经打算放弃X86指令体系处理器的发型,而将重点放在下一代的IA-64体系处理器和EPIC(ExplicitlyParallel Instruction Computing)显性并行指令方面。

X86架构处理器示意图
首先,我们要知道,提高处理器每个时钟频率的指令执行数来提高处理器的性能,而这也是Intel开发新指令集的主要目的,这样一来,处理器可以让指令更容易解码,并且更容易进行并行处理,这样就可以不受指令集的限制来开发新型的处理器。而X86指令集的劣势就在于它的限制过多。
第一、由于X86指令集是属于CISC类型的指令集,其每条指令的长度是不固定的,而且有几种不同的格式,这样一来,就造成了X86处理器的解码工作非常复杂。而为了提高处理器的工作频率,就不得不延长处理器中的流水线,而过长的流水线在分支如果出现预测出错的情况,又会带来CPU工作停滞时间较长的弊端。
第二、X86指令采用了可访问内存地址的方法,这样的方法容易造成处理器与内存之间的不平衡工作,从而降低处理器的工作效率。而先进的RISC处理器则是使用Load/Store的存储模式,其中只有Load和Store指令才能从内存中读取数据到寄存器,所有其他指令只对寄存器中的操作数进行计算。
第三、X86构架处理器中的FPU(Floating PointUnit)浮点运算单元的运算能力较差,可以说现今市面上所有类型处理器中最慢的,其主要原因就是X86指令集中所使用的一个操作数堆栈。如果在运算过程中,没有足够的寄存器进行计算,系统就不得不使用堆栈来存放数据,这样一来会浪费大量的时间来处理FXCH指令,就是将正确的数据放到堆栈的顶部。
第四、X86指令对于各种扩展部件的限制也是十分不利的。首先,X86架构的处理器对于4GB的内存容量上限制,虽然现在目前主流的个人电脑的内存大小为512MB和1GB,但是相信随着操作系统和应用软件的不断提升,会快将会突破4GB的内存容量。另外,由于为了提高X86架构的处理器的性能,而出现像寄存器重命名、缓冲器巨大、乱序执行、分支预测、X86指令转化等等现象,都使得处理器的核心面积变得越来越大,这也限制了处理器工作频率的进一步提升,此外,处理器所集成的这些庞大数目的晶体管都只是为了解决X86指令的问题,所以继续采用X86架构必将会影响到处理器的发展。
而反观IA-64体系,由于采用了RISC指令集,可由一个指令、两个输入寄存器和一个输出寄存器组成,指令只对寄存器进行操作。并且具有多个不同的流水线或执行单元,能够并行执行许多指令。在对指令的处理速度上要明显优于CISC类型的IA-32体系。
而Intel的Merced(也就是现在Itanium安腾)处理器就是一块采用IA-64体系的64位处理器。它拥有64位寻址能力和64位位宽的寄存器,所以称之为64位处理器。由于具有64位寻址能力,Merced能够使用1百万TB(1TB=1024GB)的地址空间,足以运算企业级的数据任务,64位宽的寄存器可以使Merced达到非常高的精度和运算速度。它所采用的EPIC指令可以使得处理器进行并行处理,在相同的时钟周期内,采用并行处理的指令执行数是普通CISC指令集的两倍。此外,Merced可进行并行分支预测。在目前的普通的处理器中,分支预测的正确率可以达到90%~95%,虽然正确率已经相当高了,但如果预测出错时,处理器就不得不清洗整条流水线,从而降低处理器的运算效率。10%的预测出错率会让处理器损失近30%的性能,而且如果流水线越长的情况下,性能损失就越严重。而Merced的所采用的预测机制,可以使分支都能进行并行执行,而且所花的招待时间与执行单个分支的时间是相同的。其次,处理器不会再冒预测出错的风险。由于处理器不再进行跳跃执行,它不会把程序代码分成一个一个的小块。而是将稍前和稍后的程序代码进行打包,然后一起将它们发布,加强了并行工作量。这些可以使采用EPIC指令的处理器避免普通处理器所出现的分支预测40%的出错情况,从而使处理器的性能提高10%~15%,特别是在整数代码部分。

Intel的Merced处理器
提升性能:扩展指令集
刚才上面提到了处理器中的扩展指令集,目前市面上Intel和AMD的桌面级处理器在X86指令集的基础上,为了提升处理器各方面的性能,所以又各自开发新的指令集。指令集中包含了处理器对多媒体、3D处理等方面的支持,这些指令集能够提高处理器对这某些方面处理器能力,但是需要有必要的软件支持。
MMX指令集
MMX(Multi Media eXtension多媒体扩展指令)指令集是Intel公司在1996年为旗下的Pentium系列处理器所开发的一项多媒体指令增强技术。MMX指令集中包括了57条多媒体指令,通过这些指令可以一次性处理多个数据,在处理结果超过实际处理能力的时候仍能够进行正常处理,如果在软件的配合下,可以得到更强的处理性能。使用MMX指令集的好处就是当时所使用的操作系统可以在不做任何改变的情况下执行MMX指令。但是,MMX指令集的问题也是比较明显的,MMX指令集不能与X86的浮点运算指令同时执行,必须做密集式的交错切换才可以正常执行,但是这样一来,就会造成整个系统运行速度的下降。

支持MMX指令集的Intel Pentium MMX处理器
SSE指令集
SSE是Streaming SIMD Extension(SIMD扩展指令集)的缩写,而其中SIMD的为含意为SingleIstruction MultipleData(单指令多数据),所以SSE指令集也叫单指令多数据流扩展。该指令集最先运用于Intel的PentiumIII系列处理器,其实在Pentium III推出之前,Intel方面就已经泄漏过关于KNI(Katmai NewInstruction)指令集的消息。这个KNI指令集也就是SSE指令集的前身,当时也有不少的媒体将该指令集称之为MMX2指令集,但是Intel方面却从没有发布有关MMX2指令集的消息。

加入了SSE指令集的Pentium III处理器
最后在Intel推出PentiumIII处理器的时候,SSE指令集也终于水落石出。SSE指令集是为提高处理器浮点性能而开发的扩展指令集,它共有70条指令,其中包含提高3D图形运算效率的50条SIMD浮点运算指令、12条MMX整数运算增强指令、8条优化内存中的连续数据块传输指令。理论上这些指令对当时流行的图像处理、浮点运算、3D运算、多媒体处理等众多多媒体的应用能力起到全面提升的作用。SSE指令与AMD公司的3DNow!指令彼此互不兼容,但SSE包含了3DNow!中的绝大部分功能,只是实现的方法不同而已。SSE也向下兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。
3DNow!指令集
3DNow!指令集最由AMD公司所推出的,该指令集应该是在SSE指令之前推出的,被广泛运用于AMD的K6、K6-2和K7系列处理器上,拥有21条扩展指令集。在整体上3DNow!的SSE非常相相似,它们都拥有8个新的寄存器,但是3DNow!是64位的,而SSE是128位。所以3DNow!它只能存储两个浮点数据,而不是四个。但是它和SSE的侧重点有所不同,3DNow!指令集主要针对三维建模、坐标变换和效果渲染等3D数据的处理,在相应的软件配合下,可以大幅度提高处理器的3D处理性能。AMD公司后来又在Athlon系列处理器上开发了新的Enhanced3DNow!指令集,新的增强指令数达了52个,以致目前最为流行的Athlon 64系列处理器还是支持3DNow!指令的。

AMD K6、K7系列所使用的3DNow!指令集
SSE2指令集
在PentiumIII发布的时候,SSE指令集就已经集成在了处理器的内部,但因为各种原因一直没有得到充分的发展。直到Pentium4发布之后,开发人员看到使用SSE指令之后,程序执行性能将得到极大的提升,于是Intel又在SSE的基础上推出了更先进的SSE2指令集。
SSE2包含了144条指令,由两个部分组:SSE部分和MMX部分。SSE部分主要负责处理浮点数,而MMX部分则专门计算整数。SSE2的寄存器容量是MMX寄存器的两倍,寄存器存储数据也增加了两倍。在指令处理速度保持不变的情况下,通过SSE2优化后的程序和软件运行速度也能够提高两倍。由于SSE2指令集与MMX指令集相兼容,因此被MMX优化过的程序很容易被SSE2再进行更深层次的优化,达到更好的运行效果。SSE2对于处理器的性能的提升是十分明显的,虽然在同频率的情况下,Pentium 4和性能不如Athlon XP,但由于AthlonXP不支持SSE2,所以经过SSE2优化后的程序Pentium 4的运行速度要明显高于AthlonXP。而AMD方面也注意到了这一情况,在随后的K-8系列处理器中,都加入SSE2指令集。

SSE2和SSE3指令集主要用于Pentium 4系列处理器上
SSE3指令集
SSE3指令是目前规模最小的指令集,它只有13条指令。它共划分为五个应运层,分别为数据传输命令、数据处理命令、特殊处理命令、优化命令、超线程性能增强五个部分,其中超线程性能增强是一种全新的指令集,它可以提升处理器的超线程的处理能力,大大简化了超线程的数据处理过程,使处理器能够更加快速的进行并行数据处理。
上面介绍的基本上就是Intel和AMD公司在X86架构处理器上主要的扩展指令集,虽然它们对于处理器的性能提升有着一定程度的帮助,但是由于受到IA-32体系的限制,X86架构基本上不会再有具有革命性意义的指令集出现,而双方都已经把重心转向了64位体系架构的处理器指令集开发上。
未来:迈向64位体系
在现在的处理器市场上,64位技术已经开始普及起来,像AMD的Athlon64处理器和Intel的Pentium5XX/6XX处理器已经成为市场的主流。但是大家要值得主意的是,目前的桌面级64位处理器仍然还是基于X86架构之上,而不是IA-64架构。这里的64位处理器是指的处理器的通用寄存器GPR(General-PurposeRegisters)的数据宽度为64位。也就是说处理器可一次运算64位数据。使用64位技术运算有两大优点:可以进行更大范围的整数运算,还有就是可以支持更大容量的内存。但是要注意的是,不要看表面64位是32位两倍,就简单的认为64位处理器的性能是32位处理器性能的两倍。就在目前的32位主流平台下,32位的处理器在某些方面甚至要比64位处理器还要强,所以在32位操作系统和运用程序为主情况下,不要太过于迷信64位处理器。
64位处理器技术并不是Intel和AMD处理器上才有的。早在上个世纪90年代末,在高端的采用RISC指令集的处理器中就已经有了64位处理器,比如SUN公司的UltraSparcⅢ、IBM公司的Power5、HP公司的Alpha等处理器产品。现在市面上主流的64位技术主要是Intel的EM64T技术和AMD和AMD64技术。而这两项技术都是基于IA-32体系,而真正的IA-64体系上处理器目前只有Itanium(安腾)以及其后续产品,是Intel独立开发的,它不兼容现在32位计算机。
AMD64位技术
AMD的athlon64系列处理器的64位技术是在X86指令集的基础上加入了X86-64的64位扩展X86指令集,这就使得athlon64系列处理器可兼容原来的32位的X86软件,并同时支持X86-64的扩展64位计算,并且具有64位的寻址能力,使得它成为真正的64位X86构架处理器。在采用X86-64架构的Athlon64处理器中,X86-64指令集中新增了几组处理器寄存器,它能够提供更加快速的执行效率。寄存器是处理器用来创建和储存CPU运算结果和其他运算结果的地方,标准的X86构架中包括8组通用寄存器,而在AMD的X86-64架构中又增加了8组,将通过寄存器的数目提高到了16组。在这基础之上,X86-64指令集还另外增加了8组128位的XMM寄存器,也叫做SSE寄存器。它能够给单指令多数据流技术(SIMD)运算提供更多的存储空间,这些128位的寄存器能够提供在矢量和标量计算模式下进行128位双精度处理,这也为3D数据处理、矢量分析和虚拟技术提供了良好的硬件基础。由于提供了更多的寄存器,按照X86-64标准生产的处理器可以更有效率的处理数据,在一个时钟周期内能够传输更多的信息。

采用X86-64架构的AMD Athlon 64处理器
EM64T技术
EM64T(Extended Memory 64Technology)也就是Intel公司开发的64位内存扩展技术。它实际上就是IntelIA-32构架体系的扩展,既IA-32E(Intel Architectur-32Extension)。Intel的IA-32处理器通过加入EM64T技术便可在兼容IA-32软件的情况下,允许软件程序利用更多的内存地址空间,并且允许程序进行32位线性地址写入。Intel的EM64T所强调的是32位技术与64位技术的兼容性,为采用EM64T的处理器增加了8个64位通用寄存器,并将原有的32位通用寄存器全部扩展为64位,这样也提高了处理器的整数运算能力。另外增加的8个SEE寄存器也提供了对SSE、SSE2和SSE3指令的支持。

加入EM64T扩展技术的Pentium 5XX/6XX系列处理器
目前Intel的主流桌面处理器共有两个模式,传统的IA-32模式和IA-32E模式。在可支持EM64T指令的处理器内有一个扩展功能激活寄存器(ExtendedFeature EnableRegister),称为IA-32_EFER的部件,它控制处理器的EM64T是否被激活。在普通情况下,处理器会作为一颗标准的IA-32处理器,如果在运行64位的软件或程序时,EM64T就会被激活,那么处理器便会在IA-32E扩展模式下运行。
总结:
到现在为至,Intel和AMD在桌面处理器市场的竞争愈发的激烈,而产品的性能与新技术的运用将会是两家厂商取胜的要点之一。虽然Intel已经开始了IA-64体系架构的研发,而且已经运用到了高端的服务器领域,但是要渗入到民用桌面市场相信还是需要相当长的时间才行。而IA-32构架的X86处理器产品在一段时间内仍然将是市面上的主流。但是受到了X86构架的限制,Intel和AMD也都会将重心放在扩展性和并行处理上,而不是一味的提高处理器的主频。现在两家的公司的双核心处理器也都已经上市,所以其扩展指令集的开发相信也会是朝这个方向发展。虽然真正的64位体系构架才是处理器的方向,但是在这之前,X86构架仍然没有走到尽头,所以想要全面进行64位时代,Intel和AMD仍然还有很长的一段路要走。