CISC 和 RISC

计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。比如:日常生活中,“去吃饭”这样的命令可以看作是简单的指令。根据我的观察,男人和女人在指令集上是存在差别的。男人理解的指令集通常只是女人指令集的子集。譬如说,女人对于“洗衣服”指令的理解是包括“将衣物放入洗衣机启动洗涤”,“洗衣完成后晾衣服”以及“晾干后收起来”;但是对于男人来说“洗衣服”指令只是 “将衣物放入洗衣机启动洗涤” 的含义。

指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效的工具之一。从现阶段的主流体系结构讲,指令集可分为CISC和RISC两种。

CISC是“复杂指令集计算机”的缩写:Complex Instruction Set Computer。我们日常使用的 X86 就是 CISC 的典型代表。

计算机处理器包含有实现各种功能的指令或微指令,指令集越丰富,为微处理器编写程序就越容易,但是丰富的微指令集会影响其性能。复杂指令集计算机(CISC)体系结构的设计策略是使用大量的指令,包括复杂指令。与其他设计相比,在CISC中进行程序设计要比在其他设计中容易,因为每一项简单或复杂的任务都有一条对应的指令。程序设计者不需要写一大堆指令去完成一项复杂的任务。 但指令集的复杂性使得CPU和控制单元的电路非常复杂。[1]

RISC是“精简指令集计算机”的缩写:Reduced Instruction Set Computing RISC)。RISC的指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。RISC结构采用精简的,长短划一的指令集,使大多数的操作获得了尽可能高的效率。某些在传统结构中要用多周期指令实现的操作,在RISC结构中,通过机器语言编程,就代之以多条单周期指令了。【参考1】

接下来用一个例子来说明二者的区别。

假设我们有一个这样的计算机:内存是一个 6x4 的数组, 有A-F 6个寄存器。

对于 CISC 来说,如果想完成内存中2个数值的相乘的操作,可以直接使用下面的指令:

MULT 2:3,5:2

这里的 MULT 就是一个“复杂指令”。 进一步,如果设定变量 x 为内存 2:3 中的值。 y 为内存 5:2 的值,上面的指令就可以理解为C语言的 x=x*y。

如果用 RISC 来完成,那么需要写成如下的指令:

LOAD A, 2:3
LOAD B, 5:2
PROD A, B
STORE 2:3, A

从这个结果上来看,RISC 效率更低,因为需要执行更多的代码,使用更多的内存。但是实际上 RISC 的指令通常只需要1个机器周期来完成,所以整体上消耗时间和CISC 的 MULT 指令相同,另外因为 RISC 机器码指令长度相同,执行时只需要一个机器周期所以更适合流水线方式执行(我的理解是方便硬件预读取和判断)。【参考2】

虽然 Intel X86 CPU 是 CISC 的典型代表,但是它的内部也存在RISC 的设计概念。所有的操作都会被分解为微指令再执行。微指令是典型的 CISC 的指令。

微指令(英语:microcode,μop),还有翻译为微码或者微操作,为了避免歧义,后面全部使用 μop,是在CISC结构下,运行一些功能复杂的指令时,所分解一系列相对简单的指令。相关的概念最早在1947年开始出现。
微指令的作用是将机器指令与相关的电路实现分离,这样一来机器指令可以更自由的进行设计与修改,而不用考虑到实际的电路架构。与其他方式比较起来,使用微指令架构可以在降低电路复杂度的同时,建构出复杂的多步骤机器指令。撰写微指令一般称为微程序设计(microprogramming),而特定架构下的处理器实做中微指令有时会称为微程序(microprogram)。


现代的微指令通常由CPU工程师在设计阶段编写,并且存储在只读内存(ROM, read-only-memory)或可编程逻辑数组(PLA, programmable logic array)中。然而有些机器会将微指令存储在静态随机存取内存(SRAM)或是闪存(flash memory)中。它通常对普通程序员甚至是汇编语言程序员来说是不可见的,也是无法修改的。与机器指令不同的是,机器指令必须在一系列不同的处理器之间维持兼容性,而微指令只设计成在特定的电路架构下运行,成为特定处理器设计的一部分。【参考3】

参考:
1.https://baike.baidu.com/item/%E7%B2%BE%E7%AE%80%E6%8C%87%E4%BB%A4%E9%9B%86%E8%AE%A1%E7%AE%97%E6%9C%BA/661859?fromtitle=risc&fromid=62696#viewPageContent

2.https://cs.stanford.edu/people/eroberts/courses/soco/projects/risc/risccisc/

3.https://baike.baidu.com/item/%E5%BE%AE%E7%A0%81/10708310?fr=aladdin

3.http://www.enroo.com/support/category1/dpjrmzs/78378500.html 什么是RISC架构?RISC架构的优点与缺点

4.http://www.enroo.com/support/category1/dpjrmzs/38700314.html 什么是CISC体系结构?CISC架构的优点与缺点

5.https://teachcomputerscience.com/risc-and-cisc-processors/ RISC and CISC Processors

6.https://www.zhihu.com/question/404743266/answer/1321179351 这里还有一个 X86 为什么选择 CISC 的历史。

CISC诞生的原因也很简单,第一,当时的主流看法是设计硬件比设计编译器简单;第二,而且当时的内存很贵,以8086开始设计的1976年来看,当时4KB内存需要159美元,8KB内存需要250美元;第三,当时的内存速度很慢,而寄存器价格上天,8086只有约20000个晶体管,而寄存器为了存储16bit数据就花费了至少256个晶体管。

8086的祖宗8008只有3500个晶体管,配合0.5Mhz的时钟频率,连寄存器-寄存器的复制都需要20us,更别说当时的内存速度了。

8008时期的DRAM每字节高达2.52美元,实现一个完整的系统就需要几千字节,基于各种原因,微架构工程师只能让处理器在使用同样的资源下尽可能的多干一些活,让一个指令干完全部工作,在RISC出来之后这种方式就被叫做复杂指令集了(CISC)

在70年代后期,随着编译器的普及和汇编的减少,正交寻址几乎被程序员忽略,虽然当时的编译器不能完全利用CISC处理器的优势,但是显然历史的车轮是不会停下的,于是乎正交寻址变得更加没用了。

实际上随着集成电路的发展,一些复杂指令集相比一系列简单的指令集更慢,因为芯片越来越复杂,但是设计者显然没有时间针对几百条指令的每一条都进行优化。几乎就在同时,得益于半导体工艺的进步,微处理器的运行速度变得比内存更快,而且可以预见的是在未来这个差距会变得越来越大,因此就需要腾出空间去安排更多的寄存器和缓存。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注