30 秒看懂
Adam Majmudar 此前从没设计过 GPU。他用两周时间学完了芯片技术栈,然后做出了 TinyGPU:一个可以运行矩阵加法和矩阵乘法的开源教学用 GPU。在 Cognitive Revolution 节目上,他和 Nathan Labenz 从类 CUDA 的内核一路讲到调度器、内存控制器和 OpenLane,并认为 AI 改变了一个有决心的学习者能多快挖出一个领域里真正重要的那 1%。
- 1每次进入一个新行业,Majmudar 都会问同一个问题:你能多快同时达到技术上的自信和行业上的认知?
- 2他把一个领域看作 99/1 的问题:1% 的概念承载了大部分价值。对 GPU 来说,这部分承重的核心是 SIMD、存储层级和调度。
- 3George Hotz 告诉他,他的第一版设计没有解决存储层级的问题;GPU 在很大程度上,就是在不同层级上隐藏内存延迟的工作。
- 4先猜,再验证遇到没有教科书可查的模块,他会先提出一个从第一性原理出发的版本,拿 Claude 或 ChatGPT 检验,然后再去读源码。
- 5静态资料给你答案;AI 让你能做假设检验他说,两种方式带来的理解深度并不一样。
- 6这场两周的冲刺,最后落在一个别人能运行、能质疑、能打补丁的仓库里。TinyGPU 吸引来的社区贡献,已经超出了 Majmudar 的预期。
按章节阅读整理后的全文
他问的是:技术能力和行业理解,能不能同时快速拿到
一个从没设计过 GPU 的人,两周就写出了一块。TinyGPU 能运行矩阵加法和矩阵乘法,代码开源;在他的笔记本上,完整的开源芯片流程要跑二十多分钟、大约五十个步骤。在设计稳定到不报错之前,他跑失败了三十多次。从计算机体系结构到真正设计出一块芯片,学校的路径通常要两到三年。Majmudar 的赌注是:只要愿意放弃百科全书式的完整,只抓住真正重要的那一部分,所需时间就能缩短大约 100 倍。
Nathan Labenz 邀请 TinyGPU 的作者来到 Cognitive Revolution,要把 GPU 从软件一路拆到硬件。这场对话给人的感觉是双重的:GPU 的核心逻辑简单到可以在一期节目里勾勒出来,同时,AI 正在悄悄改变一个人学习一个封闭行业的速度。Labenz 还把这个项目看作多代人积累的技术栈的一座纪念碑。Majmudar 之所以能做这件事,是因为成千上万的工程师花了几十年时间在芯片设计和设计自动化软件上。
Majmudar 在大学时创办过一家公司,做了三年,之后停下来,开始了一系列行业深潜,并把过程发在推特上。他挑的是他认为未来十到二十年会很重要的技术,以及他关心了多年的领域。每次他问的问题都不只是“我能不能做这项技术工作?”,还包括他能否读懂这个行业:有没有顺风,谁在领先,以及一个年轻人在哪里可能真正有机会。
芯片是他的第一次深潜,计划是两个两周的冲刺。第一次冲刺覆盖了整条工程链:EDA(把架构变成版图的软件)、制造,以及架构本身。他的规则更接近 99/1 而非 80/20:1% 的概念承载大部分价值。三年的学校教育买的是覆盖面和细节;两周则是用来挖出那 1%。第二次冲刺需要一个能检验学习效果的项目。GPU 位于图形、AI 加速器和张量机的底层,因此是天然的基础。TinyGPU 就是第二次冲刺的产物。
学习芯片设计真正的门槛是工具,而不是想法
几乎没有人会把这件事当业余爱好来做,Majmudar 解释时先拿 GPU 和 CPU 做对比。CPU 的历史够久,大学的体系结构课会讲控制信号,以及机器语言怎样在芯片上变成动作。软件和硬件是连在一起的,所以学生可以从零复刻一个 CPU。GPU 则恰恰相反:NVIDIA 和 AMD 公布的是高层架构图,几乎没有任何把机器简化成你能动手实现的小块的内容。Intel 发布过一些底层图,但那些是量产设计,细节太密,没法当教材用。
工具是更难的一堵墙。Synopsys 和 Cadence 的量产 EDA 每个席位要花几十万到几百万美元,个人根本碰不了,而要流片一块量产版图,依然需要这道护城河。让 TinyGPU 成为可能的,是过去十年间出现的一套技术栈。OpenROAD 是由 DARPA 资助的开源 EDA 项目,和商业工具相比功能并不完备,但对个人或小团队已经足够。SkyWater 开源了一套 130 纳米的工艺设计套件,哪怕晶体管尺寸很大,它也是一条真实的代工流程。Efabless 让一群人可以拼一次 shuttle(多项目晶圆):大约 1 万美元做 100 颗芯片。Matt Venn 创办的 Tiny Tapeout,把其中一颗芯片切成大约 100 个槽位,让一群人分摊成本。Majmudar 称 Venn 是让 ASIC 变得人人可及的人,并推荐了 Venn 的 Zero to ASIC 课程。
OpenROAD 之上是 OpenLane,它面向 SkyWater 的技术栈。Majmudar 计划把 TinyGPU 投递到 Tiny Tapeout。他会拿到一颗芯片,上面有他的设计,还有大约另外 99 个人的项目,他可以把它们都玩一遍。Labenz 问,这套技术栈除了用来学习还能做什么。Majmudar 并不指望业余工具能做出大生意;真正的量产技术栈仍会胜出。但他看到了小批量 ASIC 原型验证的一种可能市场,也看到了一个更明确的需求:在 CHIPS 法案和地缘政治让行业人才吃紧的当下,让学生对芯片形成直觉。
GPU 是架构、并行化和内存的组合,而他最先搞错的正是内存
回看这个项目,Majmudar 把它概括成三个词:架构、并行化和内存。前两个从外面看就很明显。内存则是他完全低估的那个。他还得先弄清楚“GPU”到底指什么。这个词现在囊括了图形处理器、张量机和各种加速器。他的产品目标是教学,所以他去掉了图形专用的硬件,只保留它们共有的骨架。如果有人说它不算 GPU,因为它画不出三角形,他并不在意。
软件层面的模式是 SIMD,即单指令多数据;硬件层面的名字是 SIMT,即单指令多线程。设想两个 1×8 的矩阵 A 和 B,把它们的和写进 C。CPU 会用一个 for 循环,迭代八次。而 GPU 的内核只需要会做一对元素的加法:读取 A[i],读取 B[i],相加,写入 C[i]。然后你让机器把这个内核跑八次,每个线程一次。诀窍在于,八份相同的代码仍然需要不同的地址。TinyGPU 给每个线程配了十六个寄存器;最后三个是只读的,由 GPU 写入:你所在的块编号、每个块里的线程数,以及你在块内的线程编号。内核用这些值算出内存偏移。写过 CUDA 的人一眼就能认出 blockIdx、blockDim 和 threadIdx。TinyGPU 以每组四个线程运行,每个核心一个块。第 3 个块包含全局线程 12 至 15。
这套指令集是为教学设计的约束,并非量产级的指令集架构。指令是 16 位的,操作码占 4 位,所以最多只能有十六种操作;寄存器字段是 4 位,所以最多十六个寄存器;分支立即数是 8 位,所以程序存储最多 256 行。真实的 GPU 指令通常是 32 位,约束宽松得多。操作本身很简单:加、减、乘、除、加载、存储、加载常数,外加一个空操作和返回。真正让内核能做事的,是 CMP 和 BR_NZP 这一对。CMP 把两个寄存器相减,并把结果为负、为零还是为正,记录在 NZP 标志里。BR_NZP 则在标志位满足条件时跳转。矩阵乘法需要点积和循环,这两条指令就是线程做累加的方式。
然后是内存,Majmudar 称之为他最大的一次修正。关于并行的常见说法是计算:一百次加法需要一百个加法器。真正拖慢速度的其实是带宽。一百个单元同时去读一百个全局地址,就会排队,延迟会急剧膨胀。他用了一个更尖锐的画面:一千个核心同时请求,带宽只够一百个,其余的人都在等。他恰好把设计拿给 George Hotz 看,Hotz 告诉他,这个设计并没有解决存储层级问题,而那是“最重要的事”。据 Majmudar 引述,Hotz 的意思是,GPU 很大程度上就是在绕开内存延迟,并在不同层级上把它隐藏起来。真正的 GPU 正因如此才会加入内存控制器、缓存、共享内存和屏障。TinyGPU 只保留寄存器和全局内存,并且砍掉了屏障。同样的天花板,在今天的模型上也能看到:训练和推理都跑在 GPU 上,厂商们不断堆叠缓存和带宽,就是为了掩盖这段等待。
芯片内部的 GPU:一台主机、一个调度器,加上一堆微型 CPU
一旦软件模型清楚了,硬件就容易理解了。一切从主机开始。CPU 把编译好的内核加载进程序存储,把矩阵加载进数据存储,把线程数写进设备控制寄存器,然后拉起启动信号。GPU 开始运行,发出完成信号,主机读取结果。GPU 本来就不是独自工作的;它总是紧挨着一台负责编译、加载和收集结果的机器。为了让教学设计保持小巧,Majmudar 省去了真实的主机到设备总线。
GPU 内部的第一个模块是调度器。它盯着四个核心,使用最简单又能用的策略:轮询(round-robin)。每个核心提供完成、复位和启动三个信号。核心一完成,调度器就把它复位,然后派发下一组四个线程的块,就像食堂排队,哪个窗口空了就补哪个。在代码里,它维护两个计数器:已派发的块数和已完成的块数;两者相等时,它就向 GPU 其余部分发出完成信号。Labenz 问他,这个调度器是不是从现成的零件菜单里拖出来的。项目里几乎没有任何东西是现成的。Majmudar 是根据自己认为它该怎么工作,来设计每一个块的,然后再用 Claude 检查这个想法。
每个核心共享一个调度器、一个取指单元和一个译码器。取指单元从程序存储中读取指令并缓存下来,因为块里的每个线程都在运行同一个内核。译码器把 16 位的 0 和 1 变成控制信号,分发给各个线程的执行单元。于是每个线程看起来都像一台微型 CPU:有自己的寄存器堆、程序计数器、ALU 和访存单元(LSU)。真实的 GPU 必须处理分支发散,也就是线程跳转到不同的代码行。TinyGPU 给每个线程都配了一个程序计数器,但 Majmudar 写的内核都让所有线程保持在同一条指令上,于是绕开了那个困难的情况。
硬件里还有一个细节:加法器、乘法器以及 ALU 的其余部分一直接通着,所以每个周期都在计算。多路复用器负责选择保留哪个结果。所谓“执行一条指令”,其实就是译码器打开了正确的开关。节流由内存控制器完成:四个核心、每个核心四个访存单元,共十六个请求方,可能同时发起请求。控制器把这些请求排好队,按内存的带宽逐个放行,再把应答送回去。Labenz 问,为什么四个线程同时发出的请求,完成时间却不一样?如果没有内存,一切都是确定的,每条指令都花固定的周期数。DRAM 是异步的,带宽队列意味着有些线程会先拿到数据。在 Majmudar 的设计里,先到的线程要等待。甚至整个核心也可能因为数据先回来而提前结束。时钟是另一个物理约束:触发器在上升沿捕获新值,一个周期只有几纳秒,而周期必须长于信号需要经过的最长路径。静态时序分析就是用来检查这些路径能不能装得下的。
从 Verilog 到版图的路径,笔记本还跑得动,前提是你能忍受那些报错信息
Majmudar 用 SystemVerilog 写下了功能逻辑。之后,开源 EDA 接手。综合把代码变成逻辑,并朝着等价的更小形式化简。这些逻辑再被映射到特定工艺的标准单元上,然后布局、布线:几万个门被摆放并连接起来。流程会反复优化、检查时序,并处理寄生效应——靠得太近的导线会耦合出电容,这类电气效应足以毁掉一块芯片。最终输出一个交给代工厂的 GDSII 文件,外加一项版图与原理图一致性检查,确认最终的多边形仍然和原始设计相符。
在这里,硬件与软件分道扬镳。软件可以先发布,之后再改。芯片错了就是错了,而且流片从几万美元起步,所以验证承担的分量,是软件从业者很少体会到的。在一台 M2 笔记本上,OpenLane 流程要跑 20 到 25 分钟,大约五十个步骤。在第一次完整无报错跑完之前,他在本地跑了 30 到 35 次。报错信息写得很差,而且常常随机出现;调试的透明度很低,你大多只能硬扛。最后它终于跑通了,他打开版图可视化,说那一刻感觉像魔法。Labenz 提到“站在巨人的肩膀上”,这句话并非装饰:这套几十年前的技术栈,正是这个两周项目实际在用的东西。
功能验证方面,他写了一个 Python 脚本,扮演外部内存的角色,因为 DRAM 不属于 GPU 设计的一部分。测试内核是他手工编译的机器码。脚本加载程序和数据,设置线程数,拉起启动信号,然后逐周期推进。日志会显示每个线程的寄存器、ALU 输出和核心状态;矩阵加法大约需要 500 个周期,之后脚本打印数据存储,让你能看到正确的和。他告诉好奇的听众去克隆仓库,读一读那份日志。如果他把这个设计流片,真实的芯片与外部 DRAM 的通信方式,会和模拟器一样。
AI 改变的是学习的循环,不只是答案
这个项目里值得偷师的,是学习方法。GPU 内部是专有技术,没有一本书告诉你怎么写调度器。Majmudar 依靠过两个开源 GPU 仓库,包括 MIAOW 和一个 Verilog GPU 项目,但它们文档很少、带着量产设计的痕迹,而且太大,读不完。他的办法是:先看到某个模块的名字,再借助 Claude,从第一性原理出发推演它该摆在哪、如何运作,提出假设,让模型提出反驳,最后才去翻仓库。一旦你自己构想出一个版本,别人的代码就变得可以读懂了。他打了个比方:外星人发现了一台电脑,光盯着晶体管是看不懂的;他们必须先形成自己的图景,再拿它去和眼前的机器对照检验。他承认,用这个比方来形容浏览 GitHub 仓库,确实有些过于复杂。
他还注意到,Claude 和 ChatGPT 有时会表现出一种超出书面内容的工程直觉。那些从未公开发表过的细节,比如专有 GPU 上 softmax 是怎么实现的,模型仍然能给出一个说得通的方向。Labenz 对这种感觉并不陌生:他在恶补 AI 和生物学的交叉知识时,以及在规划一款 macOS 应用时,都有过类似体会。静态页面给你的是答案。一个会和你的假设争辩的 AI,带来的则是另一种深度的理解。节目最后,Majmudar 说得更直接:他的学习理念很激进,他认为人能比自己预期的快 100 倍甚至 200 倍地推进,所得的知识深度不那么完整,但实用知识一样多,甚至更多;如果没有 AI,这个项目根本不可能完成。
谈到行业,Labenz 疑惑:两周就能做到这一步,是否意味着价值过多地集中在设计端,而制造被低估了。Majmudar 说,他的经验还不够,不足以给出有力的判断。他的建议是去读 Hamilton Helmer 的《7 Powers》,书中解释了护城河为什么成立,以及为什么一场两周的速通并不威胁在位者。他还引用了一条当时正在走红的推文,发文者刚从 NVIDIA 离职,在推文里说,自己现在可以确认:未来十年,没有人能赶上这家公司。Majmudar 认为,这类说法大概是对的。这个行业太重要了,而在位者又足够能干,包括 NVIDIA 和台积电,它们不可能就此变得懒散。
他想特别介绍的挑战者是 Atomic Semi。这家公司的创始人曾在车库里搭过一座芯片工厂,现在他想做便宜、相对快速的芯片工厂,首先服务于一个有点像 FPGA 的中端市场,成本只需几十万美元,远低于几十亿美元。如果成功,这个赌注就是一个新市场:你身边就能放一座芯片工厂,迭代时不必排在 100 亿美元级代工厂的队伍后面,同时服务于那些不需要最前沿工艺的定制设计。至于学到多深才算够,Majmudar 的态度很明确:他想要一幅全景图,加上关键的直觉,足以和一线工程师平起平坐,并听懂他们说的每一个词。除非某个真正的前沿问题要求,他不想把好几年耗在某一个角落里。
这场速通留下了四个可以带进下一个领域的习惯
对话在起点结束:TinyGPU 是一件能跑的成品,不是一叠笔记。Majmudar 的仓库里已经有人提 issue、做贡献,数量超出了他的预期,他也把这看作学习的一部分。能跑的仓库,会暴露私人笔记本藏起来的漏洞。Labenz 则对我们训练的模型背后,GPU 在做什么,形成了更强的直觉;他也看清了 Majmudar 这个人:下一个选中的领域,他多半还会继续速通。
可以带走的经验直截了当。为一个新领域写下 99/1 清单,直到你能说出那些承重的概念;对 GPU 来说,它们是 SIMD、存储层级和调度。当一个机制不透明时,先猜一个版本,再拿模型或源码去检验。冲刺结束时,留下一样别人能够复现的东西。而程序变慢时,先看数据搬运,再看算术运算,这正是 GPU 架构师反复重新发现的结论。
同频道的其他文章
1:25:56EN → 简体中文
2:17:48EN → 简体中文
2:00:51EN → 简体中文
1:26:46EN → 简体中文
1:10:12EN → 简体中文
1:30:54EN → 简体中文