#模型时代# AI芯片90%的面积不是在算数,而是在搬数据|从一个与门讲起的芯片设计课
这期播客是Dwarkesh Patel对Pope的第二次采访(Dwarkesh同时也是MatX的天使投资人,上一期我也发过,大家可以翻一下)。
Reiner Pope,是AI芯片创业公司MatX的联合创始人兼CEO。在创办MatX之前,他在Google领导TPU的AI软件开发工作,他的联合创始人Mike Gunter则是TPU硬件的主设计师。
2026年2月,MatX宣布完成5亿美元B轮融资,由Jane Street和Leopold Aschenbrenner创立的Situational Awareness领投,估值达到数十亿美元级别,计划2027年开始出货芯片。
上一期讲的是数据中心层面(token经济学)的问题,这一期则把镜头推到芯片内部:从最基础的逻辑门开始,逐级搭建出乘累加电路、脉动阵列、流水线寄存器,最终解释GPU、TPU、FPGA乃至人脑各自的架构为什么长成现在这个样子。整期对话的核心线索只有一个:在芯片设计的每一个层级上,计算本身的成本都远小于数据搬运的成本,而所有架构创新本质上都是在优化两者之间的比值。
一、从逻辑门到乘累加:AI芯片的最小计算单元
1、为什么"乘累加"是AI芯片的原子操作
矩阵乘法是神经网络最核心的数学运算:把大量数字按特定规则两两相乘再求和。拆到最底层,是三层嵌套循环:output[i][k] += input[i][j] × weight[j][k]。每一步循环的核心操作就是把两个数相乘,然后加到一个累加器上。这就是乘累加,英文叫multiply-accumulate,简称MAC。它不是人为选择的抽象,而是矩阵乘法的数学结构直接决定的。
Pope在黑板上演示了一个4位×4位的乘累加过程。在芯片的世界里,所有数字都用二进制表示,每一位叫一个bit,只有0和1两种状态。乘法部分需要生成16个部分积partial product,每个部分积只需要一个与门AND gate就能产生:两个bit都是1,结果就是1;任何一个是0,结果就是0。所以乘法阶段消耗16个与门,推广到P位乘Q位就是P×Q个与门。
2、加法才是真正的大头
16个部分积生成之后,真正的工作量在把它们加起来。Pope引入了全加器full adder这个电路基元。全加器只做一件事:把三个单bit数加在一起,输出一个两bit的结果,分别是sum位和carry位。它也被叫做"3到2压缩器",因为每使用一次,就把同一列中的三个数变成两个数,净减少一个。
具体做法是从右往左逐列处理:每次从同一列中挑出3个bit喂进全加器,吐出一个bit留在本列,另一个bit作为进位送到左边那列。这样不断压缩,把一大堆待加的数一层层削减,最终合并成一个结果。输入总共24个bit(16个部分积 + 8位累加项),输出8个bit,每用一次全加器消除一个bit,所以总共需要16个全加器。推广到一般情况,全加器数量恰好等于P×Q。这种逐层压缩的乘法电路叫Dadda multiplier,是用全加器实现面积高效乘法的标准方法。
3、乘累加比分开做"先乘后加"更划算
把乘法和加法合并成一个操作,在电路层面有一个优雅的代数性质:输入bit总数是P×Q + P + Q,输出bit总数是P + Q,两者相减恰好是P×Q个全加器。如果把乘法和累加拆开做,这个等式不会这么干净。这是芯片设计选择MAC作为基元的第二个原因,纯粹的电路效率。
4、低精度的优势是平方级别的
乘法电路的面积与bit宽度的乘积成正比(P×Q),对于相同精度来说就是二次方关系。这意味着把精度减半,计算电路面积缩小到四分之一,理论上能获得4倍算力。
这个二次方关系解释了为什么低精度训练和推理对神经网络如此有效。但浮点数不只存数值本身,还需要额外几个bit来记录小数点的位置,这就是指数位。处理指数位的电路开销使得实际比例偏离理论值。
芯片行业用FP加一个数字来标记浮点精度,FP后面的数字表示用多少个bit来表达一个浮点小数,数字越小精度越低,但同样面积上能塞进的计算单元越多。Nvidia在B200及之前的产品中,FP4的标称算力是FP8的2倍。这个比值之所以这么整齐,除了计算面积的因素,还有一个数据搬运的原因:两个4位数恰好可以打包进一个8位数的存储空间,芯片内部的总线宽度和存储单元尺寸因此天然对齐。这是"计算/通信"主线在精度维度上的又一个体现。
到了B300,FP4与FP8的算力比值从2倍提升到了3倍,以每秒千万亿次浮点运算PFLOPS来衡量,B300的FP4算力为15 PFLOPS,FP8为5 PFLOPS。Pope指出,理论上FP4应该比FP8快4倍,3倍已经更接近真实的物理规律。
5、累加精度要高于乘法精度
在AI芯片中,乘法操作的两个输入通常是低精度(比如4位),但累加器需要更高精度(比如8位)。原因是乘法链条只有一步,舍入误差不会叠加;而累加是把大量乘法结果逐步求和,每一步的舍入误差都会传递到下一步。精度不够的话,误差会迅速放大。
二、数据搬运的隐形代价:MUX与寄存器堆
MAC电路本身的设计到此为止。但一颗真实的芯片上,MAC不是孤立运行的,它必须从某个地方读取输入、把结果写回某个地方。这个"搬运数据"的环节,成本远比MAC本身高得多。
1、CUDA core内部的真实结构
在tensor core出现之前,GPU里负责计算的最小单元叫CUDA core,它和CPU的计算核心遵循同一个模型:有一个寄存器堆register file充当芯片上的超高速暂存空间,存放若干个待计算的数,还有一个乘累加单元做计算。每个时钟周期,从寄存器堆中选出三个数送进MAC单元,算完再写回寄存器堆。
"选出"这个操作在软件层面看起来无足轻重,但在电路层面需要一个叫多路选择器的电路来实现,也就是MUX。MUX的工作就是从N个输入中选出一个。
2、MUX的成本出人意料地高
Pope在黑板上画出了MUX的实现方式。假设寄存器堆有8个条目,我要选第3个。做法是给每个条目分配一个"选中信号":第3个条目的选中信号为1,其余7个为0。然后用与门把每个条目的每一个bit和它自己的选中信号相乘:被选中的那个条目所有bit原样通过,没被选中的全部变成0。最后用或门把8个条目的结果合并,因为只有一个条目非零,合并结果就是被选中的那个值。或门的逻辑和与门相反:只要有一个输入为1,输出就是1。
从门的数量来算:一个从N行、每行P bit的寄存器堆中选一个值的MUX,需要N×P个与门和(N-1)×P个或门。
MAC单元需要三个输入,所以需要三个MUX。总成本大约是3×N×P个门。以一个只有8个条目的小寄存器堆为例,光是MUX就要消耗24×P个门,而MAC电路本身(以4位精度为例)只有4×P个门。搬运数据的电路面积是实际计算电路的6倍。
3、"七分之八的成本是隐形的"
Pope算了一笔账:在这个简单配置下,整个数据通路大约七分之八的面积花在了寄存器堆的读写上,只有八分之一花在了真正做乘累加的逻辑单元上。而现实中的寄存器堆远不止8个条目。寄存器堆越大,MUX越贵,比例更加悬殊。
这就是tensor core被发明出来要解决的核心问题。tensor core是Nvidia在2017年Volta架构中引入的专用矩阵运算硬件:与其让每个CUDA core单独做一次乘累加,不如在芯片上直接铺一块更大的电路,一次性做一整块矩阵的乘法。问题是,怎样设计这块电路才能让数据搬运不跟着膨胀?
三、脉动阵列:把计算/通信比从线性提升到平方
1、从单个MAC到矩阵向量乘法
解决方案是把硬件"烘焙"的粒度提高一层。CUDA core只固化了一个MAC操作。脉动阵列systolic array则把矩阵乘法的内层循环整体固化成硬件。
以一个2×2的矩阵乘以一个长度为2的向量为例,需要4个MAC单元,排列成一个2×2的网格。每一列执行一个点积,也就是把矩阵的一列元素与输入向量逐位相乘后求和,结果从列底部输出。
2、通信成本只增长了线性倍,计算增长了平方倍
如果脉动阵列是X×Y的规模,计算量按X×Y增长(平方级),但输入和输出的数据量只按X增长(线性级)。多出来的Y倍就是计算相对通信的净收益。
关键在于矩阵乘法的数学特性:权重矩阵是一个二维的"面",而输入输出是一维的"线"。面的数据量比线多一个维度,所以可以把权重存在计算单元本地,只让输入向量和输出结果走外部通信。
3、权重矩阵怎么装进去:用时间换带宽
权重矩阵存在脉动阵列内部的寄存器中,但第一次总得从外面装进来。Pope的解法是"菊花链"式加载:每个时钟周期只往顶行灌入一行数据,然后逐周期往下移位。加载整个矩阵需要Y个时钟周期,速度慢,但布线带宽只需要X而不是X×Y。
Dwarkesh从中拆出了两个独立的优化维度:通信时间和通信带宽。权重只加载一次,所以可以容忍长时间的加载过程;关键是最小化带宽,因为带宽等于芯片面积。
4、计算/通信比这条主线贯穿芯片设计的每一层
Pope指出,这个模式在芯片设计的所有层级上反复出现:最底层是数值精度的选择(二次方 vs 线性),中间层是脉动阵列的设计(二次方面积 vs 线性通信),再往上是多芯片推理中的计算与显存带宽之比(上一期播客的主题)。"Squared versus linear term"这个结构无处不在。
5、脉动阵列的尺寸是芯片设计最重要的决策之一
Pope说芯片设计中大部分决策都是定尺寸的问题,sizing decisions。脉动阵列多大、寄存器堆多大,这两个问题互相耦合。一种思路是先定一个预算:比如把10%的面积给数据搬运,90%给脉动阵列。更大的寄存器堆意味着更灵活,能支持更多应用场景的性能需求,但会挤占脉动阵列的面积。
Google的早期TPU用的是128×128的脉动阵列。这是目前已知的最高效的矩阵乘法电路实现方式。
四、时钟周期与流水线:速度和吞吐量的博弈
前三章讨论的都是"面积怎么分配"。但芯片还有另一个维度的资源需要管理:时间。一颗芯片每秒钟能做多少次计算,取决于时钟频率有多快,而时钟频率本身也面临一组计算与通信之间的权衡。
1、为什么芯片需要全局时钟同步
一颗芯片上有上千亿晶体管在并行工作。这些并行单元之间需要同步。芯片的做法和软件中让线程排队等待的互斥锁完全不同:每隔大约一纳秒,全局时钟信号会让所有电路同时"暂停"一下,把当前计算结果锁存到寄存器中,然后同步进入下一拍。
同步的必要性来自制造差异。两条不同的逻辑路径(F和G)最终要汇合到同一个计算(H),但不同芯片上F和G的实际延迟会有微小差异。如果没有时钟同步,H可能拿到F的当前值和G的上一拍旧值,计算结果就会出错。
2、流水线寄存器:用面积换时钟频率
芯片中的"流水线"和工厂流水线是同一个概念:把一个大任务拆成多个小步骤,每一步由不同的电路同时处理不同的数据,让整体吞吐量上升。如果一团逻辑电路的延迟太长,在一个时钟周期内算不完,可以在中间插入一个寄存器,把一团逻辑拆成两半。每半的延迟减半,时钟频率可以翻倍。代价是多了一个寄存器的面积开销。
但这里有一个反直觉的陷阱:如果走到极端,每个与门后面都插一个寄存器,时钟频率可以超过5-6 GHz,但寄存器本身的面积大约是与门的8倍。此时绝大部分芯片面积都花在了"同步"上,而不是计算。时钟频率再高,每个周期做的有效工作太少,总吞吐量反而下降。
Pope做了一个类比:这和上一期讨论的batch size问题一样。batch size小的时候,单个用户的延迟低,但每小时处理的总token数也低。时钟频率和batch size在数学上面对的是同一个权衡。
3、反馈回路是时钟周期的硬约束
流水线插入寄存器的技巧有一个前提:逻辑路径是单向的。如果一段逻辑存在反馈回路,比如累加操作(每个周期把新的数加到一个运行中的累加和上),在中间插入寄存器会改变计算语义。原本是对所有输入求和,插入寄存器后变成了对偶数位和奇数位分别求和。
所有芯片都有反馈回路(累加器是最典型的例子),这些回路设定了时钟周期的下限。
4、TSMC提供积木,芯片架构师决定时钟
TSMC提供给芯片设计者的工艺设计套件PDK,其中的基本单元就是与门、全加器这个级别的原语。这些原语的延迟极快,大约10皮秒。一个时钟周期内通常可以串联10到30个这样的原语。时钟频率由芯片架构师设定,而不是由TSMC决定。每颗芯片上总有一条延迟最长的逻辑链路,叫关键路径,它决定了整颗芯片的时钟上限。同一个工艺节点,比如同样用3纳米制程做出的两颗不同芯片,如果关键路径的优化水平不同,时钟频率就会不同。
五、FPGA的灵活性为什么要付出10倍代价
到目前为止我们讨论的都是ASIC——为特定功能定制制造的芯片,GPU、TPU都属于这一类。但还有一种芯片可以在出厂后反复改写逻辑,这就是FPGA。对比两者的成本结构,能进一步看清"灵活性"在硬件世界里到底值多少钱。
1、FPGA和ASIC的商业取舍
FPGA和ASIC在概念上使用同样的编程模型:用逻辑门和时钟驱动的寄存器搭电路。任何能在FPGA上实现的东西,都能在ASIC上实现,而且便宜一个数量级,能效也好一个数量级。但第一颗ASIC光tape out这一步,也就是把最终设计文件交给代工厂去制造芯片,成本就要3000万美元,第一块FPGA只要1万美元。
高频交易公司用FPGA的原因就在这里:他们需要确定性延迟和高并行度,但策略每个月都在变,不可能每次都付tape out的成本。
2、FPGA内部是"MUX套MUX"
FPGA由三种组件构成:单bit寄存器、查找表LUT,以及连接它们的大量MUX。编程FPGA的实质就是配置每一个MUX的选择信号,告诉它从哪个邻近的寄存器或LUT取数据。
查找表本身也是一个MUX。一个标准的4输入LUT把每种输入组合对应的输出结果逐行列出,形成一张16行的真值表。4个bit的输入共有16种可能的0/1组合,每种组合对应一个输出值,所以任何4输入1输出的逻辑关系都可以用这张表表达。从电路角度看,LUT就是一个16选1的MUX:用4个输入bit作为地址,从16个预存值中选出对应的那一个。
3、10倍开销的来源可以精确计算
一个4输入LUT需要大约32个门(16个与门 + 16个或门)来实现16选1的MUX。而它能等价替代的最复杂功能,比如一个4路与门,在ASIC上只需要3个与门就能直接实现。32个门做了3个门的工作,开销超过10倍。
这个开销的本质是:真值表是一种通用但冗余的表示方式。用查找表列举所有输入组合的输出,远不如直接写出门电路来得简洁。直接放置多晶硅和金属走线来搭一个与门,信息密度要高得多。
4、FPGA厂商仍然要对连接拓扑做出选择
虽然FPGA号称"现场可编程",但它的灵活性只存在于局部邻域之内。每个LUT和寄存器只能从附近的一组固定候选中选择输入。更远距离的连接由FPGA厂商预先布好,用户无法改变。"Field programmable"中的field指的是"在部署现场",不是"电场"。
六、GPU、TPU与大脑:架构选择的背后逻辑
1、Cache vs Scratchpad:非确定性延迟的根源
CPU使用缓存cache来弥补一个速度鸿沟:芯片外部的DDR主内存容量大但速度慢,芯片内部的存储速度快但容量小,两者之间差着两个数量级。但缓存命中与否取决于运行环境:其他程序占用了哪些缓存行、最近访问过什么、缓存替换策略的随机种子是多少。这种不确定性是CPU延迟抖动的主要来源。
TPU采用了另一种设计哲学,使用一种叫scratchpad的便笺存储器。它与缓存的硬件形态类似,但访问方式完全不同。软件用一类指令读写scratchpad,用另一类指令读写HBM。HBM是一种紧贴在芯片旁边的堆叠式高带宽内存,速度介于片上存储和传统DDR之间。两类指令显式分开,没有硬件自动决定"数据在不在缓存里"这个环节,延迟就是确定的。专注推理加速的AI芯片公司Groq也采用了类似的确定性延迟设计。
Pope强调了一个容易被忽略的点:确定性延迟并不是什么高难度的设计目标,反而比非确定性更简单。缓存是后来为了追求更高的平均性能而引入的复杂机制。
2、GPU是一堆微型TPU的集合体
GPU内部是大量几乎完全相同的流式多处理器SM组成的规则网格,中间夹一块所有SM共享的L2缓存。每个SM里都有自己的tensor core负责矩阵乘法,向量单元负责逐个元素的加减乘除等非矩阵运算,以及寄存器堆提供暂存空间。
TPU则由少数几个大型矩阵计算单元MXU组成,中间放一个向量单元。如果把TPU的矩阵单元和向量单元按比例缩小,缩到很小的尺寸,本质上就是一个SM。
3、大单元 vs 小单元的工程权衡
TPU的设计允许使用更大的脉动阵列,更好地摊薄寄存器堆的成本。但缺点是矩阵单元和向量单元之间的数据搬运必须走一两条长距离总线,带宽有限。
GPU的设计把向量单元分散到每个SM里,矩阵单元和向量单元之间的通信距离短、路径多(比如16条并行通路),总带宽更高。但每个SM里的脉动阵列尺寸小,寄存器堆摊薄效果差。
只要完全在一个SM内部操作,数据搬运成本极低。一旦需要跨SM通信,开销会陡增。
4、CPU core为什么比GPU core大得多
CPU只有大约100个核心×16路向量,总共约1600路并行。每个核心却比FPGA的一个LUT大无数倍。面积去了哪里?最大一块给了缓存,其次是寄存器堆(真正执行算术运算的ALU算术逻辑单元本身只占很小比例),还有一块专门给了GPU里完全没有对应物的分支预测器branch predictor。
分支预测器的作用是在CPU的指令处理流水线中提前猜测分支走向。流水线很深,大约5纳秒,但时钟周期要求远快于此。CPU必须在分支指令实际执行完毕之前的5个周期就预测它会不会跳转、跳到哪里,以便提前开始执行后续指令。预测错误时,已经执行的指令要全部作废。这整套机制占据了大量芯片面积,而GPU和TPU通过取消分支(所有线程执行相同指令)来彻底省掉了这部分开销。
5、芯片和大脑的异同
Pope和Dwarkesh讨论了几个对比维度。一个是连接方式:无论是脉动阵列还是SM,芯片里的计算单元之间的连接都遵循规整的网格结构,没有被使用的连接也按固定模式排列,这叫结构化稀疏。大脑完全不同,神经元可以和任意其他神经元建立连接,哪些连接存在、哪些不存在没有规律可循,是完全非结构化的稀疏。另一个是内存和计算的物理位置:脉动阵列把权重存储在计算单元本地,和大脑中突触同时承担存储和计算的设计有相似之处。第三个维度是时钟频率:大脑的"时钟"比芯片慢几个数量级,但大脑不需要batch processing(只有一个"我"在思考),而GPU在GHz时钟下同时处理上千个batch。如果把GPU降到MHz频率只跑一个batch,在能耗特征上就开始接近大脑的工况了。
不过,硅基电路在低频率下并不能获得线性的能效提升。芯片的大部分功耗来自晶体管充放电产生的动态功耗:一个bit从0变到1时给电容充电,从1变到0时把电荷泄放到地。还有一小部分功耗来自绝缘体不够完美造成的漏电流,但占比较小。时钟慢1000倍,切换次数少1000倍,动态功耗降低约1000倍,但能效比(每次运算消耗的能量)并不会改善太多,因为每次切换消耗的能量基本不变。
总结
Pope在黑板上从一个与门画到整颗芯片的架构对比,整条线索可以浓缩成一句话:芯片设计的核心矛盾是计算和通信之间的面积竞争。 从MAC电路内部的全加器vs与门,到寄存器堆的MUX vs ALU,到脉动阵列的本地存储vs外部带宽,到流水线寄存器vs逻辑面积,每一个层级上,设计者都在试图让更多的芯片面积花在"做乘法"而不是"搬数据"上。
MatX公开透露的splittable systolic array设计方向,即"可分割脉动阵列",试图同时获得大阵列的摊薄优势和小阵列的灵活通信。这是一条在GPU和TPU之间寻找第三种平衡点的路径。
核心归纳
Q1: 为什么低精度算力的提升是平方级别而不是线性的?
乘法电路的面积与两个操作数的bit宽度之积成正比。同精度下,把bit宽度减半,面积缩小到四分之一,同样的芯片面积可以塞进4倍的乘法器。Nvidia在B300上首次让FP4:FP8的标称算力比从2倍提升到3倍,更接近理论的4倍上限(剩余差距来自浮点指数位的处理开销)。
Q2: 脉动阵列到底解决了什么问题?
在CUDA core时代,超过七分之八的电路面积花在寄存器堆的读写MUX上,真正做乘法的逻辑只占不到八分之一。脉动阵列把权重矩阵存在计算单元本地寄存器中反复使用,输入和输出向量通过阵列的边缘流入流出。结果是计算量按阵列面积的平方增长,而通信量只按阵列边长线性增长,净赚了一个维度的优势。
Q3: GPU和TPU的架构差异本质上是什么取舍?
GPU是大量微型TPU的集合,每个SM里的脉动阵列小但通信距离短、带宽充足。TPU用少数大型脉动阵列,摊薄寄存器开销更好,但矩阵单元和向量单元之间的数据搬运只能走一两条长距离总线。在SM内部操作时GPU的通信效率极高,一旦跨SM就变贵;TPU则是在大粒度上更高效,但灵活性受限。MatX的"可分割脉动阵列"试图在两者之间找到第三条路。
发布于 新加坡
