探讨 David Patterson 的 RISC 思维和软硬件协同设计如何提升每瓦性能、影响 CPU 设计,并塑造了当今的 RISC‑V。

David Patterson 常被称为“RISC 先驱”,但他的持久影响超越了任何单一 CPU 设计。他帮助普及了一种实用的计算机思维方式:把性能当作可以衡量、可以简化并端到端改进的东西——从芯片能理解的指令到生成这些指令的软件工具。
RISC(精简指令集计算)的理念是:当处理器专注于一组更小、更简单的指令时,它可以运行得更快、更可预测。与其在硬件中实现大量复杂操作,不如把常见操作做得快速、规则且易于流水线化。回报不是“能力变少”——而是高效执行的简单构件在真实工作负载中往往更有胜算。
Patterson 还倡导软硬件协同设计:这是一个芯片架构师、编译器作者和系统设计师一起迭代的反馈循环。
如果处理器被设计为善于执行简单模式,编译器就能可靠地产生这些模式。如果编译器揭示真实程序在某些操作(比如内存访问)上花费大量时间,硬件就可以针对这些情况进行调整。这就是为什么关于指令集架构(ISA)的讨论自然会与编译器优化、缓存和流水线联系在一起。
你将了解 RISC 思想如何与“每瓦性能”相关(而不仅仅是原始速度)、为什么“可预测性”让现代 CPU 与移动芯片更高效,以及这些原则如何出现在今天的设备中——从笔记本到云服务器。
如果你想在深入之前先拿一张关键概念图,请跳到 /blog/key-takeaways-and-next-steps。
早期微处理器在严格的约束下构建:芯片电路空间有限、内存昂贵且存储缓慢。设计者试图推出既便宜又“足够快”的计算机,通常配备小缓存(或没有缓存)、适中的主频和与软件需求相比非常有限的主存。
那时一个流行的想法是,如果 CPU 提供更强大的高级指令——能够一次完成多步操作的指令——程序运行会更快且更易编写。如果一条指令能“完成多条指令的工作”,当时的想法是总体指令数会减少,从而节省时间和内存。
这就是许多 CISC(复杂指令集计算)设计背后的直觉:给程序员和编译器一个包含许多花哨操作的大工具箱。
问题在于,真实程序(以及将它们翻译的编译器)并不总是利用那些复杂功能。许多最精巧的指令很少被使用,而一小组简单操作——加载数据、存储数据、加法、比较、分支——却反复出现。
与此同时,支持大量复杂指令让 CPU 更难构建,也更难优化。复杂性占用了芯片面积和设计精力,而这些本可以用于让常见、日常的操作更可预测、更快速。
RISC 就是对这种差距的回应:把 CPU 的重心放在软件真实大多数时间所做的事情上,使那些路径更快——然后让编译器以系统化的方式做更多的“指挥”工作。
一个简单的比喻是把 CISC 与 RISC 比作工具箱。
CISC(复杂指令集计算)就像一个装满许多专用且花哨工具的车间——每个工具一次可以做很多事。一条“指令”可能包含从内存加载数据、做计算并存回结果的全部步骤。
RISC(精简指令集计算)更像只带着一套可靠、常用的工具——锤子、螺丝刀、卷尺——并通过可重复的步骤构建一切。每条指令通常只做一件小而明确的工作。
当指令更简单且更统一时,CPU 能用更干净的生产线(即流水线)来执行它们。这样的生产线更容易设计、更容易以更高频率运行,也更容易保持忙碌。
对于 CISC 风格的“多步”指令,CPU 经常需要对复杂指令进行解码并将其拆解为内部更小的步骤。这会增加复杂性并让流水线更难保持顺畅。
RISC 追求指令时序的可预测性——许多指令耗时相近。可预测性有助于 CPU 高效调度工作,也帮助编译器生成能持续填满流水线而不是造成停顿的代码。
RISC 通常需要更多指令来完成相同任务。这可能意味着:
但如果每条指令都很快、流水线顺畅且设计更简单,这个代价仍然划算。
在实践中,优化良好的编译器和良好的缓存可以抵消“指令更多”的劣势——CPU 可以把更多时间花在做有用的工作,而不是解开复杂指令。
伯克利 RISC 不只是一个新的指令集,而是一种研究态度:不要从纸面上看起来优雅的方案出发——从程序实际做什么开始,然后围绕现实塑造 CPU。
在概念上,伯克利团队追求一个足够简单、能够非常快且可预测运行的 CPU 核心。他们没有在硬件中塞入许多复杂的指令“技巧”,而是依赖编译器承担更多工作:选择直接明了的指令、合理调度,并尽可能把数据保存在寄存器中。
这种分工很重要。更小、更清晰的核心更容易有效流水线化、更易理解,并且往往每个晶体管的性能更高。编译器能看到整个程序,可以做出硬件在运行时不容易做到的前瞻性规划。
David Patterson 强调测量,因为计算机设计充满诱人的神话——一些听起来有用的特性在真实代码中很少出现。伯克利 RISC 倡导使用基准和工作负载跟踪,找出“热点路径”:支配运行时间的循环、函数调用和内存访问。
这直接与“让常见情况变快”原则相连。如果大多数指令是简单操作和加载/存储,那么优化这些高频情形比加速罕见复杂指令更有收益。
持久的结论是:RISC 既是架构也是心态——简化频繁出现的事物、用数据验证,并把硬件与软件视为一个可以共同调优的系统。
软硬件协同设计的核心思想是:不要孤立地设计 CPU。要把芯片和编译器(有时还有操作系统)一起设计,让真实程序运行得更快、更高效——而不是仅在合成的“最佳情况”指令序列上表现优秀。
协同设计像一个工程循环:
ISA 选择: 指令集架构(ISA)决定了 CPU 能容易表达的操作(例如“load/store”内存访问、更多寄存器、简单寻址模式)。
编译器策略: 编译器适应这些选择——把热变量保存在寄存器中、重排指令以避免停顿、选择能降低开销的调用约定。
工作负载结果: 测量真实程序(编译器、数据库、图形、操作系统代码),看时间和能量花在哪里。
下一个设计: 基于这些测量调整 ISA 和微架构(流水线深度、寄存器数、缓存大小)。
下面是一个突显这种关系的小循环(C 语言):
for (int i = 0; i < n; i++)
sum += a[i];
在 RISC 风格的 ISA 上,编译器通常把 sum 和 i 保存在寄存器中,使用简单的 load 指令读取 a[i],并进行指令调度以便在等待加载完成时让 CPU 保持忙碌。
如果芯片增加了编译器很少使用的复杂指令或专用硬件,这些区域仍会消耗功率并占用设计精力。与此同时,编译器确实依赖的“枯燥”事物——足够的寄存器、可预测的流水线、有效的调用约定——可能得不到足够资源支持。
Patterson 的 RISC 思维强调把硅资源花在真实软件确实能受益的地方。
RISC 的一个关键思想是让 CPU 的“装配线”更容易保持忙碌。这个装配线就是流水线:处理器把工作分成若干阶段(取指、译码、执行、回写)并将它们重叠执行,而不是等一条指令完全结束才开始下一条。当一切顺利时,你几乎可以达到每周期完成一条指令——就像汽车通过多工位工厂一样。
当流水线上的每一项更相似时,流水线效果最好。RISC 指令设计相对统一且可预测(常为定长、寻址简单),这减少了某条指令需要额外时间或特殊资源的“特殊情况”。
真实程序并不完美平滑。有时一条指令依赖前一条的结果(在结果计算出来之前不能使用它)。有时 CPU 需要等待来自内存的数据,或尚不知分支会走哪条路径。
这些情况会导致停顿——流水线的部分阶段闲置。直观上看:当下一阶段无法做有用工作因为所需东西还没到位时就会发生停顿。
这正是软硬件协同设计明显显现的地方。如果硬件是可预测的,编译器就能帮助通过重排指令顺序(在不改变程序语义的前提下)来填补“空档”。例如,在等待某个值准备好时,编译器可能安排一条与该值无关的独立指令。
回报是责任的共享:CPU 在常见情况下保持简单而快速,编译器承担更多规划工作。两者配合减少停顿并提高吞吐——常常在不需更复杂指令集的情况下改进真实性能。
CPU 能在几周期内执行简单操作,但从主存(DRAM)取数据可能需要数百周期。这个差距存在因为 DRAM 在物理上更远,更注重容量与成本,并受延迟与带宽限制。
随着 CPU 变快,内存并没有以相同比例提升——这种日益扩大的不匹配常被称为“内存墙”。
缓存是放在 CPU 附近的小而快的存储,用来避免每次访问都支付 DRAM 的代价。它们之所以奏效,是因为真实程序具有局部性:
现代芯片把缓存分级(L1、L2、L3),试图把“工作集”的代码和数据保留在靠近核心的地方。
这正是软硬件协同设计大显身手的地方。ISA 与编译器共同决定程序对缓存的压力:
通俗地说,内存墙解释了为什么高主频的 CPU 仍可能感觉迟缓:打开大型应用、运行数据库查询、滚动信息流或处理大数据集常常瓶颈在缓存未命中和内存带宽上——而不是纯算术速度。
长期以来,CPU 讨论像是一场竞速:哪个芯片完成任务最快就“赢”。但真实计算机运行在物理限制之内——电池容量、热量、风扇噪音与电费。
这就是为什么每瓦性能成为核心指标:你为消耗的能量获得了多少有用工作。
把它当作效率,而不是峰值能力来看待。两颗处理器在日常使用中可能感觉相似,但其中一颗在更低功耗下完成工作、发热更少并能在相同电池上运行更长时间。
在笔记本和手机上,这直接影响续航与舒适度。在数据中心,则影响为数千台机器供电和制冷的成本,以及你能以什么密度放置服务器而不致过热。
RISC 思维推动 CPU 设计朝着在硬件中做更少事情、执行更可预测的方向发展。更简单的核心能在若干因果路径上降低能耗:
重点不是“简单总是更好”。而是复杂度有其能量代价,恰当选择的指令集与微架构可以用少量巧妙设计换来大量效率。
手机关注电池与发热;服务器关注供电与制冷。目标不同,但教训相同:最快的芯片不一定是最好的电脑。胜出者往往是在保持能耗受控的同时提供稳定吞吐的设计。
人们常把 RISC 简化为“更简单的指令会赢”,但更持久的教训更微妙:指令集很重要,但许多现实世界的收益来自芯片如何实现,而不仅仅是 ISA 在纸面上的样子。
早期 RISC 的论点暗含一种观点:更干净、更小的指令集会自动让计算机更快。实际上,许多最大幅度的加速往往来自 RISC 更利于实现的方案:更简单的解码、更深的流水线、更高的频率以及编译器可以更可预测地调度指令。
这就是为什么两个不同 ISA 的 CPU 在微架构、缓存大小、分支预测和制造工艺上差别不大时,性能可能出乎意料地接近。ISA 定义规则;微架构决定比赛如何进行。
Patterson 时代的一大转变是从数据出发而不是凭直觉设计。不是因为某个指令“看起来”有用就把它加进去,而是测量程序真正做什么,然后优化常见情形。
这种心态通常胜过“功能驱动”的设计(其中文件复杂度增长往往快于收益)。它也让权衡更清晰:一条节省几行代码的指令可能会增加周期、能耗或芯片面积——这些成本会在系统层面上显现。
RISC 思维不仅影响了“RISC 芯片”。随着时间推移,很多 CISC CPU 也采取了 RISC 式的内部技术(例如把复杂指令拆成更简单的内部操作),同时保留其兼容的 ISA。
因此结果不是“RISC 击败 CISC”。而是向那些重视测量、可预测性与紧密软硬件协同的设计方向演进——无论 ISA 的商标是什么。
RISC 并未止步于实验室。从早期研究到现代实践,一条清晰的脉络贯穿了 MIPS 到 RISC‑V 这两套 ISA:它们把简洁与清晰作为特性,而非限制。
MIPS 常被记为教学用的 ISA,这是有原因的:规则易于讲解、指令格式一致、基本的 load/store 模型不干扰编译器。
这种简洁不仅限于学术。MIPS 多年来也出现在真实产品中(从工作站到嵌入式系统),部分原因在于直观的 ISA 更容易构建快速流水线、可预测的编译器和高效的工具链。当硬件行为规则时,软件就能据此规划。
RISC‑V 通过迈出一大步重燃了对 RISC 思维的兴趣:它是一个开放的 ISA。这改变了动力机制。大学、初创公司和大公司都可以在无需 ISA 许可的情况下进行实验、出货硅片并共享工具链。
对协同设计而言,这种开放性很重要,因为“软件端”(编译器、操作系统、运行时)可以在公开环境中与“硬件端”共同演进,减少人为的阻碍。
RISC‑V 与协同设计契合的另一个原因是其模块化策略。你可以从一个小的基集开始,然后为特定需求添加扩展——比如向量计算、嵌入式约束或安全特性。
这鼓励了一种更健康的权衡:不是把所有可能的功能塞进一个单片设计,而是让团队把硬件特性与实际运行的软件对齐。
如果你想要更深的入门,请参见 /blog/what-is-risc-v。
协同设计并不是 RISC 时代的历史脚注——它是现代计算不断提速与提高效率的方式。核心思想仍是 Patterson 式的:你不会靠单一的硬件或单一的软件“赢”。当两者发挥各自优势并互相契合时,你才会获胜。
智能手机和许多嵌入式设备大量采用 RISC 原则(通常基于 ARM):指令更简单、执行更可预测,并强烈关注能耗。
这种可预测性帮助编译器产生高效代码,也让设计者能构建在滚动时节能但在相机流水线或游戏时能瞬间爆发的核心。
笔记本与服务器也越来越追求相同目标——尤其是“每瓦性能”。即便指令集不是传统意义上的“RISC”,许多内部设计选择也旨在实现 RISC 式的效率:深度流水线、宽度执行和针对真实软件行为的积极功耗管理。
GPU、AI 加速器(TPU/ NPU)和媒体引擎是协同设计的实用形式:平台提供与常见计算模式相匹配的硬件,而不是把所有工作强行塞到通用 CPU 上。
之所以称为协同设计(而非“额外硬件”),是因为周边的软件栈:
如果软件不用加速器,理论上的加速就只是纸面上的数字。
两套看似规格相近的平台在实际体验上可能迥异,因为“真实产品”包含编译器、库和框架。一个优化良好的数学库(BLAS)、一个好的 JIT 或更聪明的编译器,往往能在不改硬件的情况下带来显著提升。
这就是为什么现代 CPU 设计通常以基准为驱动:硬件团队观察编译器和工作负载的实际行为,然后调整特性(缓存、分支预测、向量指令、预取)以让常见情况变快。
在评估一个平台(手机、笔记本、服务器或嵌入式板)时,留意协同设计的信号:
现代计算的进步不再是单一“更快的 CPU”,而是一个被形塑的整套软硬件系统——先测量、再设计,围绕真实工作负载进行优化。
RISC 思维与 Patterson 的更广泛信息可以浓缩为几个经得起时间检验的教训:简化必须变快的部分、测量真实情况,并把硬件与软件作为一个整体对待——因为用户体验的是整体,而不是各个组件的零碎。
首先,简单是一种策略,而非审美。一个干净的指令集架构(ISA)和可预测的执行让编译器更容易生成好代码,CPU 也能更高效地运行这些代码。
第二,测量胜过直觉。用有代表性的工作负载做基准,收集分析数据,让真实瓶颈指导设计决策——无论你是在调优编译器、选择 CPU 型号,还是重构关键热点路径。
第三,协同设计是收益叠加之处。对流水线友好的代码、缓存感知的数据结构以及现实的每瓦性能目标,往往比追逐理论峰值吞吐率带来更实用的加速。
如果你在选择平台(x86、ARM 或基于 RISC‑V 的系统),按用户实际使用的方式来评估:
如果你的一部分工作是把这些测量变成已发布的软件,缩短构建—测量循环会很有帮助。例如,团队使用 Koder.ai 通过一个基于聊天的工作流快速原型化并演化真实应用(Web、后端和移动端),然后在每次更改后重新运行相同的端到端基准。像计划模式、快照和回滚这样的功能支持了 Patterson 所推动的“先测量再设计”的纪律——只是应用在现代产品开发上。
想了解更深入的效率入门,请参见 /blog/performance-per-watt-basics。如果你在比较环境并需要一个估算成本/性能权衡的简单方法,/pricing 可能有帮助。
持久的结论是:这些理念——简化、测量与协同设计——持续产生价值,即便实现手段从 MIPS 时代的流水线演进到现代的异构核心与像 RISC‑V 这样的新指令集。
RISC(精简指令集计算)强调一组更小、更简单且更规则的指令,这些指令易于流水线化与优化。目标并不是“能力更少”,而是在实际程序最常用的操作上实现更可预测、更高效的执行(加载/存储、算术、分支等)。
CISC 提供许多复杂、专用的指令,有时把多步操作打包成一条指令。RISC 则使用更简单的构件(通常是 load/store + ALU 操作),更多依赖编译器把这些构件高效地组合起来。在现代 CPU 中,这条界线并不清晰,因为许多 CISC 芯片会把复杂指令翻译为更简单的内部微操作。
更简单、更统一的指令让构建平稳的流水线更容易(把指令执行当作一条“装配线”)。这可以提高吞吐率(接近每周期完成一条指令),并减少处理特殊情况所需的额外时间,从而同时改善性能和能耗。
可预测的 ISA 和执行模型让编译器能够可靠地:
这样可以减少流水线气泡和无谓的工作,在不增加复杂硬件的情况下提升实际性能。
软硬件协同设计是一个迭代循环:ISA 选择、编译器策略和对真实工作负载的测量相互影响。与其孤立地设计 CPU,团队会同时调优硬件、工具链(有时还有操作系统/运行时),以便真实程序跑得更快、更高效。
流水线停顿发生在流水线无法前进、在等待某些东西的情况下,例如:
RISC 风格的可预测性帮助硬件和编译器降低这些暂停的频率和代价。
“内存墙”是指快速 CPU 执行速度与缓慢主存(DRAM)访问之间不断扩大的差距。缓存(L1/L2/L3)通过利用局部性(时间局部性与空间局部性)来缓解这一差距,但缓存未命中仍可能主导运行时间——即使在非常快的内核上,程序也可能成为内存绑定的。
它是一个效率指标:每单位能量你能得到多少有用工作。实际上它决定了电池续航、发热、风扇噪音以及数据中心的供电和制冷成本。受 RISC 思维影响的设计常追求可预测执行与减少浪费切换,从而改善每瓦性能。
许多 CISC 设计内部采用了类似 RISC 的技术(流水线、把复杂指令拆成简单微操作、重视缓存与分支预测),同时仍然保持兼容的 ISA。长期的“胜利”不是某一方彻底压倒另一方,而是思维方式的演进:用测量驱动设计、优化常见情形,并让硬件与编译器/软件紧密协调。
RISC‑V 是一个开放的 ISA,基于小而精的基集并支持模块化扩展,这使其非常适合协同设计:团队可以把硬件特性与特定软件需求对齐,并在公开环境中共同演进工具链。它延续了“简单核心 + 强工具 + 测量驱动” 的思想。欲了解更多,请参见 /blog/what-is-risc-v。