大卫·帕特森与约翰·亨尼西
David Patterson and John L. Hennessy
1980 年前后,伯克利的大卫·帕特森(David Patterson)与斯坦福的约翰·亨尼西(John Hennessy)几乎同时把指令集往窄处推:只保留能被流水线快速执行的简单操作,把复杂操作交给软件序列。RISC 不是美学,而是一张可测量的账单——指令数、每条指令的周期、时钟频率三者相乘得到 CPU 时间。1990 年的教材把这张账单写成学科方法:先测,再改,再测。
关于存储程序、ISA 与流水线冒险,计算机体系结构 与 CPU 流水线 已经写过。本篇不再把五级流水线图重画一遍。这里要看的是两人怎样把体系结构从“聪明的指令”改成可比较的性能方程,以及 RAID、多核与 RISC-V 如何把同一方法用到存储与开放指令集上。
破除误解:RISC 不是“指令越少越好”,定量方法也不是基准作弊
第一层误解把 RISC 理解成指令条数的竞赛。精简的是每条指令的工作量与编码规整性,不是程序里出现的指令种类必须少到能背诵。复杂指令若能在同样的流水线节拍里完成,并不被教条禁止。帕特森与迪策尔 1980 年的 The Case for the Reduced Instruction Set Computer 论证的是:把稀有复杂操作用微码做进硬件,常常既减慢时钟,又挡着编译器做调度。判据是程序的 CPU 时间,不是指令集手册的页数。
第二层误解把定量方法当成挑选对自己有利的基准。亨尼西与帕特森的教材反复强调:用真实程序的指令混合,报告全部公式中的三项,而不是只报告时钟或只报告 MIPS。基准可以被滥用,方法本身包含防止滥用的结构——公式把隐藏项暴露出来。只宣传频率,就是拒绝使用他们的方法。
第三层误解把 2017 年图灵奖读成“发明了 RISC 处理器产品”。伯克利的 RISC-I/II 与斯坦福的 MIPS 是研究原型与随后的公司(MIPS Computer Systems)。工业界的 ARM、后来的 RISC-V,以及 x86 内部把复杂指令译成类 RISC 微操作,才是更长的传播史。两人的贡献是方法与教学,加上足以让工业抄走的原型,而不是某一款仍在卖的芯片商标。
现场:两所大学,一条性能方程
帕特森 1947 年生,1976 年在加州大学洛杉矶分校取得博士学位,此后在伯克利。亨尼西 1953 年生,1977 年在纽约州立大学石溪分校取得博士学位,此后在斯坦福,2000–2016 年任校长。1980 年代两人隔湾相望:伯克利做 RISC 与后来的 RAID、工作站网络(NOW),斯坦福做 MIPS 与编译器支持的流水线。竞争是公开的,教材却是合写的。这种组合很少见——对手把测量语言统一了,产品路线可以继续打架。
CPU 时间方程是他们的公共单位:
减少指令数(CISC 的诱惑)若抬高 CPI 或拉长时钟,总时间可以变差。RISC 赌的是:编译器愿意多发几条简单指令,以换取更低的 CPI 与更高的频率。存储层级与缓存 随后把同样的乘法用到缺失代价上:缓存命中率与缺失惩罚必须同时出现,否则“更大的缓存”只是一句未完成的句子。
1988 年,帕特森、凯茨与吉布森把冗余磁盘阵列写成 RAID。廉价磁盘的故障率高,但条带化加校验可以在容量与带宽上升的同时把数据丢失时间拉长。这不是把 CPU 方程抄到磁盘上,而是同一方法:先写可靠性与带宽的可测量量,再比较级别。RAID-5 的旋转校验与写惩罚,后来成为系统课里“没有免费冗余”的标准例题。
伯克利 RISC-I 的现场数字至今仍有教学价值。原型用较少的晶体管做出能跑 C 程序的处理器,编译器承担了当年微码曾承担的调度。指令字长固定,译码不再是关键路径上的迷宫。斯坦福 MIPS 把延迟槽写进架构合同:编译器必须看见流水线,而不能假装每条指令在发出时已经完成。合同一旦公开,硬件可以更狠地流水,软件必须更诚实。两人后来合写教材,等于把这场竞争的测量语言冻结成公共单位,而把产品胜负留给市场。
NOW(Network of Workstations)把同一方法用到机群:用商品机器加高速网,而不是定制超级计算机。瓶颈从处理器转到通信与负载平衡。Amdahl 定律在这里变成网络版:不可并行的通信与同步会迅速吃掉节点数。定量传统不保证 NOW 赢,它只保证你必须报告通信代价,而不能只报告峰值 flop。
机制:使常见情况变快,并把代价留在公式里
RISC 的机制集中在可流水。固定指令长度、load/store 把访存与运算分开、大量通用寄存器、硬连线控制而不是深微码。编译器负责填延迟槽、分配寄存器、把复杂操作展开。硬件负责每拍推进一条(或多条)简单指令。冒险由转发与停顿处理,而不是靠一条“智能指令”在内部做完一切。CPU 流水线 的正确性不依赖指令集是否自称 RISC,但规整编码让译码与调度变得便宜。x86 后来在微架构内部模仿这一点,等于承认方程,而不是承认商标。
Amdahl 定律约束加速比。若可并行或可改进的比例为 $f$,加速因子为 $s$,则
定律不是乐观的上限修辞,而是警告:未加速部分会迅速主导。多核时代把 $f$ 读成可并行份额;暗硅与功耗墙把 $s$ 读成你无法同时点亮的晶体管。GPU 与并行计算 的吞吐路线,是在高 $f$ 的数据并行负载上把这条定律用满;不规则负载上它一样残酷。帕特森后来谈 RISC-V 与领域专用加速,背景就是通用内核的 $f$ 已经不够用。
功耗把第三项 与能量绑在一起。Dennard 缩放失效之后,频率不再免费下降电压。每瓦性能成为与 CPU 时间并列的单位。定量方法必须把能量写进表格,否则“更快”只是在搬热。冯·诺伊曼 的存储程序模型没有规定能量;当代体系结构却必须把能量当成一等约束。两人 2010 年代的公开写作反复强调这一点:方法还是那张表,表格多了一列。
RAID 级别是同一张表的磁盘行。RAID-0 只条带、无冗余,带宽升、丢失时间降。RAID-1 镜像,写放大明显,读可并行。RAID-4/5 用校验换容量,小写变成“读—改—写”,旋转校验只是把校验盘的热点摊开。平均无数据丢失时间必须同时写入故障率、重建带宽与同时故障的概率,否则“冗余”只是形容词。大容量磁盘让重建窗口变长,RAID-5 的假设过期,纠删码与副本才进入数据中心。论文的寿命不在于级别编号,而在于三项必须同场出现:容量、带宽、故障。
局部性原理把存储层级接进方程。程序若没有时间与空间局部性,缓存只是更贵的内存。缺失代价 = 缺失率 × 缺失惩罚,两项都要测。编译器与程序员改的是缺失率,硬件改的是惩罚与带宽。RISC 之所以能把复杂指令交给软件,前提是寄存器窗口与缓存让“多几条指令”的 增长,被 CPI 与时钟项的下降盖过。没有局部性测量,这场赌就是口号。
2017 年图灵奖与开放指令集
ACM 把 2017 年图灵奖共同授予帕特森与亨尼西,表彰他们对计算机体系结构的系统设计方法与 RISC 的持久影响。教材《Computer Architecture: A Quantitative Approach》与本科的 Computer Organization and Design 把方法送进全球课堂,影响力可能超过任何一款原型芯片。亨尼西同时走过斯坦福校长与 Alphabet 董事长;帕特森走伯克利、Google 与 RISC-V 国际基金会。公共职务与学术方法应当分开评价,但传播路径确实因此更宽。
RISC-V 把指令集做成开放标准:模块化扩展、没有专利许可墙。它不是 1980 年代 RISC-I 的复刻,而是把“规整、可扩展、让编译器看见硬件”再写一遍。成功与否仍取决于生态,不取决于口号。方法给出的只是:指令集应当能被定量比较,而不是被历史授权锁住。教学芯片让学生关掉旁路、拉长流水、亲眼看见 CPI 随冒险上升,定量方法从此从阅读变成可复现的计数。没有这套开源合同,课堂只能对着厂商手册想象流水线。
代价与争议
RISC 与 CISC 的公开论战曾经被写成宗教。定量结果更平淡:决定延迟的是微架构与存储层级,ISA 的表面复杂度可以被译码器吸收,代价则出现在能耗、验证与授权上。ARM 的成功与 x86 的持续,都没有推翻方程,只是把 与 CPI 的权衡放在不同的市场约束下。
RAID 的争议是“廉价”一词过时之后,级别命名仍在被厂商滥用。RAID-0 没有冗余,RAID-5 在大盘上重建时间过长,纠删码与副本在数据中心接管了部分场景。1988 年的论文仍然有用,因为它把带宽、容量与故障当成必须同时出现的三项,而不是把阵列写成永不丢数据的魔法。
教材本身也成为权力。全球学生用同一组公式看机器,会把机器看成公式能看见的那些量。领域专用加速、近存计算与非冯结构若进不了公式,就会进不了课堂。这是方法成功后的阴影:测量语言会筛选问题。两人后期把 GPU、TPU 与开源 ISA 写进新版,是在修补这道筛选,而不是宣布方程作废。
跨域连接
- 热力学定律:功耗墙把体系结构接到热力学:计算是在有限温差下排放热量。Dennard 缩放失效之后,频率不能靠降压免费换来,时钟项与能量项不再可分。加速比必须用每焦耳来核对,否则只是把热从一个芯片搬到数据中心的冷水机。第二定律不禁止计算,它禁止无代价的可逆宣传。定量方法多出来的那一列“瓦”,是物理账单,不是运维偏好。
- 玻尔兹曼统计力学:开关能量、噪声裕量与热噪声把器件放进统计物理的温度尺度里。晶体管不是完美双值函数,而是有限温度下的势阱。出错率、电压与频率的交易,本质上是在玻尔兹曼因子附近找可接受的错误概率。体系结构选择(纠错、冗余、降频)是在这一统计层之上做离散化。忽略温度,CPI 公式会假装硬件是零温的图灵机。
- 线性代数:性能模型把程序写成指令混合向量,把机器写成每类指令的代价向量,点积就是时间。缓存与流水线让独立性假设失效,但线性分解仍是比较 ISA 与编译器的第一张表。GPU 上的 GEMM 更把线性代数从模型变成负载本身:加速比取决于矩阵乘法能否占满 $f$。公式与应用在这里会合,不是比喻。
- 测度论:基准是在程序空间上取的一种测度。只在某一支撑上积分,就会得到只对该支撑成立的“更快”。定量方法要求把测度写出来:哪些程序、何种输入分布、何种计数单位。Amdahl 的 $f$ 就是一种关于时间测度的分解。换测度等于换学科结论。厂商基准与科学基准的冲突,常是测度冲突,而不是算术冲突。
人物小记:把对手变成同一本教材的作者
帕特森与亨尼西没有合并实验室。他们把测量语言合并了。伯克利与斯坦福的原型可以竞争,学生却用同一条 CPU 时间方程做作业。这种公共单位比某一指令助记符传播得更远。图灵奖把两人绑在同一句子里,是对这种方法的承认:体系结构成为工程科学,是因为比较被写成了公式。
若把轨迹压成一句判据:好的体系结构贡献,是让后来者无法再只报告频率、只报告指令数、或只报告峰值 TOPS。 三项必须同时出现,能量正在成为第四项。RISC、RAID 与 RISC-V 都是这张表上的具体行,不是替代这张表的神话。
教材把“使常见情况变快”写成可检查的优先级,而不是品味。常见必须被测量:指令混合、缓存缺失、分支方向。稀有路径可以慢,但不能把错误结果当成快路径的代价。这一条同时约束 ISA 与 RAID:镜像的常见读可以更快,小写的稀有路径必须把校验更新写进合同。工业宣传喜欢只展示常见路径的加速比;定量方法要求把未加速部分留在分母里。
亨尼西在斯坦福的管理职务与帕特森在 RISC-V 基金会的角色,改变的是传播而不是方程。开放指令集把比较从专利许可里解放出来,让新的实现可以在同一 ISA 上竞争 CPI 与瓦。这仍是 1980 年代那张表:只是比较对象从封闭手册换成了公共规范。若生态锁把编译器与操作系统冻在一家授权上,公式里的三项就无法被第三方复现,方法就会退化成厂商幻灯片。
教材强迫把缺失代价乘进 CPI,等于强迫承认存储层次是架构的一部分,而不是主板厂商的配件。RAID 论文强迫把故障率与重建时间写进容量规划,等于强迫承认可靠性和带宽是同一张发票。没有这些乘法,体系结构课会退化成数据通路漫画。两人合著的真正产品是这张必须做乘法的表。
RISC-V 把这张表从封闭授权里解放出来,并没有取消乘法。模块化扩展让向量、原子与浮点成为可选行;比较两颗芯片,仍必须报告指令数、CPI、时钟与焦耳。开放标准只改变谁被允许实现这张表,不改变表上有几列。领域专用加速器进入新版教材,是因为通用内核上的 $f$ 已经不够:矩阵乘与注意力成为新的常见情况。常见情况变了,方程还在。把 RISC-V 写成「RISC 终于赢了商标战」,会把方法重新藏进阵营。
多核与暗硅把 Amdahl 的 $f$ 从程序可并行份额,扩成芯片上可同时点亮的份额。晶体管还在变多,功率预算不允许全部以最高频率工作。定量方法因此必须报告能效,而不能只报告峰值核数。Hennessy 与 Patterson 后期的公开写作反复回到这一点:公式多一列,是因为物理多了一列。课堂若仍只算 CPU 时间,会培养出只会读频率贴纸的工程师。
参考文献
- Patterson, D. & Ditzel, D. The Case for the Reduced Instruction Set Computer. ACM SIGARCH Computer Architecture News 8(6), 1980, pp. 25–33.(RISC 纲领)
- Hennessy, J. et al. MIPS: A Microprocessor Architecture. MICRO, 1982.(斯坦福 MIPS)
- Patterson, D., Gibson, G. & Katz, R. A Case for Redundant Arrays of Inexpensive Disks (RAID). SIGMOD, 1988, pp. 109–116.(RAID)
- Hennessy, J. & Patterson, D. Computer Architecture: A Quantitative Approach. 6th ed., Morgan Kaufmann, 2017.(定量方法教材)
- Amdahl, G. Validity of the Single Processor Approach to Achieving Large Scale Computing Capabilities. AFIPS, 1967, pp. 483–485.(加速比定律,定量传统的前身)
延伸阅读
- Patterson, D. & Waterman, A. The RISC-V Reader. Strawberry Canyon, 2017.(开放指令集的简明说明)