MCPLive > 杂志文章 > ARM(RISC)和x86(CISC)的技术差异

ARM(RISC)和x86(CISC)的技术差异

2013-01-17张平《微型计算机》2013年1月上

RISC和CISC,这一对冤家,从诞生之日开始就处在不停的纠缠之中。直到今天,两者经过多年的发展后,都在各自领域打开了一片天地,并且相互渗透。RISC专注高性能、高性能功耗比、小体积以及移动设备领域,CISC专注桌面、高性能和民用市场。现在,RISC的代表是ARM,而CISC的代表则是我们耳熟能详的x86。那么,他们的技术差异在哪里?究竟是怎样的技术分歧带来了两者如此大的差别呢?

ARM(RISC)和x86(CISC)的技术差异。

指令集的出现

要说清楚RISC和CISC,也就是今天热门的ARM和x86之间的差异,还得把时间往前推一些,观察计算机诞生之初的一些事情,才能很清楚地了解指令集、精简和复杂之间的关系。

机器语言的实例
机器语言 含义
0000,0000,000000010000 代表 LOAD A, 16
0000,0001,000000000001 代表 LOAD B, 1
0001,0001,000000010000 代表 STORE B, 16
0001,0001,000000000001 代表 STORE B, 1

今天学生学习计算机实在是太幸福了!今天有大量的可视化的操作方式,有成熟的各种接近自然语言的编程语言,在这些语言中还有很多写好的库用于完成那些固定而复杂的任务。这种“幸福”的计算机的学习和使用过程,你完全不应该觉得困难——请注意,如果和上个世纪七十年代的计算机使用者比起来,真的好太多了。

老式的计算机,使用纸带进行输入输出,效率极其低下。
老式的计算机,使用纸带进行输入输出,效率极其低下。

上世纪70年代末期,计算机的出现虽然带来了各种方便,但也带来了各种不方便。首先就是编程。当时没有类似今天这样的高级的、接近自然语言的、各种逻辑都非常完善的编程语言,而是采用底层的机器语言来写命令。

机器语言和后来的汇编语言,在使用中都显得很麻烦,可读性差,并且很难维护。此外,还有重要的一点是,这些语言都比较“笨”,如果要计算一些稍微复杂的操作比如乘法、除法、三角函数、微积分、方程等,每次计算都需要重新编写程序(在纸带上打孔输入数据的时代,是没有“粘贴+复制”的方便功能的)。

于是人们想了一个方法,对一些比较常用的指令,比如积分、微分、乘除法等,干脆写一套标准的程序,留下输入数据的接口。这样就能够大幅度地降低编程中的难度,提高编程效率并增加其易用性。这个想法一提出,就得到了很多业内人士的认可,大家给这种想法取了一个名字,叫做“指令集”。

指令集中包含了大量的基础运算的内容,并且以公式化和模块化的方式供人们使用。对软件来说,指令集的出现无疑大幅度提高了程序编写的效率。同时由于模块化指令的存在,软件的运行效率也得到了提升。对硬件来说,专用模块的效率永远高于通用模块,因此指令集的出现也为CPU硬件性能的提升开启了一扇新的大门。

复杂的还是精简的?

指令集诞生后,CPU厂商都开始整理、规范这些指令集,其中就包括英特尔。英特尔在它为成功的一款处理器8086中,开始加入大量指令集,以提高计算效率、增强CPU性能。与此同时,另外一种思想在悄悄萌芽。

英特尔为了兼容8086处理器,不得不一直采用x86 CISC指令集。
英特尔为了兼容8086处理器,不得不一直采用x86 CISC指令集。

业界有一个著名的“8020定理”,可以应用在很多方面:比如一家公司80%的人都会是普通职员,20%的人才可能成为领导者;这些领导者每天做的事情80%是不紧急或者不重要的、20%才是紧急重要的内容等等。“8020定理”概括了社会发展的大部分内容,虽然不那么精确,但足以说明大部分内容往往没有什么效率,值得关心的往往是那20%的核心部分—比如下面这一段:

CPU的指令集是各种功能的集合。指令集诞生的原因是人们渴望在软件编写时更有效率,同时也符合事物发展中规范化、模块化的需求。但是,在所有指令集中,经过人们分析和统计,只有20%的指令集会在80%的场合都用到,而绝大部分80%的指令集只有20%的场合需要出现。

RISC处理器的效率很高,一般来说能耗比很出色,但是指令比较复杂,特别是程序体积较大。图为IBM的Power 7处理器的接口,是经典的高性能RISC处理器。
RISC处理器的效率很高,一般来说能耗比很出色,但是指令比较复杂,特别是程序体积较大。图为IBM的Power 7处理器的接口,是经典的高性能RISC处理器。

这里的意思就很明确了。如果一个CPU支持所有的指令集,那么其中20%的部分会被经常调用,而80%的部分经常闲置无所事事,至少在80%的时间中都是如此。在CPU晶体管“寸土寸金”的年代,这样的做法是对晶体管的严重浪费。在这种情况下,曾任斯坦福大学校长、美国科学院、工程学院和文理学院三院院士的约翰·亨尼西教授和加州大学伯克利分校的计算机教授戴维·帕特森等人,就提出了一种更为简单的指令集,叫做精简指令集,全称是Reduced Instruction Set Computing,简写为RISC。而传统的大而全的指令集也被赋予了一个正式的名字,叫做Complex Instruction Set Computing,也就是CISC。

RISC的优势在于将指令数目和寻址方式都做出了改进,大幅度降低了设计难度,编译器的效率更高并且指令的并行执行程度更高。同时RISC制造的CPU体积更小、能耗更低、性能功耗比更高。但是RISC并不是没有缺点,比如RISC的CPU对20%的常用指令集的计算效率更高,而对一些不常用或者复杂的指令,则以几个常用指令组合的方式来完成,计算效率就明显下降。对软件来说,RISC的程序体积相对CISC会大一些,复杂度稍高。并且由于指令集精简,早期的RISC处理器的性能显然不如同期的CISC,虽然它更小、功耗更低。

今天的CPU:x86和ARM

虽然从原理来看,RISC和CISC可谓井水不犯河水。但RISC和CISC在发展过程中,彼此反而取长补短,各有所得。

对CISC来说,指令集本身随着计算要求不断发展,肯定会越来越多。CISC继续发展下去,其实际CPU产品的晶体管数量会难以抑制地上升,性能功耗比和成本表现很难让人满意。从设计角度来看,CISC指令集长度不固定、执行时间也不固定、设计困难很多,很难找出一条高效率的通用设计道路来完成指令的执行。此外,由于CISC处理器和存储器之间的速度差距,缓存变得越来越重要。这也意味着CPU本身需要更为精简高效,节省的空间需要用于容纳越来越重要的各级缓存。

为了解决这些问题,现代的CISC处理器开始认真学习RISC的思想。CISC的问题在于指令集复杂多变,为每一个指令制定专门的硬件优化显然不可能。那么,可不可以换一个思路呢?将那些常使用的指令集挑选出来,然后为其进行专门优化,就可以大大提高效率;至于不常用的指令,则可以用几个基础指令组合的方式完成——这正是RISC的思想。有所不同的是,RISC让思想完成在指令层面,而CISC将这个思想实现在硬件层面。

英特尔的Nehalem处理器可谓借鉴RISC思想而设计的x86。
英特尔的Nehalem处理器可谓借鉴RISC思想而设计的x86。

以英特尔的Nehalem或者AMD的K10处理器为例。首先,这些x86处理器内部都会使用“微指令”。所谓微指令,就是一些基础的指令,CISC指令中大部分都可以被拆分为几条简单而固定的微指令。其次,CPU内部设计了“翻译单元”,一般是由解码单元来执行的。在运行中,CPU接受一条x86指令,然后解码单元将接收到的比较复杂的X86指令拆解为一个或几个微指令。比如Nehalem设计了3个简单的解码单元和1个复杂的解码单元,可以将x86指令解码拆分、“翻译”为1~4条微指令。

第三,CPU内部针对这些微指令会做出充足的优化,让其执行效率和速度都达到令人满意的程度。当然,在解码处理的过程中,不是所有的x86指令都会得到平均对待。那些常用的指令比如mov、push、call、cmp、add等会被重点、优先、加速处理,不常用的指令要么被拆分为常用指令,要么进入普通循环进行处理。效率虽然有影响,但考虑到其使用几率很低,因此这样的设计完全可以接受。在微指令解码和处理过程中,如何更有效率、更为高效地执行x86命令;微指令应该如何表达、运行;微指令和x86指令的关系以及哪些微指令是常用、优先的指令,成为影响CPU性能的核心内容。

未来的ARM Cortex A-50是高性能处理器的代表产品
未来的ARM Cortex A-50是高性能处理器的代表产品。

在采用了RISC思想、对x86处理器的设计进行革新后,如今的CISC处理器基本上可以解决CISC指令复杂、体积庞大,晶体管耗费多等问题。对厂商来说,一个设计优秀的x86处理器的解码和流水线核心可以维持数代发展而不落伍。厂商可以在发展过程中不断对已经设计好的核心进行调整和调配,在缓存、总线配置上进行更改以获取更好的性能。

CISC借鉴RISC的思想,让自己获得了新生。相对来说,RISC对CISC也有借鉴,但不算太多。RISC指令简单并且相对固定,处理快速,在设计上甚至可以使用更长的流水线来达到高频率,并终获得更优秀的效能。但RISC的主要问题在于指令集简单,因此在处理一些比较复杂的应用时,存储器需要读入的指令总数耗费时间更多,部分场合下性能表现不理想也是RISC的硬伤。因此,在RISC的发展中,RISC也在逐渐注入CISC的思想。比如紧跟时代加入一些新的指令集,更进一步优化内部架构,运行周期变成不固定周期等。RISC发展到现在,指令也逐渐增多,浮点计算等重要性能也日益强大。以ARM为例,不但逐渐增强浮点计算性能、新增专门的浮点指令,还计划在现有的基础上开展高性能ARM处理器的发展,以增强未来应对市场变化特别是对x86处理器竞争的能力。

未来的处理器,功耗更低,效能更高

从目前CPU的发展来看,无论是ARM还是x86,无论是CISC还是RISC,除了努力巩固自己的性能优势,加强产品的性能外,还积极吸取对方产品的特色,取长补短,期望有所突破。不过无论如何,未来的CPU肯定在朝着高性能、低功耗的方向发展。目前移动计算大潮已经来临,竞争日趋激烈。但说到底就是性能功耗比的竞争,谁能在低功耗下提供高性能,谁就有希望获得成功。未来的处理器,功耗将更低,效能会更高。

分享到:

用户评论

用户名:

密码: