跳转到内容

RISC I — 砍掉 90% 指令反而让 CPU 跑得更快

是什么

RISC I(Reduced Instruction Set Computer 第一代)是 1981 年 Berkeley 的 Patterson 和 Séquin 造的一颗实验芯片。它做了一件当时所有人都觉得”开倒车”的事:把 CPU 能识别的指令从 300 多条砍到 31 条,每条都简单、长度统一、一拍就跑完。

日常类比:当时的主流 CPU 像瑞士军刀——开瓶器、剪刀、放大镜、锯子全塞进一把刀,看着功能多。RISC I 像一把厨房直刀——只能切,但每一刀都干净利落。结果:拿厨刀的厨子比拿瑞士军刀的厨子做菜快 2-4 倍。

这个设计哲学就叫 RISC。今天你手机里的 ARM、Apple Silicon 的 M 芯片、新兴的 RISC-V,根都在这篇 1981 年的 ISCA 论文里。

为什么重要

不理解 RISC,下面这些事都解释不了:

  • 为什么 iPhone 里的 ARM 芯片功耗那么低,性能还跑得过桌面 x86
  • 为什么 Apple 2020 年敢全线切 M 系列(ARM 架构),抛弃 Intel
  • 为什么 x86 至今还活着,但内部”偷偷”把 CISC 翻译成 RISC 风格的微指令再执行
  • 为什么 2010 年 Berkeley 又造出 RISC-V,30 年后还在用同一个思路

一句话:整个现代 CPU 行业是 RISC 哲学的胜利,连看上去 CISC 的 x86,里面也是 RISC 的肉。

核心要点

RISC I 砍指令的同时做了三件配套设计:

1. 指令集减肥(31 条 vs VAX 的 300+)

每条指令必须满足:

  • 32 位定长(解码器一眼就懂,不用先看长度再读)
  • 单周期完成(除了 load/store 访存)
  • 只有 load/store 摸内存,其他全是寄存器到寄存器

类比:以前的 CPU 指令像中文成语,“四面楚歌”四个字一个语义;RISC 指令像基础汉字,多用几个字但每个字都简单常见。

2. 寄存器窗口(78 个物理寄存器,6 个可见窗口)

函数调用最贵的成本:把参数和局部变量推到内存(栈),调用完再读回来。

RISC I 的招数:芯片里准备 78 个寄存器,但软件每次只看到 32 个,叫一个”窗口”。函数调用时只挪一个指针,新窗口就出现了,旧窗口的值留在原地不动。后来的 RISC II(1983)扩到 138 个 / 8 窗口,这是常被混淆的版本。

类比:酒店有 78 间房,前台有一块”当前客人”的滑动牌。新一拨客人来不用搬行李,只要把滑动牌往前推一格——新房间就归他们了。

窗口的 32 个寄存器用途
10 个全局(所有窗口共享,存常用变量)
6 个调用方重叠(接收参数)
10 个私有局部变量
6 个被调方重叠(传出参数)

调用 / 返回 = 移动窗口指针,零内存访问

3. 没有微码

老 CPU 的复杂指令是用”微码”实现的——一个 ROM 里存着每条指令展开成的小步骤。这个 ROM 占大量芯片面积、还限制时钟。

RISC I 干掉微码,用纯硬连线逻辑做译码。芯片小了,时钟可以更快。

实践案例

案例 1:函数调用成本对比

C 代码:

int add(int a, int b) { return a + b; }
int main() { return add(3, 4); }

VAX-11(CISC)执行 add(3, 4)

  1. 把 3、4 推到内存栈
  2. CALLS 指令——保存所有寄存器到栈
  3. 进入 add,从栈取参数
  4. 返回时再从栈恢复

RISC I 执行同样调用:

  1. 把 3、4 写到当前窗口的”传出”寄存器
  2. CALL 指令——窗口指针 +1,3、4 自然出现在新窗口的”传入”寄存器
  3. 返回时——窗口指针 -1,原值还在那

实测:RISC I 在 C 程序上比 VAX-11/780 快 2-4 倍,用的晶体管还少很多(44k vs VAX 几十万)。

案例 2:你今天就在用 RISC

打开 iPhone 设置看 CPU——A 系列芯片是 ARM 架构,ARM 全称 Advanced RISC Machine。Mac 上的 M 系列芯片同理。

打开手边 PC 的任务管理器看 Intel x86——它表面是 CISC,但 Pentium Pro(1995)之后,每条 x86 指令进 CPU 后会被译码成 1-4 条类 RISC 微指令(μops),实际执行的是微指令。RISC 思想已经赢到 CISC 内部了

案例 3:1980 年代的”编译器赌注”

RISC I 的核心论点:让硬件简单,把复杂度推给编译器

当时这是大胆赌博——编译器水平能跟上吗?1980 年代答案不明朗。但到 1990 年代,GCC、LLVM 这类成熟编译器证明:编译器优化能补上硬件让出的那部分,而且补得还更好(因为编译器看得到全程序,硬件只能看到几条指令窗口)。

踩过的坑

  1. “RISC 就是指令少”是误解:现代 ARM 有几百条指令,仍然是 RISC。关键不是数量,是”每条都简单、定长、单周期”。CISC 的真正特征是变长指令 + 内存操作数 + 微码实现。

  2. 寄存器窗口是把双刃剑:函数调用快了,但操作系统切换进程时要保存全部 138 个寄存器,慢一倍。后来 MIPS / ARM / RISC-V 都放弃了寄存器窗口,只有 SPARC(Sun 的 RISC 直系后代)保留下来。

  3. “CISC 死了”也是误解:x86 没死,桌面 / 服务器还在主导。但 x86 内部从 1995 年起就是”CISC 壳 + RISC 芯”。所以不是 RISC 赢了 CISC,是 RISC 思想赢了——它甚至住进了 CISC 的家里。

  4. 早期 RISC 程序确实变大:同样功能 RISC 用更多条指令——20%~40% 的代码体积膨胀。但内存便宜得很快,这个代价不值一提。

适用 vs 不适用场景

适用

  • 移动端 / 嵌入式 / 数据中心加速器(ARM、RISC-V)——功耗敏感,简单流水线友好
  • 编译器后端教学——RISC 是讲流水、寄存器分配、调度的最干净模型
  • 自定义芯片(DSA / NPU / TPU)——基本都用 RISC 风格指令集

不适用

  • 需要兼容 30 年遗留二进制(Windows / 桌面)——x86 的 CISC 包袱卸不掉
  • 极端代码体积敏感的场景(部分 IoT)——CISC 或 ARM Thumb 这种压缩 ISA 更合适

历史小故事(可跳过)

  • 1970 年代:内存又贵又慢。设计哲学是”指令越复杂越好”——一条指令做的事多,程序就短,省内存。VAX-11 极致之作,连”求多项式”都是一条指令。
  • 1975 年:IBM 内部项目 801(John Cocke 主导)发现:编译器只用了 CISC 指令集的 20%,剩下 80% 的复杂指令几乎没人生成。但 IBM 没公开。
  • 1980 年:Patterson 在 Berkeley 也独立做出同样观察,决定造一颗”反潮流”的芯片,证明 simpler is faster。
  • 1981 年 5 月:ISCA 论文发表,6 页。同年 Stanford 的 Hennessy 也发表 MIPS 论文,思路相通。
  • 1985 年:Acorn(英国)发布 ARM1,受 RISC I 直接启发。后来这家公司的命运——你今天的手机就是。
  • 2010 年:Berkeley 又开始 RISC-V 项目,免费开源 ISA,三十年后回到原点又一次革命。

学到什么

  1. 简单不是缺点,是杠杆——少功能 + 高频率 + 好编译器 > 多功能 + 慢时钟 + 复杂硬件
  2. 架构选择 = 在硬件和软件之间分账——RISC 把复杂度搬给了编译器,赌它会变强;赌赢了
  3. 第一性原理 > 路径依赖——1980 年的”主流共识”是越复杂越好,Patterson 直接质问”那 80% 没人用的指令为什么还存在”
  4. 真正的胜利不是替代对手,是渗透对手——x86 内部跑 RISC μops 是 RISC 思想最深层的胜利

延伸阅读

  • 论文 PDF:RISC I 1981(8 页,可读性极高)
  • Patterson & Hennessy 教科书:《Computer Organization and Design》(计算机体系结构经典,作者就是 Patterson 本人)
  • 视频:The Berkeley View on RISC — Patterson 多次公开讲过这段历史
  • tomasulo-1967 —— 同样是体系结构里”硬件自动化”的代表,但走相反方向(CPU 自己重排指令)
  • amdahl-law-1967 —— 决定 RISC 简化策略效果上限的基础定律

关联

  • tomasulo-1967 —— Tomasulo 1967 让 CISC 硬件自己乱序执行;RISC 1981 让硬件简单,把乱序留给编译器
  • amdahl-law-1967 —— Amdahl 1967 说串行段决定加速上限;RISC 简化译码 = 缩短关键路径
  • ssa —— SSA 是现代编译器优化骨架,RISC 让 SSA-based 优化能直接落到指令上
  • llvm —— LLVM 后端把 IR 翻成各种 RISC 风格 ISA,是 RISC “推给编译器”赌注的当代兑现

反向链接

  • amdahl-law-1967 —— Amdahl 定律 — 串行比例决定并行加速比的上界
  • case-for-risc-1980 —— Case for RISC 1980 — 一篇没有芯片的论文,掀起 CPU 半世纪革命
  • llvm —— LLVM — 模块化编译器框架
  • mips-1981 —— MIPS 1981 — 让编译器自己安排流水线,CPU 就不用管
  • rt-thread —— RT-Thread — 中文社区主导的物联网 RTOS
  • ssa —— SSA — 静态单赋值形式