自第一台RISC机器诞生后20余载,一些有利于计算机设计,指出了当前硬件技术状态的原则逐渐被接受。如果技术上发生了重大变革(比如,一种可以量产的处理器比当前CPU执行内存循环的速度快10倍),一切都要推倒重来。因此计算机的设计者应该时刻关注技术变化,它们有时会影响计算机各个组成部分之间的平衡。
尽管如此,新一代多功能CPU的设计者会尽力遵循某些设计原则,它们有时被称作RISC设计原则。虽然对某些外部限制,比如向后兼容一些已存在的体系结构,需要不时地做出妥协,但遵循这些原则是大多数设计者努力的目标。下面我们从这些原则中挑一些重要的讨论。
所有的指令都由硬件直接执行
所有的通用指令都由硬件直接执行。他们不会被解释成微指令。少一层解释给大多数指令提供了更快的速度。对实现CISC指令集的计算机来说,额外的(除了通用指令之外的指令)复杂指令会被分解,然后作为一系列微指令执行。这个额外步骤降低了机器的执行速度,但是对那些不太频繁执行的指令,还是可以接受的。
最大化输出指令的比例
现代计算机采取了很多小技巧来最大化性能,首先是尝试最大化每秒开始指令的数量。归根结底,如果你能每秒输出5亿条指令,你就构建了一个500-MIPS的处理器,无论完成这些指令需要花费多少时间。(MIPS表示每秒百万条指令。MIPS这个缩略词有两种解释。)本条原则指出,并行在性能提升上扮演重要角色,因为在短时间内输出大量缓慢的指令是完全可能的,只要能同时执行多条指令。
虽然指令总是按照程序的顺序执行,但它们不总是按照程序的顺序输出(因为执行时需要的某些资源可能被占用)并且决不能按照程序的顺序完成。当然,如果指令一设置了一个寄存器并且指令二使用了该寄存器,务必确保指令二在寄存器保存了正确的值之后才读出数据。虽然把这个弄对了需要做许多记录,但是同时执行多条执行确实增加了处理器的性能潜力。
指令应该很容易解码
在指令流输出时有一个极其重要的限制,就是各自解码来获取它们需要的资源。可以优化这个过程的任何措施都有价值。包括指令的规则化,固定其长度,使用少量的字段。指令之间的格式差异越小越好。
只有读取和存储涉及到内存
拆分指令最简单的办法就是规定:大多数指令的操作数来自并返回给CPU寄存器。在分解指令时会用到把操作数从内存移动到寄存器的操作。由于连接内存会花费大量时间,产生的延迟也难以预料,如果某些指令除了在内存和寄存器之间移动操作数之外什么也不做,最好把它们和其他指令合并(?)。上述观察意味着只有LOAD和STORE指令可以引用内存。其他所有指令最好只操作寄存器。
提供大量寄存器
因为连接内存的操作相对耗时,最好提供多一点的寄存器(最少32个),所以一旦取到一个字,在它被遗弃之前都可以放在寄存器里。如若寄存器耗尽,则不得不把它们保存的数据写回到内存里,迟些再重新读取,应当尽可能避免这种惹人厌烦的情况发生。最好的办法就是提供足够多的寄存器。