第 3 章

伯克利的纸与硅

把时钟拨回将近十年。一份研究生课程大纲静静地躺在加州大学伯克利分校计算机科学系的档案柜里。课程编号CS 292R,标题措辞克制,但课程目标在当时的微处理器产业语境中近乎宣战:学生将从指令集定义出发,完成一款微处理器的完整架构设计,并在学期结束时提交可用于流片的版图数据。授课教师大卫·帕特森时年三十六岁,1976年从加州大学洛杉矶分校获得博士学位后加入伯克利,论文方向是微程序控制器的形式化验证——正是那种被当时所有主流处理器设计所依赖的技术。这门课程并非讲授既有知识。帕特森在第一堂课上对学生提出的要求是:质疑过去十五年里微处理器产业形成的每一项设计惯例。帕特森对主流设计方法论的怀疑并非始于伯克利。他在1970年代末参与了多个处理器设计评估项目,逐渐积累起一套系统的观察。

到1979年,当他开始逐条分析Intel 8086、Motorola 68000和DEC VAX-11的指令集时,一个清晰的模式浮现出来:每一代新处理器的指令集都比上一代更复杂,微码控制单元的规模以指数级增长,但实际应用程序中使用频率最高的指令始终集中在极小的子集内。这个观察并非帕特森独有。IBM托马斯·沃森研究中心在1975年至1979年间秘密进行的801项目,在约翰·科克的领导下已经得出了类似结论——IBM团队为一台从未公开发布的计算机设计了极度简化的指令集,原型测试获得了惊人的性能数据。但801项目的成果长期被封锁在IBM内部,直到1980年代中期才被允许有限披露。当帕特森在1979年通过非正式渠道得知IBM的工作时,他意识到精简指令集的设计思想已经有了一家顶级计算机公司的实验验证,但学术界和更广泛的产业界对此几乎一无所知。CS 292R课程的设置,正是为了在这个真空中建立一个可公开获取的知识体系。

课程的技术起点是一组用高级语言编写的基准程序,包括编译器、文本编辑器和科学计算子程序。学生们首先要用模拟器统计这些程序在运行时的指令使用频率、寻址模式分布和过程调用深度。统计结果呈现出一种系统性的不对称:在一台典型的VAX-11计算机上,超过百分之八十的执行时间消耗在不足百分之二十的指令类型上;复杂的寻址模式和字符串操作指令的使用频率低于百分之一;过程调用和返回的深度绝大多数不超过六层。这些数据指向的结论在当时的产业共识看来是异端——微处理器产业在过去十年里投入大量晶体管预算和设计资源去实现的复杂指令,实际上极少被使用。更严重的是,这些复杂功能的存在拖慢了那些高频使用的简单指令:微码解释器需要额外的时钟周期来译码,复杂的寻址模式计算占用了算术逻辑单元的时间,庞大的微码控制存储器挤占了本可用于寄存器堆的芯片面积。

帕特森将这种主流设计哲学命名为“复杂指令集计算机”——Complex Instruction Set Computer,缩写为CISC。这个术语本身就是一个论战姿态。在1980年,VAX-11/780被公认为小型机设计的巅峰之作,其指令集包含超过三百条指令和十几种寻址模式。Intel的8086虽然受限于十六位架构和晶体管预算,但其指令集设计同样遵循功能越多越好的原则,包含了字符串操作、十进制算术和复杂的地址计算指令。Motorola 68000的架构师在设计时仔细研究了IBM大型机的指令集,试图在微处理器上复制大型机的功能丰富度。CISC不是某一家公司的错误,而是整个产业的共识。帕特森的命名将这种共识置于必须为其合理性提供证据的位置上——不是来自历史惯性或程序员直觉的证据,而是来自实际程序行为测量的证据。CS 292R课程收集的数据表明,CISC的合理性证据链条存在严重断裂。1981年春季学期,课程进入设计阶段。

帕特森将团队分为两组。第一组负责指令集定义:根据基准程序的统计特征,确定处理器必须直接支持的指令类型和寻址模式。第二组负责微架构设计:在给定的晶体管预算和工艺约束下,将指令集映射为数据通路、控制逻辑和寄存器堆。指令集定义组的工作方式与当时的产业惯例截然不同。他们没有从汇编语言程序员的需求清单出发,而是从编译器的输出模式出发。他们分析C语言和Pascal编译器生成的中间代码,识别出最频繁出现的操作序列:寄存器间算术运算、加载和存储、条件分支、过程调用和返回。对于每一种操作,他们追问的不是增加这条指令能提供什么便利,而是不增加这条指令会带来多大的性能损失。只有那些不加入会导致显著性能损失的指令,才有资格进入指令集。这个筛选过程产生了一份极短的指令清单。最终定义的指令集包含三十一条指令,全部为三十二位定长编码,只有四种指令格式。所有算术逻辑操作仅在寄存器间进行,内存访问通过独立的加载和存储指令完成——这种设计后来被称为加载-存储架构。

过程调用不使用微码实现的复杂帧管理指令,而是通过寄存器窗口机制:芯片上设置了一组重叠的寄存器窗口,每次过程调用只切换当前可见的寄存器子集,无需将寄存器内容保存到内存栈中。寄存器窗口的设计是伯克利RISC项目最具原创性的贡献之一。帕特森和学生们在研究基准程序的过程调用行为时发现,绝大多数过程的参数传递和局部变量使用只涉及少数几个值,过程调用链的深度也很少超过一定限度。如果将芯片上宝贵的寄存器资源组织为重叠窗口,每次调用只分配一个新的窗口,那么大多数过程调用可以完全避免内存访问。当窗口用尽时,最旧的窗口内容才会被溢出到内存。这个机制将过程调用的开销从几十个时钟周期压缩到一两个周期,而过程调用正是高级语言程序中最频繁的操作之一。微架构设计组面临的约束同样严苛。帕特森设定的设计规则基于当时可用的NMOS工艺,晶体管预算约为四万个——与同期复杂处理器动辄十万晶体管以上的规模相比,这个数字显得极为拮据。

但正是在这种约束下,精简指令集的优势开始显现。由于指令格式规整、寻址模式简单,整个控制逻辑可以用硬连线实现,完全抛弃了微码解释器和控制存储器。这释放了大量芯片面积,使得设计团队可以容纳两组寄存器窗口——每组包含八个输入寄存器、八个局部寄存器和八个输出寄存器,总共一百三十八个寄存器——以及一个可以在单周期内完成所有算术逻辑操作的执行单元。流水线设计是另一个从精简指令集中获益的结构。在CISC处理器中,指令长度可变、执行时间可变、寻址模式计算复杂,这些因素使得流水线各阶段的划分极为困难。伯克利团队发现,定长指令、加载-存储架构和简单的寻址模式使得流水线可以自然地划分为取指、译码、执行和写回四个阶段,每个阶段在一个时钟周期内完成。没有指令需要额外的微码周期,没有寻址模式计算会阻塞流水线。在理想情况下,每个时钟周期可以完成一条指令。1981年夏天,两组的设计成果合并为完整的RISC-I架构规格。

帕特森做出了一个在学术界极为罕见的决定:将设计提交给美国国防高级研究计划局(DARPA)的VLSI研究项目,申请实际的芯片制造。DARPA当时正在资助一批大学进行超大规模集成电路设计研究,伯克利、斯坦福、麻省理工和加州理工等学校都在其资助名单上。帕特森的申请获得了批准,RISC-I获得了在MOSIS多项目晶圆上进行流片的机会。MOSIS是由DARPA资助的芯片制造服务,它将多个大学研究项目的设计拼合在同一套掩模版上,分摊光刻和制造成本。对于大学研究者而言,MOSIS使得芯片设计不再停留在纸面和模拟阶段,可以制造出真实的硅器件进行测试。1981年的MOSIS工艺采用四微米NMOS,芯片面积上限约为六毫米乘七毫米。在这个面积内,伯克利团队必须放下完整的三十二位处理器——包括寄存器堆、算术逻辑单元、控制逻辑和总线接口。版图设计由研究生们手工完成。

当时现代电子设计自动化工具尚不存在,他们用彩色铅笔在方格纸上绘制晶体管级布局,然后通过数字化仪输入计算机。整个过程耗时数月,其间经历了多次迭代。寄存器窗口的版图占据了芯片面积的近三分之一,这是设计中最密集的部分。控制逻辑的面积出乎意料地小,因为硬连线控制器的结构规整,不需要微码存储器的庞大阵列。1982年初,第一批RISC-I芯片从MOSIS生产线返回伯克利。测试结果超出了团队最乐观的预期。在四微米NMOS工艺下,RISC-I的时钟频率达到一点五兆赫兹——这个数字本身并不惊人,同期Intel 8086已经达到五至八兆赫兹。但性能的比较不能只看时钟频率。在使用相同基准程序进行测试时,RISC-I执行每个程序所需的时钟周期数远少于8086和68000。定长指令和规整流水线使得指令吞吐率接近每周期一条指令,而复杂处理器在执行相同程序时需要频繁进入微码序列,实际指令吞吐率远低于其时钟频率所暗示的水平。

帕特森的团队将测试结果整理为一篇论文,提交给1982年的国际计算机架构研讨会(ISCA)。论文标题直截了当:《RISC-I:一个精简指令集VLSI计算机》。这篇论文在会议上引发了激烈争论。来自DEC、Intel和Motorola的工程师质疑测试方法的公平性,指出RISC-I的基准程序选择可能存在偏差,其有限的指令集无法处理真实商业软件所需的全部功能。来自大学的研究者则对寄存器窗口机制的硬件成本提出了疑问:一百三十八个寄存器占用了大量晶体管,这些晶体管如果用于更复杂的指令执行单元,是否可能带来更大的性能提升。帕特森在会议现场逐条回应了这些质疑。关于基准程序偏差,他展示了详细的指令使用统计,证明所选择的基准程序覆盖了科学计算、系统编程和商业数据处理等多个领域,其指令使用分布与更大规模的程序采样一致。

关于寄存器窗口的成本,他比较了RISC-I的芯片面积与同期复杂处理器的面积:RISC-I使用了约四万四千个晶体管,而Motorola 68000使用了约六万八千个晶体管,Intel 8086约两万九千个。在可比的工艺和面积下,寄存器窗口的成本并不比微码控制存储器更高,而性能收益则远超后者。但帕特森承认了一个更根本的质疑:RISC-I的软件生态几乎为零。在1982年,所有主流操作系统、编译器和应用程序都是为CISC指令集编写的。即使RISC-I在硬件效率上具有显著优势,没有软件支持的处理器在商业上毫无意义。帕特森的回答展示了学术研究与产业开发的根本差异:伯克利RISC项目的目标不是推出一款商业产品,而是证明一套设计原则的有效性。如果这些原则在学术界被接受,它们最终会通过教育和出版渗透到产业界。正是这个回答,揭示了伯克利RISC与Acorn ARM在本质上的不同。

当帕特森在1982年ISCA会议上阐述他的学术立场时,Acorn的工程师们正在剑桥的实验室里为另一个问题挣扎:他们需要一款能够驱动下一代桌面计算机的处理器,而市场上的现有产品都无法同时满足性能、功耗和成本的要求。Acorn的RISC转向是生存驱动的,它必须产生一款可以立即投入商业产品的芯片。伯克利的RISC转向是范式驱动的,它必须产生一套可以被验证、被教学、被复现的设计方法论。这两种动机导致了不同的技术选择。RISC-I使用了寄存器窗口——一个聪明但消耗大量晶体管的机制——因为它在学术上证明了编译器与架构协同设计的价值。ARM1没有使用寄存器窗口,因为弗伯和威尔逊的晶体管预算只有两万五千个,他们必须将每一颗晶体管用在刀刃上。RISC-I的指令集包含三十一条指令,ARM1的指令集更少。

RISC-I的定长三十二位指令格式被ARM1继承,但ARM1加入了条件执行这一在RISC-I中不存在的特性——这不是学术设计原则推导的结果,而是威尔逊在编写ARM操作系统时发现的实际需求:如果每条指令都可以条件执行,大量分支指令可以被消除,代码密度和流水线效率都能提升。1983年,伯克利团队完成了RISC-II的设计。这是对RISC-I的全面改进:晶体管数量增加到约四万一千个,寄存器窗口从两组增加到八组,增加了整数乘除法指令,优化了流水线控制逻辑。在相同工艺下,RISC-II的性能比RISC-I提升了约百分之五十,在某些基准测试中甚至超过了VAX-11/780——一台价格是RISC-II制造成本数百倍的小型机。这个结果在1983年的国际固态电路会议(ISSCC)上公布时,引起了更大的震动。但真正让伯克利RISC项目产生持久影响的,不是这些性能数据,而是帕特森团队在1983年至1985年间发表的一系列论文和技术报告。

这些文献构成了精简指令集设计的第一套完整教材:《RISC-I指令集手册》详细记录了指令选择的量化方法和每条指令的编码格式;《RISC-II微架构描述》逐级拆解了流水线的时序和控制信号;《RISC编译器的寄存器分配策略》讨论了编译器如何利用寄存器窗口生成高效代码;《RISC与CISC的性能比较:方法论与结果》建立了处理器性能分析的基准测试框架。这些文献的语言是精确的、可操作的。它们不依赖直觉或经验法则,而是给出了具体的公式、数据和设计决策的权衡过程。一个受过计算机架构训练的研究生,仅凭这些公开文献就可以设计出自己的精简指令集处理器——这正是帕特森的教学目标。到1985年,全美已有超过二十所大学在研究生课程中使用了伯克利RISC的论文作为教材。斯坦福大学的约翰·亨尼西领导的MIPS项目是伯克利之外最重要的学术RISC研究,亨尼西本人在1984年出版的论文中明确承认了伯克利工作的奠基性。

当ARM1芯片在1985年4月从VLSI Technology的生产线返回剑桥时,伯克利RISC项目已经完成了它的学术使命。帕特森的论文被弗伯和威尔逊仔细研读过。ARM1的加载-存储架构、定长指令格式、硬连线控制逻辑和单周期执行,这些设计特征与伯克利RISC的原则高度一致。但ARM1的设计并非伯克利原则的简单复制。弗伯和威尔逊在晶体管级实现上做出了大量原创贡献:ARM1的桶形移位器可以在每个数据操作指令中同时完成移位和算术运算,这个特性在RISC-I和RISC-II中都不存在;ARM1的程序计数器被映射为通用寄存器之一,使得子程序返回和分支目标计算可以用统一的寄存器操作指令完成;ARM1的中断响应机制经过精心设计,可以在任何指令边界快速切换上下文,而不需要复杂的微码序列。这些差异指向一个更深层的互补关系。

伯克利RISC提供了精简指令集的理论基础和经验证据,证明了简化指令集在流水线效率、芯片面积利用和设计复杂度方面具有可测量的优势。Acorn ARM提供了精简指令集在极端资源约束下的工程实现,证明了即使只有两万五千个晶体管,一台完整的三十二位处理器也可以被设计、制造并正常运行。伯克利的工作回答了为什么应该这样做,Acorn的工作回答了怎样在现实中这样做。1985年的产业格局中,这两种证明都没有转化为商业成功。RISC-I和RISC-II始终是研究原型,从未成为产品。ARM1被用于Acorn的Archimedes桌面计算机的开发平台,但这款计算机要到1987年才会正式发布。在1985年10月Intel发布80386处理器的同一个月,ARM1的存在对微处理器市场的影响为零。x86架构的生态优势——数以千计的软件应用、成熟的开发工具链、多家芯片供应商的竞争性货源——使得任何新指令集架构的商业进入成本高得令人望而却步。

但伯克利RISC项目播下的种子正在土壤下生长。1982年至1985年间修读CS 292R课程的研究生中,许多人毕业后进入了Sun Microsystems、MIPS Computer Systems、惠普和IBM的处理器设计团队。他们带走的不是对某一家公司产品的忠诚,而是一套分析处理器架构的方法论:用基准程序测量实际行为,用量化数据指导设计决策,用流水线效率而非时钟频率作为性能的主要判据。当Sun在1985年启动SPARC架构设计时,其核心团队中有多位伯克利毕业生,SPARC的指令集与RISC-II的血缘关系清晰可见。当MIPS在1985年推出R2000处理器时,亨尼西在伯克利原则基础上发展出的MIPS架构同样遵循加载-存储设计和定长指令格式。1986年,帕特森与亨尼西合作撰写的教科书《计算机架构:量化方法》第一版出版。

这本书将伯克利RISC项目的设计原则系统化为计算机架构学科的核心范式:处理器的性能由指令数、每指令周期数和时钟周期时间的乘积决定,架构师的职责是优化这个乘积,而不是追求指令集的丰富性或微架构的复杂度。这本教科书在随后的二十年里成为全球计算机工程教育的标准教材,其影响范围远远超出了任何一款商业处理器。当Acorn的工程师在剑桥为生存而设计ARM1时,他们并不知道伯克利的工作会以这种方式改变计算机架构的教育和人才供给。弗伯和威尔逊面对的是一张白纸和两万五千个晶体管的约束,他们的设计决策来自工程本能和紧迫的时间压力。但他们的设计结果——一款用极简方式实现完整三十二位计算能力的处理器——恰好成为了伯克利原则在商业约束下的第一个物理样本。这个样本在1985年没有市场,但它证明了精简指令集不仅可以在大学实验室里运行,也可以被一家小型公司的工程团队在几个月内完成设计。这个证明的价值,要等到1990年代初移动通信和嵌入式系统市场兴起时才会兑现。

但在1985年,它已经产生了一个更直接的效果:它让帕特森的学术论证获得了一个来自产业界的验证案例。当帕特森在1986年的学术会议上被问及精简指令集是否只是一种学术好奇心时,他可以指出大西洋彼岸那家小型英国公司的芯片——不是作为商业成功的证据,而是作为工程可行性的证据。ARM1的存在证明,精简指令集处理器不仅可以在大学实验室里用DARPA资助的MOSIS工艺制造,也可以用一家半导体代工厂的标准工艺制造,并且与同期复杂处理器一样可靠地运行。这就是伯克利与剑桥之间奇特的共振。前者提供了合法性论证,后者提供了可行性样本。两者在1985年前后形成了一种跨越学术与产业边界的相互强化,这种强化在当时几乎不被市场察觉,但它在微处理器产业的知识基础中嵌入了一个新的选项。

伯克利的论文和Acorn的硅片共同回答了一个问题,这个问题在1985年没有人问,但十年后将成为整个产业的核心:当晶体管预算不再充裕,当功耗取代性能成为首要约束,当软件生态可以从零开始建立时,处理器的设计应该遵循什么原则。ARM1在测试板上安静地运行,功耗低到几乎可以忽略不计,它的设计简洁到了极致,而帕特森的教科书正在印刷机上等待装订。两者各自沉默,各自等待那个尚未出现的市场。