指令集或指令集体系:是计算机体系结构中与程序设计有关的部分,包含了基本数据类型、指令集、寄存器、寻址模式、中断、异常处理以及外部的I/O。指令集架构包含一系列的opcode即操作码(机器语言),以及由特定处理器执行的基本命令。
指令集的分类:(1)、复杂指令集计算机包含许多应用程序中很少使用的特定指令;(2)、精简指令集计算机通过只执行在程序中经常使用的指令来简化处理器的结构,而特殊操作则以子程序的方式实现,它们的特殊使用通过处理器额外的执行时间来弥补。理论上的重要类型还包括最小指令集计算机与单指令集计算机,但都未用作商业处理器。另外一种衍生类型是超长指令字,处理器接受许多经过编码的指令并通过检索提取出一个指令字并执行。
机器语言:是由声明和指令所组成的。在处理结构上,一个特定指令指明了以下几个部分:(1)、用于算术运算,寻址或者控制功能的特定寄存器;(2)、特定存储空间的地址或偏移量;(3)、用于解译操作码的特定寻址模式。
指令类型:有效的指令操作须包含,(1)、数据处理与存储操作:将暂存器的值(在*处理器作为高速缓存的存储空间)设为固定值;将数据从存储空间中传送至寄存器,反之亦然。用于将数据取出并执行计算,或者将计算结果予以保存;从硬件设备读取或写入数据。(2)、算术逻辑单元:对两个储存于暂存器的数字进行add、subtract、multiply、divide,将结果放到一个暂存器内,一个或是更多的状态码可能被设置在状态突破口中;执行位操作,即对两组数字(为两串的数字,都由0与1构成,分别储存于两个暂存器内)执行逻辑与和逻辑或,或者对寄存器的每一位执行逻辑非操作;比较两个寄存器中的数据(例如是大于或者相等);(3)、控制流:分支,跳跃至程序某地址并执行相应指令;条件分支,假设某一条件成立,就跳到程序的另一个位置;间接分支,在跳到另一个位置之前,将现在所执行的指令的下一个指令的位置储存起来,作为子程式执行完返回的地址。
复杂指令:一些电脑在他们的指令集架构内包含复杂指令。复杂指令包含:(1)、将许多暂存器存成堆栈的形式;(2)、移动内存内大笔的资料;(3)、复杂或是浮点数运算(正弦、余弦、平方根等等);(4)、执行test-and-set指令;(5)、执行数字存在内存而非暂存器的运算。有一种复杂指令单指令流多数据流,英文全名是Single-InstructionStream Multiple-Data Stream,或是向量指令,这是一种可以在同一时间对多笔数据进行相同运算的操作。SIMD有能力在短时间内将大笔的向量和矩阵计算完成。SIMD指令使平行计算变得简单,各种SIMD指令集被开发出来,例如MMX,3DNow!以及AltiVec。
指令的组成:在传统的架构上,一条指令包含opcode,表示运算的方式,以及零个或是更多的算子,有些像是算子的数字可能指的是暂存器的编号,还有内存位置,或是文字资料。在超长指令字(VLIW)的结构中,包含了许多微指令,借此将复杂的指令分解为简单的指令。
指令的长度:指令长度的范围可以说是相当广泛,从微控制器的4bit,到VLIW系统的数百bit。在个人电脑,大型电脑,超级电脑内的处理器,其内部的指令长度介于8到64 bits(在x86处理器结构内,最长的指令长达15 bytes,等于120 bits)。在一个指令集架构内,不同的指令可能会有不同长度。在一些结构,特别是大部分的精简指令集(RISC),指令是固定的长度,长度对应到结构内一个字的大小。在其他结构,长度则是byte的整数倍或是一个halfword。
电脑微处理器的指令集架构(Instruction SetArchitecture):(1)、复杂指令集运算(ComplexInstruction Set Computing,CISC):目前x86架构微处理器如Intel的Pentium/Celeron/Xeon与AMD的Athlon/Duron/Sempron;以及其64位扩展系统的x86-64架构的Intel 64的Intel Core/Core2/Pentium/Xeon与AMD64的Phenom II/Phenom/Athlon 64/Opteron都属于CISC系列。主要针对的操作系统是微软的Windows。另外Linux,一些UNIX等,都可以运行在x86(CISC)架构的微处理器。(2)、精简指令集运算(ReducedInstruction Set Computing,RISC):RISC这种指令集运算包括HP的PA-RISC,IBM的PowerPC,Compaq(被并入HP)的Alpha,MIPS公司的MIPS,SUN公司的SPARC等。目前只有UNIX,Linux,MacOS等操作系统运行在RISC处理器上。(3)、显式并行指令集运算(ExplicitlyParallel Instruction Computing,EPIC):EPIC乃先进的全新指令集运算,只有Intel的IA-64架构的纯64位微处理器的Itanium/Itanium 2。EPIC指令集运算的IA-64架构主要针对的操作系统是微软64位安腾版的Windows XP以及64位安腾版的WindowsServer 2003。另外一些64位的Linux,一些64位的UNIX也可以运行IA-64(EPIC)架构。(4)、超长指令字指令集运算(VLIW):通过将多条指令放入一个指令字,有效的提高了CPU各个计算功能部件的利用效率,提高了程序的性能。
精简指令集:是计算机*处理器的一种设计模式。这种设计思路对指令数目和寻址方式都做了精简,使其实现更容易,指令并行执进程度更好,编译器的效率更高。目前常见的精简指令集微处理器包括DEC Alpha、ARC、ARM、AVR、MIPS、PA-RISC、Power Architecture(包括PowerPC、PowerXCell)和SPARC等。
复杂指令集:是一种微处理器指令集架构,每个指令可执行若干低阶操作,诸如从内存读取、储存、和计算操作,全部集于单一指令之中。与之相对的是精简指令集。复杂指令集的特点是指令数目多而复杂,每条指令字长并不相等。属于复杂指令集的处理器有CDC 6600、System/360、VAX、PDP-11、Motorola 68000家族、x86等。
CPU指令集:CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(MultiMediaExtended)、SSE、SSE2(Streaming-Singleinstructionmultipledata-Extensions2)和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。我们通常会把CPU的扩展指令集称为"CPU的指令集"。
然而如此一颗精密的芯片为什么能够控制一个庞大而复杂的电脑系统呢?这就是CPU中所集成的指令集。所谓指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。再强大的处理器也需要指令集的配合才行。
CPU的指令集从主流的体系结构上分为精简指令集和复杂指令集,而在普通的计算机处理器基本上是使用的复杂指令集。在计算机早期的发展过程中,CPU中的指令集是没有划分类型的,而是都将各种程序需要相配合的指令集成到CPU中,但是随着科技的进步,计算机的功能也越来越强大,计算机内部的元件也越来越多,而且越来越复杂,CPU的指令也相应的变得十分复杂,而在使用过程中,并不是每一条指令都要完全被执行,在技术人员的研究过程中发现,约有80%的程序只用到了20%的指令,而一些过于冗余的指令严重影响到了计算机的工作效率,就这一现象,精简指令集的概念就被提了出来。
精简指令集RISC就是(ReducedInstruction Set Computing)的缩写,而复杂指令集CISC则是(Complex Instruction Set Computing)的缩写。它们之间的不同之处就在于RISC指令集的指令数目少,而且每条指令采用相同的字节长度,一般长度为4个字节,并且在字边界上对齐,字段位置固定,特别是操作码的位置。而CISC指令集特点就是指令数目多而且复杂,每条指令的长度也不相等。
在操作上,RISC指令集中大多数操作都是寄存器到寄存器之间的操作,只以简单的load(读取)和store(存储)操作访问内存地址。因此,每条指令中访问的内存地址不会超过1个,指令访问内存的操作不会与算术操作混在一起。在功能上,RISC指令集也要比复杂指令集具有优势,精简指令集可以大大简化处理器的控制器和其他功能单元的设计,不必使用大量专用寄存器,特别是允许以硬件线路来实现指令操作,从而节约处理器的制造成本。而采用CISC指令集的处理器是使用微程序来实现指令操作,在执行速度上不如RISC指令集。另外,RISC还加强了并行处理能力,非常适合于采用处理器的流水线、超流水线和超标量技术,从而实现指令级并行操作,提高处理器的性能。而且随着vlsi(VeryLarge Scale Integration超大规模集成电路)技术的发展,整个处理器的核心甚至多个处理器核心都可以集成在一个芯片上。RISC指令集的体系结构可以给设计单芯多核处理器带来很多好处,有利于处理器的性能提高。
由于RISC指令集自身的优势,在处理器的高端服务器领域的处理器上得到了广泛的运用,而CISC指令集主要运用桌面领域的处理器产品中,比如intel的pentium系列和amd的k8系列处理器。然而现在RISC指令集也不断地向桌面领域渗入,相信以后的处理器指令集会慢慢的向RISC体系靠拢,使得处理器的指令集结构更加完善,功能更为强大,技术也越来越成熟。
RISC指令集有许多特征,其中最重要的有:(1)、指令种类少,指令格式规范:RISC指令集通常只使用一种或少数几种格式。指令长度单一(一般4个字节),并且在字边界上对齐。字段位置、特别是操作码的位置是固定的。(2)、寻址方式简化:几乎所有指令都使用寄存器寻址方式,寻址方式总数一般不超过5个。其他更为复杂的寻址方式,如间接寻址等则由软件利用简单的寻址方式来合成。(3)、大量利用寄存器间操作:RISC指令集中大多数操作都是寄存器到寄存器操作,只以简单的Load和Store操作访问内存。因此,每条指令中访问的内存地址不会超过1个,访问内存的操作不会与算术操作混在一起。(4)、简化处理器结构:使用RISC指令集,可以大大简化处理器的控制器和其他功能单元的设计,不必使用大量专用寄存器,特别是允许以硬件线路来实现指令操作,而不必像CISC处理器那样使用微程序来实现指令操作。因此RISC处理器不必像CISC处理器那样设置微程序控制存储器,就能够快速地直接执行指令。(5)、便于使用VLSI技术:随着LSI和VLSI技术的发展,整个处理器(甚至多个处理器)都可以放在一个芯片上。RISC体系结构可以给设计单芯片处理器带来很多好处,有利于提高性能,简化VLSI芯片的设计和实现。基于VLSI技术,制造RISC处理器要比CISC处理器工作量小得多,成本也低得多。(6)、加强了处理器并行能力:RISC指令集能够非常有效地适合于采用流水线、超流水线和超标量技术,从而实现指令级并行操作,提高处理器的性能。目前常用的处理器内部并行操作技术基本上是基于RISC体系结构发展和走向成熟的。正由于RISC体系所具有的优势,它在高端系统得到了广泛的应用,而CISC体系则在桌面系统中占据统治地位。
X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,Intel公司所生产的所有CPU仍然继续使用X86指令集。
在中高档服务器中普遍采用RISC指令系统的CPU,特别是高档服务器全都采用RISC指令系统的CPU。在中高档服务器中采用RISC指令的CPU主要有Compaq(康柏,即新惠普)公司的Alpha、HP公司的PA-RISC、IBM公司的PowerPC、MIPS公司的MIPS和SUN公司的Spare。
在计算机指令系统的优化发展过程中,出现过两个截然不同的优化方向:CISC技术和RISC技术。CISC是指复杂指令系统计算机;RISC是指精减指令系统计算机。这里的计算机指令系统指的是计算机的最低层的机器指令,也就是CPU能够直接识别的指令。随着计算机系统的复杂,要求计算机指令系统的构造能使计算机的整体性能更快更稳定。最初,人们采用的优化方法是通过设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件的指令系统实现,以此来提高计算机的执行速度,这种计算机系统就被称为复杂指令系统计算机,即CISC。另一种优化方法是在20世纪80年代才发展起来的,其基本思想是尽量简化计算机指令功能,只保留那些功能简单、能在一个节拍内执行完成的指令,而把较复杂的功能用一段子程序来实现,这种计算机系统就被称为精简指令系统计算机,即RISC。RISC技术的精华就是通过简化计算机指令功能,使指令的平均执行周期减少,从而提高计算机的工作主频,同时大量使用通用寄存器来提高子程序执行的速度。
RISC和CISC是设计制造微处理器的两种典型技术,虽然它们都是试图在体系结构、操作运行、软件硬件、编译时间和运行时间等诸多因素中做出某种平衡,以求达到高效的目的,但采用的方法不同。
ARM是精简指令集的代表,目前,绝大部分移动设备采用的是ARM而不是x86处理器。x86是复杂指令集的代表。
复杂指令集,也称为CISC指令集,英文名是CISC。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。其实它是英特尔生产的x86系列(也就是IA-32架构)CPU及其兼容CPU,如AMD、VIA的。即使是现在新起的X86-64(也被称为AMD64)都是属于CISC的范畴。
并行处理的费林分类法:(1)、单指令单数据流(SISD):是非并行计算的模型,典型的例子就是单核的CPU,所有的数据都被一个处理器顺次处理,某一时刻只能使用一种指令;(2)、单指令多数据流(SIMD);(3)、多指令单数据流(MISD):指在同一个数据流上执行不同的指令。流水线模型可以被认为是一种MISD;(4)、多指令多数据流(MIMD):是多核CPU的计算模型。
单指令流多数据流(Single Instruction Multiple Data,缩写:SIMD):是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据矢量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。在微处理器中,单指令流多数据流技术则是一个控制器控制多个平行的处理微元,例如Intel的MMX或SSE以及AMD的3D Now!技术。它能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。它以同步方式,在同一时间内执行同一条指令。SIMD特别适合于多媒体应用等数据密集型运算。
单指令流多数据流(SIMD)是一种实现数据级并行的技术,其典型代表是向量处理器(Vector Processor)和阵列处理器(Array Processor)。SIMD技术的关键是在1条单独的指令中同时执行多个运算操作,以增加处理器的吞吐量。为此,SIMD结构的CPU有多个执行部件,但都在同一个指令部件的控制之下,*控制器向各个处理单元发送指令,整个系统只要求有一个*控制器,只要求存储一份程序,所有的计算都是同步的。
SIMD包括:MMX(1996)、MMX2、SSE(1999)、SSE2(2001)、SSE3(2004)、SSSE3、SSE4.x、SSE5、AMD’s 3DNow!、NEON、Yeppp、AVX、FMA等。
MMX(Multi-MediaExtension):技术的优点是增加了多媒体处理能力,可以一次处理多个数据,缺点则是仅仅只能处理整型数,并且由于占用浮点数寄存器进行运算,以至于MMX指令集与x87浮点运算指令不能够同时执行,必须做密集的切换才可以正常执行,这种情况势必造成整个系统运行质量的下降。
SSE(Streaming SIMD Extensions):兼容MMX指令,可以通过SIMD和单时钟周期并行处理多个浮点数据来有效提高浮点运算速度,对图像处理、浮点运算、3D运算、视频处理、音频处理等诸多多媒体应用起到全面强化作用。具有SSE指令集支持的处理器有8个128位的寄存器,每一个寄存器可以存放4个单精度(32位)浮点数。SSE同时提供了一个指令集,其中的指令允许把浮点数加载到这些128位寄存器中,这些数就可以在这些寄存器中进行算术逻辑运算,然后把结果送回主存。也就是说,SSE中的所有计算都可以针对4个浮点数一次性完成,这种批处理带来了效率的提升。
SSE2(Streaming SIMD Extensions 2):指令集,扩展了SSE指令集,并可完全取代MMX。SSE2指令集是Intel公司在SSE指令集的基础上发展起来的。相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,提高了诸如MPEG-2、MP3、3D图形等应用程序的运行性能。在整数处理方面,随MMX技术引进的SIMD整数指令从64位扩展到了128 位,使SIMD整数类型操作的执行效率成倍提高;在浮点数处理方面,双精度浮点SIMD指令允许以 SIMD格式同时执行两个浮点操作,提供双精度操作支持有助于加速内容创建、财务、工程和科学应用。除SSE2指令之外,最初的SSE指令也得到增强,通过支持多种数据类型(例如双字、四字)的算术运算,支持灵活、动态范围更广的计算功能。
SSE3(Streaming SIMD Extensions 3):指令集是Intel公司在SSE2指令集的基础上发展起来的。相比于SSE2,SSE3在SSE2的基础上又增加了13条SIMD指令,以提升Intel超线程(Hyper-Threading)技术的效能,最终达到提升多媒体和游戏性能的目的。
目前SIMD指令可以有四种方法进行使用分别是汇编语言,C++类,编译器Intrisincs和自动矢量化。
参考文献:
1、 http://zh.wikipedia.org/wiki/%E6%8C%87%E4%BB%A4%E9%9B%86%E6%9E%B6%E6%A7%8B
2、 http://www.baike.com/wiki/CPU%E6%8C%87%E4%BB%A4%E9%9B%86
3、 http://www.baike.com/wiki/%E7%B2%BE%E7%AE%80%E6%8C%87%E4%BB%A4%E9%9B%86
4、 http://123.125.115.53/view/1177592.htm
6、 http://share.onlinesjtu.com/mod/tab/view.php?id=303
7、 http://courses.engr.illinois.edu/ece390/books/labmanual/inst-ref-simd.html
8、 http://www.hayestechnologies.com/en/techsimd.htm
9、 http://zerocool.is-a-geek.net/?p=422
10、 http://blog.chinaunix.net/uid-20385936-id-3902720.html
11、 http://www.songho.ca/misc/sse/sse.html