体系结构的定义
设计抽象层,用现有制造技术高效实现应用
CS152 · 第 1 课
在学习任何具体的处理器设计之前,先要回答一个更根本的问题:计算机体系结构(computer architecture)到底在做什么?这一课通过 IBM 360 的真实故事,引出整门课的核心矛盾——指令集架构(ISA)与微架构(microarchitecture)的分离。
课程给出的定义:计算机体系结构是设计抽象层(abstraction layers),使我们能够用现有的制造技术高效地实现信息处理应用。应用(application)和物理(physics)之间的鸿沟太大,无法一步跨越,于是产生了一系列中间抽象层:
| 抽象层 | 对应的 UCB EECS 课程 |
|---|---|
| Application | — |
| Algorithm | CS170 |
| Programming Language | CS164 |
| Operating System / Virtual Machines | CS162 |
| Instruction Set Architecture (ISA) | CS152/252A(本课程) |
| Microarchitecture | |
| Gates / Register-Transfer Level (RTL) | EECS151/251 |
| Circuits | EE143 |
| Devices / Physics | — |
CS152 恰好覆盖了 ISA 和 微架构 这两层——这正是本课程反复强调的一对概念,也是理解全课的钥匙:
ISA(指令集架构):软件可见的语义——指令做什么、有哪些寄存器/内存/PC 等"架构状态"(architectural state)。
微架构(microarchitecture):ISA 的物理实现——数据如何存储和移动(datapath,数据通路)、控制信号如何生成并对数据通路排序(control,控制)。
同一个 ISA,可以有许多种不同的微架构实现——这正是本课程要讲的全部内容:Hardwired(硬连线)、Microcoded(微编码)、Pipelined(流水线)等风格。
体系结构并非一成不变,而是被两股力量持续推动:
但这个循环受到第三个力量的强烈牵制:兼容性(compatibility)——软件开发的成本使兼容性成为市场中的主导力量。这条线索会在本课直接引出 IBM 360 的设计动机。
历史上主要的技术世代(technology generation)依次是:机电(electromechanical)→ 继电器(relay)→ 真空管(vacuum tube)→ 晶体管(bipolar/pMOS/nMOS)→ CMOS。每一代都带来数量级的性能/能耗提升,但也让"用什么技术实现控制逻辑最便宜"这个问题的答案不断变化——这正是第 2、3 课要讨论的硬连线 vs. 微编码之争的技术背景。
课程用历史叙事帮助理解设计动机:"未来的技术可能和过去一样受限,忽视历史的人注定要重蹈覆辙"。这里只挑选对理解 ISA/微架构分离最关键的几个节点,而非逐台机器罗列。
Charles Babbage 设计的 Analytical Engine 被认为是第一台通用数字计算机的设计(虽然只造出了很小一部分)。它已经包含了现代计算机的主要部件:
指令以打孔卡片形式提供,采用三地址格式(两个源操作数、一个目的操作数,均在 Store 中)。Ada Lovelace 为其撰写了计算伯努利数的程序——被公认为世界上第一个程序。
ENIAC 是第一台电子通用计算机,纯电子的取指令和执行,因此速度很快,但编程方式是插板和开关——修改一次程序可能要花费数天。ENIAC 团队随后讨论"存储程序"(stored-program)的想法:把程序像数据一样存放在存储器中,而不是通过硬件接线来表达。
关键教训:1948 年对 ENIAC 的改造使其可以以存储程序模式运行,但速度比硬连线模式慢 6 倍。由于当时 ENIAC 本来就受限于 I/O 速度,这个降速在实践中并不重要,而编程效率的提升让这个改动物有所值。
这正是"硬连线 vs. 可编程(微编码)控制"这对权衡第一次以具体数字的形式出现——性能 vs. 灵活性/开发效率——第 2、3 课会把这个权衡系统化。
曼彻斯特 SSEM "Baby"(1948)第一次运行了存储程序,剑桥 EDSAC(1949)则是第一台实用的存储程序计算机;EDSAC-II(1958)是第一台采用微程序控制单元(microprogrammed control unit)的机器——微编码思想由此进入实践。
到 1960 年代初,IBM 拥有多条互不兼容的计算机产品线:
| 早期型号 | 后续型号 |
|---|---|
| 701 | → 7094 |
| 650 | → 7074 |
| 702 | → 7080 |
| 1401 | → 7010 |
每一条产品线都有自己独立的指令集、I/O 系统与外存(磁带、磁鼓、磁盘)、汇编器/编译器/程序库,以及各自的市场定位(商用/科学计算/实时系统)。这意味着:客户每换一个型号(哪怕只是升级同一"档次"内的机器),软件几乎要重写一遍。
Amdahl、Blaauw 和 Brooks 在 1964 年提出的设计前提中,第一条就是:设计必须能够适应增长和后续机型。IBM 360 因此被设计为一个通用寄存器(General-Purpose Register, GPR)机器:
关键在于:这一套 ISA 在从低端到高端、datapath 宽度相差 8 倍的多种硬件实现上完全一致:
| Model 30(低端) | Model 70(高端) | |
|---|---|---|
| 存储容量 | 8K–64 KB | 256K–512 KB |
| 数据通路(datapath) | 8 位 | 64 位 |
| 电路延迟 | 30 ns/级 | 5 ns/级 |
| 局部存储(Local Store) | 主存(Main Store) | 晶体管寄存器 |
| 控制存储(Control Store) | 只读,1 微秒 | 专用电路(硬连线) |
这就是本课程的核心里程碑:IBM 360 的指令集架构完全隐藏了各型号之间的底层技术差异——8 位数据通路的 Model 30 用只读控制存储实现控制逻辑(更接近第 2、3 课要讲的"微编码"风格,因为逻辑门比 ROM 贵),64 位的 Model 70 则用专用电路直接实现控制逻辑("硬连线"风格,因为在高端机器上性能优先,逻辑电路的相对成本可以负担)。同一份汇编代码、同一个编译器后端,可以不加修改地跑在两台性能相差悬殊的机器上。
这正是与用户直接相关的经济学:厂商不必为每一档性能重新开发软件生态;用户购买入门机型后,未来可以无痛升级到高性能机型而不必重写程序——这为软件开发节省了大量的时间和金钱,也是 IBM 360 能够统一多条产品线、后来 Intel x86 沿用同样策略统治市场的根本原因。
问题 1:下列哪个说法准确描述了 ISA 与微架构的关系?
问题 2:IBM 360 Model 30 和 Model 70 的数据通路宽度分别是 8 位和 64 位,为什么它们仍能运行同一份编译后的程序?
问题 3:1948 年,ENIAC 被改造为可以以"存储程序"模式运行,与原来的硬连线(插板)模式相比,性能发生了什么变化?
设计抽象层,用现有制造技术高效实现应用
软件可见语义 vs. 数据通路+控制的硬件实现
软件重写成本使兼容性成为市场主导力量
同一 ISA 首次跨越 8 位到 64 位数据通路,完全隐藏实现差异
sp23/lecture_slides/L01_Early_Machines.pdf(UC Berkeley CS152/CS252A, Spring 2023, Sophia Shao)