1、CPU指令集
计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。指令集就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效的工具之一。
CPU执行计算任务时都需要遵从一定的规范,程序在被执行前都需要先翻译为CPU可以理解的语言,这种规范或语言就是指令集(ISA,Instruction Set Architecture)。程序被按照某种指令集的规范翻译为CPU可识别的底层代码的过程叫做编译(compile)。x86、ARM v8、MIPS都是指令集的代号。指令集可以被扩展,如x86增加64位支持就有了x86-64。厂商开发兼容某种指令集的CPU需要指令集专利持有者授权,典型例子如Intel授权AMD,使后者可以开发兼容x86指令集的CPU。
微处理器的指令集架构(Instruction Set Architecture)常见种类如下: 复杂指令集运算(Complex Instruction Set Computing,CISC);精简指令集运算(Reduced Instruction Set Computing,RISC) ;显式并行指令集运算(Explicitly Parallel Instruction Computing,EPIC);超长指令字指令集运算(VLIW)
1.1、复杂指令集运算(Complex Instruction Set Computing,CISC)
1.1.1、简述
复杂指令集也称为CISC指令集,英文名是CISC(Complex Instruction Set Computing的缩写)。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。复杂指令集计算机(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)架构的微处理器。
计算机处理器包含有实现各种功能的指令或微指令,指令集越丰富,为微处理器编写程序就越容易,但是丰富的微指令集会影响其性能。复杂指令集计算机(CISC)体系结构的设计策略是使用大量的指令,包括复杂指令。与其他设计相比,在CISC中进行程序设计要比在其他设计中容易,因为每一项简单或复杂的任务都有一条对应的指令。程序设计者不需要写一大堆指令去完成一项复杂的任务。 但指令集的复杂性使得CPU和控制单元的电路非常复杂。
CISC包括一个丰富的微指令集,这些微指令简化了在处理器上运行的程序的创建。指令由汇编语言所组成,把一些原来由软件实现的常用的功能改用硬件的指令系统实现,编程者的工作因而减少许多,在每个指令期同时处理一些低阶的操作或运算,以提高计算机的执行速度,这种系统就被称为复杂指令系统。
在CISC指令集的各种指令中,其使用频率却相差悬殊,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20%。
1.1.2、发展背景
早期的CPU全部是CISC架构,它的设计目的是要用最少的机器语言指令来完成所需的计算任务。比如对于乘法运算,在CISC架构的CPU上,您可能需要这样一条指令:MUL ADDRA, ADDRB就可以将ADDRA和ADDRB中的数相乘并将结果储存在ADDRA中。将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的操作全部依赖于CPU中设计的逻辑来实现。这种架构会增加CPU结构的复杂性和对CPU工艺的要求,但对于编译器的开发十分有利。比如上面的例子,C程序中的a*=b就可以直接编译为一条乘法指令。今天只有Intel及其兼容CPU还在使用CISC架构。
RISC架构要求软件来指定各个操作步骤。上面的例子如果要在RISC架构上实现,将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的操作都必须由软件来实现,比如:MOV A, ADDRA; MOV B, ADDRB; MUL A, B; STR ADDRA, A。这种架构可以降低CPU的复杂性以及允许在同样的工艺水平下生产出功能更强大的CPU,但对于编译器的设计有更高的要求。
CISC早期的计算机部件比较昂贵,主频低,运算速度慢。为了提高运算速度,人们不得不将越来越多的复杂指令加入到指令系统中,以提高计算机的处理效率,这就逐步形成复杂指令集计算机体系。为了在有限的指令长度内实现更多的指令,人们又设计了操作码扩展。然后,为了达到操作码扩展的先决条件——减少地址码,设计师又发现了各种寻址方式,如基址寻址、相对寻址等,以最大限度地压缩地址长度,为操作码留出空间。Intel公司的X86系列CPU是典型的CISC体系的结构,从最初的8086到后来的Pentium系列,每出一代新的CPU,都会有自己新的指令,而为了兼容以前的CPU平台上的软件,旧的CPU的指令集又必须保留,这就使指令的解码系统越来越复杂。CISC可以有效地减少编译代码中指令的数目,使取指操作所需要的内存访问数量达到最小化。此外CISC可以简化编译器结构,它在处理器指令集中包含了类似于程序设计语言结构的复杂指令,这些复杂指令减少了程序设计语言和机器语言之间的语义差别,而且简化了编译器的结构。
为了支持复杂指令集,CISC通常包括一个复杂的数据通路和一个微程序控制 CISC器。微程序控制器由一个微程序存储器、一个微程序计数器(MicroPC)和地址选择逻辑构成。在微程序存储器中的每一个字都表示一个控制字,并且包含了一个时钟周期内所有数据通路控制信号的值。这就意味着控制字中的每一位表示一个数据通路控制线的值。例如,它可以用于加载寄存器或者选择ALU中的一个操作。此外每个处理器指令都由一系列的控制字组成。当从内存中取出这样的一条指令时,首先把它放在指令寄存器中,然后地址选择逻辑再根据它来确定微程序存储器中相应的控制字顺序起始地址。当把该起始地址放入MicroPC中后,就从微程序内存中找到相应的控制字,并利用它在数据通路中把数据从一个寄存器传送到另一个寄存器。由于MicroPC中的地址并发递增来指向下一个控制字,因此对于序列中的每个控制器都会重复一遍这一步骤。最终,当执行完最后一个控制字时,就从内存中取出一条新的指令,整个过程会重复进行。
由此可见,控制字的数量及时钟周期的数目对于每一条指令都可以是不同的。因此在CISC中很难实现指令流水操作。另外,速度相对较慢的微程序存储器需要一个较长的时钟周期。由于指令流水和短的时钟周期都是快速执行程序的必要条件,因此CISC体系结构对于高效处理器而言不太合适的。
1.1.3、发展历程
在计算机指令系统的优化发展过程中,出现过两个截然不同的优化方向:CISC技术和RISC技术。CISC是指复杂指令系统计算机(Complex Instruction Set Computer);RISC是指精简指令系统计算机(Reduced Instruction Set Computer)。这里的计算机指令系统指的是计算机的最低层的机器指令,也就是CPU能够直接识别的指令。随着计算机系统的复杂,要求计算机指令系统的构造能使计算机的整体性能更快更稳定。最初,人们采用的优化方法是通过设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件的指令系统实现,以此来提高计算机的执行速度,这种计算机系统就被称为复杂指令系统计算机,即Complex Instruction Set Computer,简称CISC。另一种优化方法是在20世纪80年代才发展起来的,其基本思想是尽量简化计算机指令功能,只保留那些功能简单、能在一个节拍内执行完成的指令,而把较复杂的功能用一段子程序来实现,这种计算机系统就被称为精简指令系统计算机.即Reduced Instruction Set Computer,简称RISC。RISC技术的精华就是通过简化计算机指令功能,使指令的平均执行周期减少,从而提高计算机的工作主频,同时大量使用通用寄存器来提高子程序执行的速度。
从计算机诞生以来,人们一直沿用CISC指令集方式。早期的桌面软件是按CISC设计的,并一直沿用。桌面计算机流行的x86体系结构即使用CISC。微处理器(CPU)厂商一直在走CISC的发展道路,包括Intel、AMD,还有其他一些现在已经更名的厂商,如TI(德州仪器)、Cyrix以及VIA(威盛)等。CISC架构的服务器主要以IA-32架构(IntelArchitecture,英特尔架构)为主,而且多数为中低档服务器所采用。
1.1.4、缺点
采用复杂指令系统的计算机有着较强的处理高级语言的能力.这对提高计算机的性能是有益的.当计算机的设计沿着这条道路发展时.有些人没有随波逐流.他们回过头去看一看过去走过的道路,开始怀疑这种传统的做法:IBM公司设在纽约Yorktown的JhomasI.Wason研究中心于1975年组织力量研究指令系统的合理性问题.因为它当时已感到,日趋庞杂的指令系统不但不易实现.而且还可能降低系统性能。1979年以帕特逊教授为首的一批科学家也开始在美国加州大学伯克利分校开展这一研究.结果表明,CISC存在许多缺点. 首先.在这种计算机中.各种指令的使用率相差悬殊:一个典型程序的运算过程所使用的80%指令.只占一个处理器指令系统的20%.事实上最频繁使用的指令是取、存和加这些最简单的指令.这样一来,长期致力于复杂指令系统的设计,实际上是在设计一种难得在实践中用得上的指令系统的处理器.
同时.复杂的指令系统必然带来结构的复杂性.这不但增加了设计的时间与成本还容易造成设计失误.此外.尽管VLSI技术现在已达到很高的水平,但也很难把CISC的全部硬件做在一个芯片上,这也妨碍单片计算机的发展.在CISC中,许多复杂指令需要极复杂的操作,这类指令多数是某种高级语言的直接翻版,因而通用性差.由于采用二级的微码执行方式,它也降低那些被频繁调用的简单指令系统的运行速度. 因而.针对CISC的这些弊病.帕特逊等人提出了精简指令的设想即指令系统应当只包含那些使用频率很高的少量指令.并提供一些必要的指令以支持操作系统和高级语言.按照这个原则发展而成的计算机被称为精简指令集计算机(ReducedInstructionSetComputer-RISC).简称RISC。
1.1.5、竞争对手RISC
RISC是简化指令集计算机的简略缩写,其风格是强调计算机结构的简单性和高效性。RISC设计是从足够的不可缺少的指令集开始的。它的速度比那些具有传统复杂指令组计算机结构的机器快得多,而且RISC机由于其较简洁的设计,较易使用,故具有更短的研制开发周期。RISC结构一般具有如下的一些特点:
(1)、单周期的执行: 它统一用单周期指令。从根本上克服了CISC指令周期数有长有短,造成运行中偶发性不确定,致使运行失常的问题。
(2)、采用高效的流水线操作:使指令在流水线中并行地操作,从而提高处理数据和指令的速度。
(3)、无微代码的硬连线控制:微代码的使用会增加复杂性和每条指令的执行周期。
(4)、指令格式的规格化和简单化:为与流水线结构相适应且提高流水线的效率,指令的格式必须趋于简单和固定的规式。比如指令采用16位或32位的固定的长度,并且指令中的操作码字段、操作数字段都尽可能具有统一的格式。此外,尽量减少寻址方式,从而使硬件逻辑部件简化且缩短译码时间,同时也提高了机器执行效率和可靠性。
(5)、采用面向寄存器堆的指令:RISC结构采用大量的寄存器—— 寄存器操作指令,使指令系统更为精简。控制部件更为简化,指令执行速度大大提高。由于VLSI技术的迅速发展,使得在一个芯片上做大量的寄存器成为可能。这也促成了RISC结构的实现。
(6)、采用装入/存储指令结构:在CISC结构中。大量设置存储器—— 存储器操作指令,频繁地访问内存,将会使执行速度降低。RISC结构的指令系统中,只有装入/存储指令可以访问内存,而其它指令均在寄存器之间对数据进行处理。用装入指令从内存中将数据取出,送到寄存器;在寄存器之间对数据进行快速处理,并将它暂存在那里,以便再有需要时。不必再次访问内存。在适当的时候,使用一条存储指令再将这个数据送回内存。采用这种方法可以提高指令执行的速度。
RISC(精简指令集计算机) 设计方案,如它的名字所蕴涵的那样,有一个简化的指令集,该指令集提高处理器的效率但是需要有更复杂的外部程序。RISC结构优先选取使用频最高的简单指令,避免复杂指令;将指令长度固定,指令格式和寻地方式种类减少;以控制逻辑为主,不用或少用微码控制等措施来提高运算速度。
RISC设计方案是根据John Cocke在IBM所做的工作形成的。John Cocke发现大约20%的计算机指令完成大约80%的工作。因此,基于RISC的系统通常比CISC系统速度快。它的80/20规则促进了RISC体系结构的发展。
当然,和CISC架构相比较,尽管RISC架构有上述的优点,但不能认为RISC架构就可以取代CISC架构,事实上,RISC和CISC各有优势,而且界限并不那么明显。现代的CPU往往采用CISC的外围,内部加入了RISC的特性,如超长指令集CPU就是融合了RISC和CISC的优势,成为未来的CPU发展方向之一。
1.2、精简指令集运算(Reduced Instruction Set Computing,RISC)
1.2.1、简述
精简指令集,是计算机中央处理器的一种设计模式,也被称为RISC(Reduced Instruction Set Computer的缩写)。 精简指令集通过只执行在程序中经常使用的指令来简化处理器的结构,而特殊操作则以子程序的方式实现,它们的特殊使用通过处理器额外的执行时间来弥补。这种设计思路对指令数目和寻址方式都做了精简,使其实现更容易,指令并行执行程度更好,编译器的效率更高。这种设计思路最早的产生缘自于有人发现,尽管传统处理器设计了许多特性让代码编写更加便捷,但这些复杂特性需要几个指令周期才能实现,并且常常不被运行程序所采用。此外,处理器和主内存之间运行速度的差别也变得越来越大。在这些因素促使下,出现了一系列新技术,使处理器的指令得以流水执行,同时降低处理器访问内存的次数。早期,这种指令集的特点是指令数目少,每条指令都采用标准字长、执行时间短、中央处理器的实现细节对于机器级程序是可见的。
精简指令集计算机(RISC:Reduced Instruction Set Computing RISC)是一种执行较少类型计算机指令的微处理器,起源于80年代的MIPS主机(即RISC机),RISC机中采用的微处理器统称RISC处理器。这样一来,它能够以更快的速度执行操作(每秒执行更多百万条指令,即MIPS)。因为计算机执行每个指令类型都需要额外的晶体管和电路元件,计算机指令集越大就会使微处理器更复杂,执行操作也会更慢。纽约约克镇IBM研究中心的John Cocke证明,计算机中约20%的指令承担了80%的工作,于1974年,他提出RISC的概念。许多当前的微芯片都使用RISC概念。
精简指令集计算机:(RISC:Reduced Instruction Set Computing)一种指令长度较短的计算机,其运行速度比CISC要快。RISC和 CISC是 CPU 从指令集的特点上可以分为两类 :CISC 和 RISC 。 RISC 是英文 Reduced Instruction Set Computing 的缩写 , 就是 " 精简指令运算集 ” , CISC就是 " 复杂指令运算集 " 。RISC 的指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。目前在中高档服务器中普遍采用这一指令系统的 CPU ,特别是高档服务器全都采用 RISC 指令系统的 CPU 。在中高档服务器中采用 RISC 指令的 CPU 主要有 Compaq (康柏,即新惠普)公司的 Alpha 、 HP 公司的 PA-RISC 、 IBM 公司的 Power PC 、 MIPS 公司的 MIPS 和 SUN 公司的 Sparc 。
RISC是相对于复杂指令集计算机(CISC)而言的。所谓复杂指令集计算机是依靠增加机器的硬件结构来满足对计算机日益增加的性能要求。计算机结构的发展一直是被复杂性越来越高的处理机垄断着,为了减少计算机操作与高级语言的差别,为了改善机器的运行特性,机器指令越来越多,指令系统也越来越复杂.特别是早期的较高速度的CPU和较慢速度的存储器间的矛盾,为了尽量减少存取数据的次数,提高机器的速度,大大发展了复杂指令集,但随着半导体工艺技术的发展,存储器的速度不断提高,特别是高速缓冲的使用,使计算机体系结构发生了根本性的变化,硬件工艺技术提高的同时,软件方面也发生了同等重要的进展,出现了优化编译程序,使程序的执行时间尽可能减少!并使机器语言所占的内存减至最小,在具有先进的存储器技术和先进的编译程序的条件下,CISC体系结构已不再适用了,因而诞生了RISC体系结构,RISC技术的基本出发点就是通过精减机器指令系统来减少硬件设计的复杂程度,提高指令执行速度,在RISC中,计算机实际上每一个机器周期里都执行指令,无论简单或复杂的操作,均由简单指令的程序块完成,具有较强的仿真能力。
在RISC机器中,要求在单机器周期时间内执行所有的指令,而系统最根本的吞吐率限制是由程序运行中访存时间比例所决定的,因此,只要CPU执行指令的时间与取指时间相同,即可获得最大的系统吞吐率。(对于一个机器周期执行一条指令而言)。RISC机器中,采用硬件控制以实现认速哪一指令译码,并采用较少的指令和简单寻址模式,通过固定的指令格式来简化指令译码和硬线控制逻辑。另外,RISC设计是以复杂的设计优化来求取简单的硬件芯片环境.编译优化可以改善HLL程序的运行效率。
RISC设计消除了微码的例行程序,把机器代级控制交给软件处理.即用较快的RAM代替处理器中的微码ROM作为指令的缓存(Cache),计算机的控赶驻存在指令Cache,从而使得计算机系统和编译器产生的指令流使高级语言的需求和硬件性能密切配合。
计算机的性能可以用完成一特定任务所需的时间来衡量,这个时间等于CXTXl。
C=完成每条指令所需的周期数
T=每个周期的时间
I=每个任务的指令数
RISC技术就是努力使C和T减至最小,C和T的减小可能导致I的增匆,但优化编译技术和其他技术的采用可以弥补由于I的增加对机器性能的影响.RISC技术之所由很快由一种新见解发展成为前景广娜的计算机市场,主要有如下几方面的原因:一是RISC结构适应只新月异的VLSI技术发展;二是RISC简化了处理器结构,实现和调试较容易,因而设计代价低,开发周期短;三是简化了结构,处理器占据了较小的芯片面积,从而可在同一芯片上集成进较大的寄存器文件,翻译后备缓冲器(TLB)、协处理器和快速乘膝器等,使得处理器获得更高的性能;四是RISC对HLL程序的支持优于以往的复杂指令系旅计算机,可以使用户(程序员)很容易使用统一的指令集,很容易估算代码优化所起的作用,使程序员对硬件的正确性有了更多的信任感 。
RISC这种指令集运算包括HP的PA-RISC,IBM的PowerPC,Compaq(被并入HP)的Alpha,MIPS公司的MIPS,SUN公司的SPARC等。目前只有UNIX,Linux,MacOS等操作系统运行在RISC处理器上。
1.2.2、分类
(1)、采用多级指令流水线结构
采用流水线技术可使每一时刻都有多条指令重叠执行,以减小 CPI 的值,使 CPU 不浪费空周期。
实例: Pentium Ⅱ /Pro/Celeron 可同时发出执行五条指令, AMD - K6/K6 - 2 可同时发出六条指令。
(2)、机器中使用频率高的简单指令及部分复杂指令
这样可减小时钟周期数量,提高 CPU 速度,其实质是减小 CPI 下的值实现。实例:选取运算指令、加载、存储指令和转移指令作主指令集。
(3)、采用加载 (Load) 、存储 (Store) 结构
只允许 Load 和 Store 指令执行存储器操作,其余指令均对寄存器操作。实例: Amd - K6/K6 - 2 、 P Ⅱ /Celeron/Pro 均支持对寄存器的直接操作和重新命名,并大大增加通用寄存器的数量。
(4)、延迟加载指令和转移指令
由于数据从存储器到寄存器存在二者速度差、转移指令要进行入口地址的计算,这使 CPU 执行速度大大受限,因此, RISC 技术为保证流水线高速运行,在它们之间允许加一条不相关的可立即执行的指令,以提高速度。
实例:主要体现于预测执行、非顺序执行和数据传输等方面,除 Intel P54/55C 不支持,像 K6 - 2 、 P Ⅱ均支持。
(5)、采用高速缓存 (cache) 结构
为保证指令不间断地传送给 CPU 运算器, CPU 设置了一定大小的 Cache 以扩展存储器的带宽,满足 CPU 频繁取指需求,一般有两个独立 Cache ,分别存放“指令+数据”。
实例: P Ⅱ /Celeron:16K + 16K , AMD - K6/K6 - 2 为 32K + 32K , Cyrix M Ⅱ :64K( 实也为 2 个 32K Cache ,此作共享 Cache) , P Ⅱ还加了 L2 Cache,更是大幅提高了 CPU 速度。
1.2.3、特点
RISC的特点是指令及其格式精少,操作和控制简捷。具体有下列几个方面:
(1)、精简指令集
RISC结构采用精简的,长短划一的指令集,使大多数的操作获得了尽可能高的效率。某些在传统结构中要用多周期指令实现的操作,在RISC结构中,通过机器语言编程,就代之以多条单周期指令了。精简的指令集大大改善了处理器的性能,并推动了RISC的设计。对于到底精简到什么程度的问题,没有一定的回答。将现有RISC系统与CISC系统作一对比,便可见大概。通常,对RISC而言:
指令数少,不超过128条。
寻址方式少,不超过4种。
指令格式少,不超过4种。
处理关于扩充指令集的建议是非常慎重的,要经过认真的权衡,验证,在看它们是否真正提高计算机的性能。例如,MIPS采用了一条规则:增加一条指令必须使性能在一定的应用范围内得到1%的增益,否则这条指令将被拒绝。
(2)、指令时钟周期,指令长度相等
如果每一条指令要执行的任务既简单又明了,则执行每一条指令所的时间可以被压缩周期数也可减少。RISC的设计目标是实现一个机器周期执行一条指令,使得系统操作更加有效。接近这个目标的技术包括指令流水线及特定的装/存结构等。典型的指令可包括取指、译码、执行和存装果等阶段。单周期指可通过让所有指令为标准长短来实现。标准指令长短应与计算机系统的基本字长相等,通常与系统中数据线数相等。
在任何取指周期,完整的单个指令要传给CPU。例如,如果基字长是32位,且系统总线的数据部分是32线,则标准指令长度是32位。要让所有指令的执行时间一致较困难。有些指令,包含简单的在CPU寄存器上的逻辑操作(清寄存器等),则可容易地在一个CPU时钟周期内执行;其它指令可能包含内存存取(对内存的读写、取数等)或多周期操作(乘、除等),可能无法在单周期内执行。这给设计者提出了这样的要求;让大多数经常使用的指令得以在一个单周期内执行。
(3)、指令流水线
减少执行一条指令所需周期数的方法是重叠执行多条指令。指令流水线采用这样的工作方式:将每条指令的执行分为几个离散部分,然后同时执行多条指令。任何指令的取指和执行阶段占据相同时间,理想的是一个单周期。这可说是RISC最重要的一条设计原则。所有从内存到CPU执行的指令,都遵循一种恒定的流的形式。每条指令都以同样的步调执行,无等待的指令。CPU始终是忙的。达到流水线操作的必要条件是:
标准的,固定长短的指令,它与计算机字长和数据线的字长相等。
所有指令的标准执行时间,最好在一个单CPU周期内。
例SPARC芯片等采用了取指、译码、执行和写入结果四级流水线结构,以最大限度来提高处理器性能。在每一个时钟周期的头上,都可以开始执行一条新的指令,这就保证了每个机器周期从存贮器平均取出一条新的指令,从而,总体看,大多数指令能在单周期内实现。指令流水线技术可以比作一条装配线—指令象是被加工的产品一样,从一道工序流到下一道工序,一直到它执行完为止。
因此,指令流水线利用一个等于其流水线深度的因子,来减少指令周期数是可能的,但这样的话,要求流水线始终充满有用指令且没有任何东西阻碍指令通过流水线,这样的需求给结构增加了一定的负担。例如,对于ALU等资源的竞争,阻止了流水线中指令的流动。长短不一的执行时间所引起的不良后果更是显而易见,这也是为什么RISC要定义一个有前面所述特点的指令集的原因。
(4)、装入和存数(LOAD/Store)结构
执行与内存有关的操作指令,不是要求增加每个周期的时间,就是要求增加指令的周期数,二者必取其一。因为这些指令要计算操作数的地址,将所需的操作数从内存中读出,计算得出结果,再把结果送回内存,所以它们执行的时间就长得多。为了消除这种指令的负作用,RISC采用了这样的装入和存数结构:只有装入(Load)和存数(Store)指令才去访间内存,所有其它操作只访问保存在处理器寄存器中的操作数。其优点在于:
减少访问内存的次数,降低了对内存带宽的要求。
将所有的操作限制于只针对寄存器,帮助了指令集的简化。
取消内存操作可使编释器优化寄存的分配更容易—这种特性减少对内存的存取,同时也减少了每一任务的指令数。
所有这些都有助于RISC实现的每个周期执行一条指令的目标。尽管如此,装入和存数指令仍阻碍着IRSC设计目标的实现。用优化编译技术处理装入指令和分支指令的延迟,有助问题的解决。优化编译技术虽不是专门面向RISC结构的,但优化编译器依赖于RISC结构完成其出色的任务,RISC结构又依赖于优化编译器得到它们更完善的性能。编释器要能分析数据和控制流,并在此基础上调整指令的执行顺序,巧妙安排寄存器的用法。前一种作用可减少CPU的空闲时间,后一种作用可以提高寄存器中所保存的数据的可再用率,减少访存次数,缩短数据通路的长度。
(5)、拥有较大寄存器组
为了便于实现多数指令在寄存器之间的操作,即所谓的寄存器到寄存器操作,必须有足够量的CPU通用寄存器。足量的寄存器使得在随后操作中需作为操作用的中间结果暂存在CPU寄存器中,因而就减少了对内存的装入和存数,加快了运行速度。工业化RISC系统中至少采用32个通用CPU寄存器。
(6)、采用硬连线控制
由于微程序设计给设计者提供的灵活性,许多CISC系统是微程序控制的。不同的指令通常具有不同长度的微程序,这意味着每条指令执行的周期数不一样,这与所有指令一致的、流线的处理原则相矛盾。但这可由硬连线控制来解决,而且速度会更快。因此RISC应该是硬连接线控制的。当每条指令与一单条微指令有一对一相相符合的关系时可有例外,也就是每个微程序由一单个控制字组成。这种设计可与用硬连线控制一样快,一样高效,并使设计者得益于微程序设计的优越性。采用硬连线控制,可使RISC系统控制器简单。设计的简单又使机器的布局更加合理,使得设计者可以集中精力去优化那些剩下的,为数不多的,但又很关键的处理器特性。简化的结构使芯片上面积资源紧张的状态得以缓解,一些对性能至关重要的结构,象大的寄存器元件,转换查找缓存(TLB)S协处理器和乘除单元都可以装在同一块芯片上。这些附加的资源又使处理器增加了很大的性能优势。事实上,RISC并非一定严格地完全具备上述特点,有些称作RISC型的系统甚至违背了上述某方面。上述特点应被当作一种指导原则来解释RISC的性质。放宽点讲,满足大部分这些特点的系统就能被看作RISC。
1.2.4、优点
RISC在保持成本降低的同时能很好地提高速度。适用VLSI(VERYLARGESCALEINTEGRATION)工艺。
由于RISC指令集清简,使之只需相对小而简单控制单元的译码和硬件执行子系统。这导致在用VLSI实现计算机系统时的下列结果:
A、控制单元所占的芯片面积大为减少,如RlsCI占10%,而通常CISC占50%以上。因而,在RISCVLSI芯片,留下更多可用空间,使整个CPU和其它部件故在一块芯片上(如高速缓存,浮点单元,部分主存,存贮器管理单元,1/0口)。
B、由于控制区域减少,就可在芯片上按放大量的CPU寄存器(RISCI是138个)。
C、通过减少VLSI芯片上控制单元面积和放置大量一致的寄存器,可以提高芯片的正则化因子(regulariZationfaetor)。基本上,正则化因子越高,VLSI设计成本越低。
D、有利于使用GaAs(砷化稼)VLSI芯片的实现技术,因其适于制造密度较高的芯片。总之,是降低了复杂程序,简化了结构。
(1)、速度高
RISC特点之一是指令流水线,而指令长短和执行时间的致性,使流水中的等待和保持时间减到最少。这些因素有利提高计算速度。RISC中较简单和较小的控制单元中的门也较少,这使控制单元信号的传送路径较短,使操作速度加快。指令集的精简,导致译码系统小而简单,供RISC的译码速度加快。硬连线所减少的控制单元,使RISC比通常由微程序控制的系统执行起来要快。相对大的CPU寄存器,减少了CPU与内存间取指,存数等操作的冲突;大的寄存器组可用来存贮调用过程被调用过程之间传递的参数,存贮中断程序的有关信息,否则,这些信息只能保存在内存中。所有这些都节约了大量的计算机处理时间。优化编译中的分支延迟技术也对提高速度作出了贡献。总的看,在功能大致相同的情况下,RISC一般是CISC处理速度的2~4倍。
(2)降低设计成本,提高可靠性
CPU相对小而简单的控制单元通常会导致下列成本及可靠性方面的益处:
A、RISC控制单元的设计时间缩短,这可使整个设计成本降低
B、短的设计时间使最终产品在设计完成时被废弃的可能性减少
C、较简单,较小的控制单元能减少设计错误,从而提高可靠性;而且,定位和修正错误也比CISC容易
D、因指令格式l(或2种)简而少,所有指令又有规范长度,所以指令不会越过字界限,也不会跨越虚存(iVrtualMemory)中不同的页,这排除了虚存管理子系统设计中潜在的困难
(3)支持高级语言,而不支持汇编语言
从CISC向RISC演变的过程,类似于汇编语言向高级语言的发展过程。用汇编语言写程序要使用一些精心设计的复杂指令,而高级语言的编写几乎不同复杂指令。RISC在追求精简指令的同时,把体系结构和优化编译的设计紧密结合起来,使综合结果引起整体性能的改善。如果说RISC得以发展是基于VLSI技术和编译技术的提高,那么可以理解为用复杂的编译代替了复杂的指令系统,甚至可认为是把硬件的难题转移给了软件。而近年来智能型编译器的迅速发展,能很方便地胜任这项任务,RISC的优势也许正在于此。传统的CISC必有复杂的微码编写与设计工作,使用汇编语言又涉及汇编程序的研制,这些都很费人力和时间。RISC更利于支持高级语言,这也是长以来计算机面临的“软件危机”得以解决的途径之一。RISC的成功在于软件的兼容性。只要通过重新编译使源程级兼容,则已有的软件可方便地在RISC机上运行。
(4)编程者(用户)得到的好处
简化了的结构使编程者也得到了很多好处:
一个更为统一的指令集用起来很方便。
由于指令数和周期数之间有一个比较严格的对应关系,代码优化的真实效果就容易度量。
编程者对于硬件的把握更为准确。
1.2.5、缺点
当今计算机世界出现了寻觅更好性能的热潮,RISC与CISC既对峙又互补。RISC有其自身的缺点。
(1)、编译后指令长度较长,内存需要较大
RISC的缺点与其一些优点直接有关。因为RISC拥有的指令数少,有些在CISC中仅由一条指令完成的功能,在RISC中需二、三条甚至更多条指令,这使RISC代码较长,因而RISC的程序需要更多的内存,内存与CPU间的指令冲突也会增加。研究表明,平均而言,执行同样的功能,一个RISC程序比一个CISC程序长30%。同时,RISC对编译器要求较高,优化编译器的设计是一项极复要且技术要求很高的工作,它又必须由RISC机制造单位自身编制,因为没有RISC详细原始资料不可能产生编译程序的目标代码。这样,第三方公司提供新版本较困难,用户选择余地较小,软件费用增加了。
(2)、大寄存器组使寻址复杂,速度降低
RISC系统的一个有争议的特点是其大寄存器组。大寄存器组有前述优点,但另一方面,也有缺点,大寄存器使寻址时间增多,另个,一些编译器使小寄存器组的使用更为有效。CPU寄存器组到底应多大还有待讨论,大寄存器U组还可由高速缓存(CACHE)代替。大寄存器组的不足之处可归结如下:
A、存取时间长;
B、寄存器组占据了更多的芯片空间;
C、先进的编译技术使小寄存器组更有效;
D、如果上下文转换现场的所有CPU寄存器被保存,则大寄存器组会化更多存贮时间;
E、如果使用了窗口指针(RISC的实施要点之一是重叠寄存器窗口,目的是便于参数传递。重叠寄存器窗口要用到窗口指针),寄存器地址译码会较长。同时重叠寄存器也使CPU逻辑变得复杂;
(3)、硬连线控制不灵活
出现错误的可能性较大,不易发现和修改错误,处理复杂指令也较困难。(4)单字指令不能使用用于全32位地址的直接内存寻址方式。由于这个原因,一些生产厂家已使一小部分指令具有双字卡(如INTEL80960),使用这样的指令由程序员决定,他可仅用单字指令写完整的程序。
1.2.6、发展前景
RISC技术的基本出发点是通过精减机器指令系统来减少硬件设计的复杂程度,提高指令执行速度。尽管RISC的设计思想对计算机结构发生了巨大影响,并获得了很大成功,但复杂指令集计算机(CISC)技术相对而言则使程序的编制来得更容易些,因此,CISC技术和RISC技术并不是相互孤立的。目前,有一种新的设计思想,它是以提高整个计算机系统的性能为出发点,在结构上吸收了CISC和RISC的优点。如许多CISC设计中采用了RISC技术,美国国家半导休公司的NSC32532微处理器在CISC设计中采用了RISC技术,使指令平均执行时间从原来的6个机器周期降到小于2.4个机器周期,在26MHZ主频下,运行速度达10一12M1PS。Intel80486和Mot。r。la68040也吸收了RISC设计技术,从而达到每条指令平均执行时间小于2个机器周期,仙童公司的Clipper机是综合R1SC与CISC技术优点的32位微处理机,其运行速度高达33MIPS。因此,当前设计处理机的两种主要方法(RISC和ClSC技术)并不是截然分开的,它们是相辅相成的,目前已有人将CISC技术和RISC技术溶合在一起,提出了可写指令集计算机(WISC)结构设想,并具体规定了集中Rlsc和Clsc优点的策略原则,尽管如此,它仍是建立在RlSC概念笋碑上的一个RISC技犬的进一步发屏。
目前大多数RISC处理器已达到了每个周期执行一条指令的目标(即CPI比率),但这并不是极限,RISC技术中又出现了超级标量和超级流水线技术。超级标量技术就是使微处理器在一个时钟周期内并行地执行几条指令,而超级流水线技术则是主流水线段(指令译码和指令执行)只占一个时钟周期的一部分,这样,仍可在一个时钟周期内同时执行几条指令Intel8096。就采用了超级标量技术,它能同时执行整数指令和浮点指令.IBM公司的RS/6000也采用的是超级标量结构,处理器包含三个不同的处理部件:定点处理器、浮点处理器、分支处理器,一个时钟周期可执行四条指令(4IPC),最多可达6IPc。RISc科学家指出,过去那种令人鼓舞的微处理器性能提高过程不大可能继续下去,今后,Cache的容量及其结构和优化编译器将成为提高计算机性能的关键因素。未来发展重点将放在多处理器技术上 。
1.3、最小指令集(MISC)
MISC比RISC更小,它包括非常少量的基本操作和相应的操作码。如果它们是基于堆栈而不是基于寄存器,则这些被归类为MISC,但是也可以由指令的数量(少于32条但大于1条)来定义。
1.4、单一指令集(OISC)
这描述了一个只使用一条指令的抽象计算机,它消除了对计算机语言操作码的需求。例如,“mov”是图灵完成,这意味着它能够成为一个OISC,以及其他使用减法的指令。据我所知,OISC还没有商业化。
在很多媒体的报道中,定义一套指令集被描述为黑科技,但事实上,实现一款高性能的CPU和围绕指令集构建软件生态才是真正具有挑战性的工作,定义一套指令集的难度并不大,伯克利的研究团队4名成员仅用了3个月就完成了RISC-V的指令集开发。由于伯克利研究团队缺人缺钱,于是决定将RISC-V开源,成为CPU中的Linux,在获得各方支援后,又相继开发了一些产品。
1.5、显式并行指令集运算(Explicitly Parallel Instruction Computing,EPIC)
1.5.1、简述
显式并行指令运算(英文:Explicitly Parallel Instruction Computing,缩写:EPIC)是一种指令集架构,由HP和Intel联合开发。EPIC允许处理器根据编译器的调度并行执行指令而不用增加硬件复杂性,该架构由超长指令字架构发展而来,并做了大量改进。
1.5.2、原理
其指令中有3位是用来指示上一条运算指令是不是与下一条指令有相关性,是不是要等上一条指令运行完毕后才能运行下一条,如果没有相关性,则两条指令可同时由不同的CPU节点来处理,这样的方式大大提高了CPU并行运算的效率。
1.5.3、应用
EPIC乃先进的全新指令集运算,只有Intel的IA-64架构的纯64位微处理器的Itanium/Itanium 2。EPIC指令集运算的IA-64架构主要针对的操作系统是微软64位安腾版的Windows XP以及64位安腾版的Windows Server 2003。另外一些64位的Linux,一些64位的UNIX也可以运行IA-64(EPIC)架构。
1.6、超长指令字指令集运算(VLIW)
1.6.1、简述
VLIW:(Very Long Instruction Word,超长指令字)一种非常长的指令组合,它把许多条指令连在一起,增加了运算的速度。 超长指令字(VLIW)是指令级并行,超线程(Hyper-Threading)是线程级并行,而多内核则是芯片级并行。这三种方式都是提高并行计算性能的有效途径。其中,VLIW(超长指令字)体系结构是美国Multiflow和Cydrome公司于20世纪80年代设计的体系结构,EPIC体系结构就是从VLIW中衍生出来的。
它是第三代电子计算机而提出的,采用中、小规模集成电路制造的电子计算机。1964年开始出现,60年代末大量生产。其机种多样化、系列化,外部设备品种繁多,并开始与通信设备相结合而发展为由多机组成的计算机网。运算速度可达每秒几百万次,甚至几千万次、上亿次。中国于1970年研制成第一台集成电路计算机。
指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序 计算机指令的过程就是计算机的工作过程。
控制器靠指令指挥机器工作,人们用指令表达自己的意图,并交给控制器执行。一台计算机所能执行的各种不同指令的全体,叫做计算机的指令系统,第一台计算机均有自己的特定的指令系统,其指令内容和格式有所不同。
通过将多条指令放入一个指令字,有效的提高了CPU各个计算功能部件的利用效率,提高了程序的性能。
1.6.2、指令
通常一条指令包括两方面的内容:操作码和操作数,操作码决定要完成的操作,操作数指参加运算的数据及其所在的单元地址。
在计算机中,操作要求和操作数地址都由二进制数码表示,分别称作操作码和地址码,整条指令以二进制编码的形式存放在存储器中。
指令的种类和多少与具体的机型有关,在此不详述,请参见具体的机器资料手册。
指令的顺序执行,将完成程序的执行,因而有必要了解指令的执行过程。首先是取指令和分析指令。按照程序规定的次序,从内存储器取出当前执行的指令,并送到控制器的指令寄存器中,对所取的指令进行分析,即根据指令中的操作码确定计算机应进行什么操作。 其次是执行指令。根据指令分析结果,由控制器发出完成操作所需的一系列控制电位,以便指挥计算机有关部件完成这一操作,同时,还为取下一条指令作好准备。
2、指令集和微架构
指令集与微架构(一套用于执行指令集的微处理器设计方法)不同,使用同一种指令集可以设计多种不同的微架构。例如,Intel的Pentium和AMD的AMD Athlon,两者几乎采用相同版本的x86指令集体系,但是两者在内部设计上有本质的区别。
(1)、指令集:指令集是一款CPU处理指令及数据的规范,我们只能通过输入指定格式的指令才能操作计算机,这个是面向程序员和用户层面的。 CPU的指令集是软件与CPU这两个层级之间的接口, 而CPU自己, 就是对于这一套CPU指令集的"实例化".
(2)、微架构:微架构是面向CPU设计人员的,通过设计处理器的指令执行单元,当完成整个设计时,组成的一整套执行规定指令的微处理器的架构就叫“微架构”。
2.1、指令集
CPU的指令集是软件与CPU这两个层级之间的接口, 而CPU自己, 就是对于这一套CPU指令集的"实例化".
无论处于上层的软件多么的高级,想要在CPU执行,就必须被翻译成"机器码", 翻译这个工作由编译器来执行.。编译器在这个过程中,要经过"编译", "汇编","链接"几个步骤, 最后生成"可执行文件" 。可执行文件中保存的是二进制机器码, 这串机器码可以直接被CPU读取和执行。
软件意义上, "指令集"实际上是一个规范, 规范汇编的文件格式,以下为一条x86汇编代码:
mov word ptr es:[eax + ecx * 8 + 0x11223344], 0x12345678
这里可以体现出指令集的格式限制:
(1)、可以使用mov指令, 但它只能有2个操作数.
(2)、它的操作数长度是16 (word), 不要看到后面0x12345678就认为是32位操作数.
(3)、它带有段超越前缀, 这里使用了es, 还可以使用ds, cs, ss, fs, gs. 但是只能用这几个.
(4)、第一个操作数是一个内存地址, 第二个是立即数. 但是, 这个内存地址不能乱写, 写成[eax+ecx*10+0x11223344]就错了.
实际上, 一条汇编指令与一段机器码是一一对应的。上面这段汇, 可以被x86编译器翻译成几乎唯一的一段机器码:
26 66 c7 84 c8 44 33 22 11 78 56
上面提到的(1)(2)(3)(4)点如果有一个弄错,,这一步就会失败。
可以看出来, 指令集的作用,就是告诉程序员/编译器, 汇编一定要有格式。 支持什么指令, 指令带什么限制条件, 用什么操作数,用什么地址,都是指令集规范的内容,要是写错了,就无法翻译成机器码。
指令集规范汇编,汇编可以翻译成机器码, 机器码告诉CPU每个周期去做什么。 因此,CPU指令集是描述CPU能实现什么功能的一个集合,就是描述"CPU能使用哪些机器码"的集合"。
那机器码进入到CPU后又做什么呢,编译器和CPU的分界线:
需要被执行的机器码先要被OS调度到内存之中,程序执行时, 机器码依次经过了Memory--Cache--CPU fetch, 进入CPU流水线,接着就要对它进行译码了,译码工作生成的象是CPU内部数据格式,微码(或者类似的格式, 这个格式不同的厂商会自己设计)。
软件层:汇编语言------>接口层:汇编语言所对应的机器码------>硬件层:CPU使用内部数据结构进行运算
如果机器码代表的功能是在指令集规范内的,这条机器码就可以生产微码,并在CPU内正常流动。假设机器码是错误的,是不可以通过CPU的译码阶段的,控制电路一定会报错。这种情况反映在Windows里往往都是蓝屏,因为CPU无法继续执行,它连下一条指令在哪都不知道。
那么指令集在CPU里就代表:只有CPU指令集范围内的指令可以被成功的译码,并送往CPU流水线后端去执行。
和常规的想法不一样,CPU不需要任何形式的存储介质去存储指令集,因为"译码"这个步骤就是在对指令集里规范的机器码做解码。硬件上,译码这件事需要庞大数目的逻辑门阵列来实现。
跳出格式这个圈子来看待这个问题。可以说,CPU执行单元的能力,决定了指令集的范围。比如, CPU的执行单元有能力执行16位加法,32位加法,64位加法,那么指令集里一般就会有ADD 16,ADD 32,ADD 64这样的表达方式。如果CPU的执行单元没有电路执行AVX指令,那么指令集里一般就没有VINSERTF128这样的指令供使用。所以, 强有力的执行单元能够提供更多的指令集。
再来看"CPU指令集在哪里"这个问题,回答是,CPU本身就是CPU指令集。指令集规定CPU可以做什么事,CPU就是具体做这件事的工具。如果一定要指定一个狭义的CPU指令集的存放位置,那就是CPU中的"译码电路"。
比如我们设计一套指令集,其中肯定有条加法指令。比如Add R1 R2 。我们可以认为这条指令的意思是计算寄存器R1中的内容和R2的和,然后把结果存到R1寄存器中。
那么经过编译后这条指令会变成二进制,比如010100010010 。这条二进制指令一共12位。明显可以分为三大部分。最前面的0101表示这是条加法指令,后面0001说的是第一个操作数是寄存器1,最后0010说的是第二个数就是寄存器2(其实实际没有这么简单的指令,至少应该区分操作数是寄存器还是直接的数据,但为了把这说的更容易理解作了简化)。我们可以通过十二根导线把这条指令输入一个CPU中。导线通电就是1,不通电就是0 。为了叙述方便我们从左到右用A0-A11给这12根导线编上号。
然后计算机会分析这条指令,步骤如下:
(1)、最开始的两根导线A0和A1,第一根有电第二根没电,就能知道这是一条运算指令(而非存储器操作或者跳转等指令)。那么指令将被送入逻辑运算单元(ALU)去进行计算。其实很简单。只要这两根线控制接下来那部分电路开关即可;
(2)、接下来的A2和A3,01表示加法,那么就走加法运算那部分电路,关闭减法等运算电路;
(3)、A4-A7将被送入寄存器电路,从中读取寄存器保存的值。送到ALU的第一个数据接口电路上;
(4)、后面的A8-A11同样被送入寄存器选择电路,接通R2寄存器,然后R2就把值送出来,放到ALU的第二个数据接口上;
(5)、ALU开始运算,把两个接口电路上的数据加起来,然后输出;
(6)、最后结果又被送回R1;
基本上简单的运算计算机就是这么操作的,他其实不知道你那些指令都是什么意思,具体的指令编程机器码后就会变成数字电路的开关信号。其中某几段会作为控制信号,控制其他部分的数据走不同的电路以执行运算。他没有一个地方保存着如何翻译这些机器码的字典,所有机器码的意义都被体现在整个电路的设计中了。
当然,从汇编到机器码这步是汇编程序翻译的。汇编程序当然知道某条指令要翻译成什么样的机器码。
2.2、微架构
CPU的基本组成单元即为核心(core)。多个核心可以同时执行多件计算任务,前提是这些任务没有先后顺序。
核心的实现方式被称为微架构(microarchitecture)。微架构的设计影响核心可以达到的最高频率、核心在一定频率下能执行的运算量、一定工艺水平下核心的能耗水平等等。此外,不同微架构执行各类程序的偏向也不同,例如90年代末期Intel的P6微架构就在浮点类程序上表现优异,但在整数类应用中不如同频下的对手。
常见的代号如Core、Haswell、Cortex-A15等都是微架构的称号。注意微架构与指令集是两个概念:指令集是CPU选择的语言,而微架构是具体的实现。英特尔Core i7-4770的核心是Haswell微架构,这种微架构兼容x86指令集。对于兼容ARM指令集的芯片来说这两个概念尤其容易混淆:ARM公司将自己研发的指令集叫做ARM指令集,同时它还研发具体的微架构如Cortex系列并对外授权。但是,一款CPU使用了ARM指令集不等于它就使用了ARM研发的微架构。Intel、高通、苹果、Nvidia等厂商都自行开发了兼容ARM指令集的微架构,同时还有许多厂商使用ARM开发的微架构来制造CPU。通常,业界认为只有具备独立的微架构研发能力的企业才算具备了CPU研发能力,而是否使用自行研发的指令集无关紧要。微架构的研发也是IT产业技术含量最高的领域之一。
前面提到了指令集就是“规范”,这也就意味着他能指导CPU设计人员通过阅读“指令集规范”这本“指南”来设计CPU,而CPU设计人员通过阅读这本规范后设计出来的CPU结构就叫“微架构”。更正式的表述就是“微架构”就是“指令集”的具体“实现”。所以从我们日常使用中就可以举例,AMD和英特尔同样都是采用x86指令集的处理器,但是他们处理器具体微架构是不同的,这就是典型的“实现”问题。
指令集与微架构是不同的概念,不可混淆;CPU研发指的是微架构研发;如今指令集不再有“最适合领域”的说法。
数年前国产龙芯CPU获得MIPS授权的消息曾引起一阵风波,龙芯相关负责人还曾出来解释。龙芯是兼容MIPS指令集,微架构部由中科院自主研发的CPU系列。过去中科院资金不足所以没有MIPS指令集授权,但是指令集的实现方式是公开的,因而中科院可以在研发时选择兼容该指令集。待资金充足买下授权后,龙芯就可以合法在市面销售。从这里我们可以知道,厂商研发CPU时并不需要获得指令集授权就可以获得指令集的相关资料与规范,指令集本身的技术含量并不是很高。获得授权主要是为了避免法律问题。然而微架构的设计细节是各家厂商绝对保密的,而且由于其技术复杂,即便获得相应文档也难以山寨。不同厂商的微架构设计水平也有较大差异,典型如Intel与AMD的对比,前者在最近几年明显技高一筹。
微架构研发完成,或者说核心研发完成,接下来就是将其组装为芯片了。过去的芯片仅仅包括CPU部分,如今大量的芯片集成了CPU、GPU、IO等多种不同的功能组件,此时这种芯片就不是传统意义上的“CPU”了。将各种功能组件组装为芯片的技术含量相比微架构研发来说是较低的,因而业界能做此类工作的企业也数量较多。
在PC时代,几大主要的CPU研发厂商都只是自己研制微架构自己用。到了智能设备时代,ARM公司的微架构授权模式兴起。ARM自己开发微架构后将它们上架出售,其他厂商可以拿这些核心组装为芯片来使用或销售。由于这种模式对第三方的技术能力要求很低,加上ARM的微架构在低功耗领域表现优异,这种模式获得了广泛成功。如果你发现某款芯片标明使用了Cortex系列核心,则一定是这种模式的产物。如前所述,仅仅从ARM购买微架构来组装芯片的厂商是不能被称作CPU研发企业的,这些芯片也不能被称为“xx厂商研发的CPU”。典型如华为的海思920、三星Exynos 5430,只能说是“使用ARM Cortex-A15核心的芯片”。但是如果一款兼容ARM指令集的芯片使用了厂商自主研发的微架构情况就不同了。高通骁龙800、苹果A7就是这样的例子--它们分别使用了高通、苹果自主研发的CPU。
随着智能设备市场不断扩大,ARM阵营也不断壮大。占领智能设备领域后,ARM阵营开始进入PC、服务器与高性能计算领域。先是ARM发布了ARM v8 64位指令集规范,接着是各大厂商纷纷开始研发基于ARM v8的高性能微架构。有人会问,ARM指令集不是为低功耗设备研发的吗?怎么现在又开始做高性能CPU了呢?多年以前这样的怀疑是很有道理的,因为彼时不同指令集对微架构的影响还比较大,ARM适合低功耗,x86适合PC,Power适合小型机……这类区分是存在的。但是随着技术进步,指令集对微架构的影响已经小到可以忽略,任何指令集都可以做出适合不同领域的优秀微架构来。因此用户看到x86指令集的手机cpu或是ARM指令集的服务器CPU都无需惊讶,这是技术发展的自然结果。
那么,现在各家CPU研发厂商选择指令集的标准又是什么呢?业界除了x86和ARM、MIPS,其实还有一大堆各种各样的指令集。比如小型主机领域的Sparc、Alpha、Power等。国内几家研CPU的科研机构就分别选择了x86、MIPS、Sparc、Alpha、ARM指令集,早年甚至有机构选择Intel没落的Itanium使用的EPIC指令集的。一般来说大家倾向于选择软件生态较好的指令集--前面说过,软件必须编译后才能在某种指令集平台上运行,而编译是很复杂的事情,绝大多数闭源软件仅仅会对少数一两个平台编译。因而支持某种指令集的软件应用越多,这种指令集也就越有市场优势--新开发的微架构只需要兼容某种指令集,那么就可以很容易运行大量为其开发的软件。早年因为微软的强势与Wintel联盟的推动,x86指令集成了最受欢迎的角色,帮助Intel用彼时性能相对落后的微架构在PC平台挤跑了一众对手。后PC时代由于苹果谷歌的两大操作系统平台的推动,ARM指令集又取得了绝对的市场优势。但对于新的CPU研发单位来说,他们想获得热门指令集的兼容授权是很困难的事情。以前x86与ARM的指令集授权是拿钱买不到的,想要得到都需要进行高水平专利交换。拿到x86授权的几家厂商要么是拿的早(AMD、Cyrix、IDT),要么是有高水平技术与Intel交易(Transmeta,以功耗控制技术同Intel交易)。后来Nvidia想要研发自己的CPU,找Intel软磨硬泡后者就是不给,搞得Nvidia相当无奈。国内的研发单位当年开始研究时自知不可能拿到x86授权,于是各自去找关系好些的其他授权方解决问题了。ARM这边也一直对指令集授权卡的很死,之前只有高通、博通和Intel得到,也是通过技术交换的形式。08年苹果乔帮主被Intel甩脸色后决定自己搞CPU,最后也拿到了ARM的许可,想来彼时老乔也是威逼利诱,硬是让ARM屈服了(毕竟指令集多授权一家就多个对手啊)。后来ARM对指令集授权也放松了,去年三星与华为也分别得到了授权,他们的自研CPU预计也将在未来一两年面世。
本文总结下来的内容很简单:指令集与微架构是不同的概念,不可混淆;CPU研发指的是微架构研发;如今指令集不再有“最适合领域”的说法。希望这篇文章能帮助被这些问题困扰的朋友,也希望媒体在提及这些概念时多做一些科普与澄清。
3、常见指令集
3.1、Intel和AMD的指令集
Intel指令集:IA-64、IA MMX、IA SSE、IA SSE 2 、IA SSE 3、IA Supplemental SSE 3 、IA SSE 4.1、IA SSE 4.2、IA AVX、IA FMA、IA AES Extensions
AMD指令集:AMD 3DNow!、 AMD 3DNow! Professional、AMD 3DNowPrefetch、AMD Enhanced 3DNow!、AMD Extended MMX、AMD MisAligned SSE、AMD SSE4A、AMD SSE5、Cyrix Extended MMX
(1)、SSE指令集(Streaming SIMD Extensions)
由于MMX指令并没有带来3D游戏性能的显著提升,1999年Intel公司在Pentium IIICPU产品中推出了数据流单指令序列扩展指令(SSE)。SSE兼容MMX指令,它可以通过SIMD(单指令多数据技术)和单时钟周期并行处理多个浮点来有效地提高浮点运算速度。
在MMX指令集中,借用了浮点处理器的8个寄存器,这样导致了浮点运算速度降低。而在SSE指令集推出时,Intel公司在Pentium III CPU中增加了8个128位的SSE指令专用寄存器。而且SSE指令寄存器可以全速运行,保证了与浮点运算的并行性。
(2)、SSE2指令集
在Pentium 4 CPU中,Intel公司开发了新指令集SSE2。这一次新开发的SSE2指令一共144条,包括浮点SIMD指令、整形SIMD指令、SIMD浮点和整形数据之间转换、数据在MMX寄存器中转换等几大部分。其中重要的改进包括引入新的数据格式,如:128位SIMD整数运算和64位双精度浮点运算等。为了更好地利用高速缓存。另外,在Pentium 4中还新增加了几条缓存指令,允许程序员控制已经缓存过的数据。
(3)、SSE3指令集
相对于SSE2,SSE3又新增加了13条新指令,此前它们被统称为pni(prescott new instructions)。13条指令中,一条用于视频解码,两条用于线程同步,其余用于复杂的数学运算、浮点到整数转换和SIMD浮点运算。
(4)、SSE4指令集
SSE4又增加了50条新的增加性能的指令,这些指令有助于编译、媒体、字符/文本处理和程序指向加速。
SSE4指令集将作为Intel公司未来“显著视频增强”平台的一部分。该平台的其他视频增强功能还有Clear Video技术(CVT)和统一显示接口(UDI)支持等,其中前者是对ATi AVIVO技术的回应,支持高级解码、后处理和增强型3D功能。
(5)、3D Now!扩展指令集
3D Now!指令集是AMD公司1998年开发的多媒体扩展指令集,共有21条指令。针对MMX指令集没有加强浮点处理能力的弱点,重点提高了AMD公司K6系列CPU对3D图形的处理能力。由于指令有限,3D Now!指令集主要用于3D游戏,而对其他商业图形应用处理支持不足。
3DNow!+指令集:在原有的指令集基础上,增加到52条指令,其中包含了部分SSE指令,该指令集主要用于新型的AMDCPU上。
(6)、X86指令集
要知道什么是指令集,要从X86架构的CPU说起。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器则另外使用X87指令,
以后就将X86指令集和X87指令集统称为X86指令集。虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU都使用X86指令集,所以就形成了庞大的X86系列及兼容CPU阵容。
(7)、EM64T指令集
Intel公司的EM64T(Extended Memory 64 Technology)即64位内存扩展技术。该技术为服务器和工作站平台应用提供扩充的内存寻址能力,拥有更多的内存地址空间,可带来更大的应用灵活性,特别有利于提升音频视频编辑、CAD设计等复杂工程软件及游戏软件的应用。常说的64位指的是AMD公司出的64位CPU,而EM64T则是Intel公司按照自己的意思理解出来的64位,也就是和AMD公司的64位对应的另一种叫法。
(8)、RISC指令集
RISC指令集是以后高性能CPU的发展方向。它与传统的CISC(复杂指令集)相对。相比而言,RISC的指令格式统一,种类比较少,寻址方式也比复杂指令集少。使用RISC指令集的体系结构主要有ARM、MIPS。MIPS 指令集是最早实现商用的精简指令集(RISC)之一,上个世纪80年代初由斯坦福大学的研究小组研发,并在1984年成立MIPS计算机公司 [3] 。随后MIPS 成为上世纪90年代最流行的指令集,一度与 x86 和ARM 指令集齐名。RISC具有设计更简单、设计周期更短等优点,并可以应用更多先进的技术,开发更快的下一代处理器。MIPS是出现最早的商业RISC架构芯片之一,新的架构集成了所有原来MIPS指令集,并增加了许多更强大的功能。随着移动互联网的兴起,MIPS 指令集逐渐衰落,公司也多次辗转被收购。
(9)、AVX指令集
Intel AVX指令集在SIMD计算性能增强的同时也沿用了的MMX/SSE指令集。不过MMX/SSE的不同点在于增强的AVX指令,从指令的格式上就发生了很大的变化。x86 (IA-32/Intel 64)架构的基础上增加了prefix (Prefix),所以实现了新的命令,也使更加复杂的指令得以实现,从而提升了x86 CPU的性能。
AVX并不是x86 CPU的扩展指令集,可以实现更高的效率,同时和CPU硬件兼容性也好,并且也有着足够的扩展空间,这都和其全新的命令格式系统有关。更加流畅的架构就是AVX发展的方向,换言之,就是摆脱传统x86的不足,在SSE指令的基础上AVX也使SSE指令接口更加易用。
针对AVX的最新的命令编码系统,Intel也给出了更加详细的介绍,其中包括了大幅度扩充指令集的可能性。比如Sandy Bridge所带来的融合了乘法的双指令支持。从而可以更加容易地实现512bits和1024bits的扩展。而在2008年末到2009年推出的meniikoa CPU“Larrabee (LARAB)”处理器,就会采用AVX指令集。从地位上来看AVX也开始了Intel处理器指令集的新篇章。
3.2、AT指令集在移动卫星通信中的应用
AT 命令集是由贺氏公司(Hayes)发明,贺氏公司起初是一家生产拨号调制解调器的公司,而 AT 命令集最初的用途正是为了控制拨号调制解调器,其控制协议采用文本格式,且每条指令以 AT 打头,AT 指令集因此得名。随着技术的不断进步,低速的拨号调制解调器逐步开始满足不了高带宽、高速率的应用需求,因此逐步被市场所淘汰。贺氏公司也在这一技术升级换代的浪潮中所消失。但是 AT 指令却得以保存,其后,当时几家主要的移动电话生产商诺基亚、摩托罗拉、HP和爱立信基于贺氏AT指令加以延伸扩展,针对移动电话中的 GSM模块控制,研制出了一套完整的 AT 指令。由此,之后GSM 07.05标准、GSM07.07标准均将AT指令纳入其中。并且工业上常用PDU、GPRS控制等也均采用AT 指令来进行实际的控制。因此,AT 指令也成为了这些产品的事实标准。ATCoP,是 AT Command Processor的缩写,它是负责软件实现 AT 指令的模块,我们对 AT 指令的新增和修改都是通过 AT 命令处理器来实现的。其具体流程为 :当 AT 命令处理器接收到串口的 AT 命令,进行相应的解析工作,并根据具体的解析结果去 AT 命令表查找是否存在对应的处理选项,若找到对应的项,则继续执行相应的处理过程,并在处理结束后将得到的响应数据返回到串口。
SIO数据预处理模块的主要工作是将串口收到的AT命令先进行一个数据预处理,同时,将预处理所产生的非中断(null-terminated)命令行发送给 AT 命令解析模块。
AT 命令解析模块对传送来的非中断(null-terminated)命令行进行解析,并将每一个非中断命令行映射成一个 token 结构,并将此token结构放入到队列中,形成 AT命令表,等待AT命令处理模块进行查找调用。
AT命令处理模块处理AT命令时,对AT命令表中的token结构逐一进行查找,如果查找到匹配选项,则继续执行具体的处理函数,并将此token结构删除。AT命令响应产生模块主要是格式化解析AT命令产生的响应数据,并将此格式化的响应传送给数据终端设备(Data Terminal Equipment :数据终端设备)。
AT命令处理器的容错机制为 :一次只进行一条AT指令的处理,并且如果AT命令存在错误,在SIO 数据预处理模块就会给出一个错误响应,并产生一个错误代码,不再对其进行处理。
常规的卫星移动通信系统主要由卫星、卫星天线、功放及射频模块、信道模块以及用户组成。其中,地面站网络管理控制中心(Network Control Center,NCC)负责对整个卫星网内的各卫星地面站设备进行入网、退网、建立卫星业务通道、各种业务流程等进行统一的管理控制。卫星地面站设备包括卫星控制信道、卫星业务信道、射频及功放设备、卫星收发天线等。它负担着整个卫星业务的业务流程控制,业务数据采集、调制解调等工作。卫星控制信道主要负责整个卫星地面站设备的入网、退网等控制信令的传输控制,卫星业务信道负责对需要发送的卫星业务数据或者卫星话音数据进行加密、调制解调成射频信号传输给射频设备,或者对接收到的射频信号进行调制解调、解密转变成卫星业务数据或话音数据。射频设备以及卫星收发天线主要负责对经过信道处理的卫星数据进行发送或者接收对端传输来的卫星射频信号。当卫星地面站设备1的卫星用户1想和卫星地面站设备 N 的用户 N 进行卫星通信时,用户1通过卫星电话终端或者卫星数据终端进行卫星业务发起,这时,卫星控制信道将对业务发起的控制信令进行处理,通过地面站网络管理控制中心,为两个卫星地面站设备建立空中链路业务通道,之后两个地面站的用户就可以进行需要的业务通信了。当通信结束时,一方用户进行挂机操作,卫星控制终端将会发起业务结束控制信令,拆除两个卫星地面站设备之间的卫星链路。通过前面的简介可以知道,在整个卫星移动通信过程中,由于卫星通信天生的时延等特性,要进行正常的卫星业务通信,对每个卫星地面站设备的入退网管控、话音或者卫星数据流程的发起、结束,卫星业务链路的建立、拆除等控制流程起着至关重要的作用,因此这里我们将简单可靠的 AT 指令集引入,作为卫星移动通信系统的控制协议。这里我们将卫星控制信道称之为 AT命令解析器(AT Command Processor,AP),将卫星业务信道称之为信道处理器(Channel Processor,CP)在卫星控制信道中使用 AT 指令来进行具体对本地面站设备的的控制与解析、对卫星业务流程的发起管理与结束、以及对 CP 的设置与查询等指令。在 CP 中主要接收来自 AP 的一些参数的设置与查询命令,以及根据来自 AP 的 AT 指令进行业务通信的具体流程 。