最直观的方式来比较CISC与RISC的异同,就是用一个实际的例子来说明,比如把内存里面的两个数字相乘。
这幅图展示的是一台普通的计算机的原理图,它包含以下几个部分:
- 一个6x4的主存储器
- 六个寄存器
- 执行单元
其中,执行单元可以进行各种基本运算,但只能对已经装载到寄存器的数据进行运算。现在假设要计算两个数的乘积,这两个数分别存放在主存储器的2:3和5:2,结果放回到2:3的位置。
CISC方式
CISC体系的主要目标是用尽可能少的汇编指令完成一项任务,这是通过设计一个能够解释并执行一系列操作的硬件电路来实现的。以这个计算乘积的任务为例,CISC架构的处理器会实现一条特定的乘法指令(比如说MULT)来完成它。当执行这条指令的时候,它会分别主动加载这两个操作数到两个不同的寄存器,然后在执行单元里面进行运算,最后把结果对应的位置。因此,整个任务可以用下面这条指令去完成。
MULT 2:3, 5:2
MULT就是所谓的复杂指令,它可以直接在系统的主存上进行运算,而不用通过显式的方式先把主存的操作数加载到寄存器里面。它实现了一个稍微高级一点的语言。如果我们用“a”表示2:3,“b”表示5:2,那么上述指令就相当于C语言的“a = a * b”。
CISC架构的主要优点是编译器把高级语言转换为汇编的时候不需要做太多的工作;其次,由于代码量比较少,占用的RAM就相对少很多。这是以增加硬件的复杂度为代价的。
RISC方式
RISC体系的处理器只用可以在一个时钟周期内完成的简单指令。因此,上述的“MULT”指令可以拆分为三条独立的指令:
- LOAD:把操作数从主存加载到寄存器
- PROD:计算寄存器里面的操作数的乘积
- STORE:把寄存器里面的计算结果存进主存
而要完成CISC的指令“MULT 2:3, 5:2”一样的功能,程序员就需要写4条汇编指令。
LOAD A, 2:3
LOAD B, 5:2
PROD A, B
STORE 2:3, A
咋一看,这好像是一种效率差得多的实现方式。因为这种方式需要更多的代码,更多的RAM去存储指令,编译器也需要做更多的工作才能把同样的高级语言转化为对应的汇编。然而,RISC体系采用的策略也取得了一些很重要的优势。因为一条指令只需一个时钟周期,执行这几条指令所花费的时间跟执行一条MULT指令所需的时间基本是一样的。这些“精简”的指令比“复杂”指令占用更少的硬件晶体管,进而为通用寄存器留出更多的空间。而且,因为每条指令的执行时间都一样,这有利于利用流水线技术。
性能公式
这是用来计算计算机性能的一般公式:
CISC方式试图最小化程序的指令数量,而牺牲了执行指令的时钟周期数(即以时间换空间);RISC方式则刚好相反,增加程序的指令数量换得减少单条指令占用的时钟周期数(即以空间换时间)。