AI芯片内部计算原理与架构权衡解析 Best Partners TV 2026-05-31

大家好,这里是最佳拍档,我是大飞。前几天我们做过一期节目,借助 MatX CEO、前谷歌TPU架构师莱纳·波普(Reiner Pope)在Dwarkesh Patel的一期播客,给大家介绍了Token是如何进行定价的。今天我们再来分享最新的一期播客节目,一起跟随莱纳·波普在黑板上的粉笔,来看看AI芯片的内部是如何一步一步计算的。

芯片原语与乘加运算的逻辑基础

莱纳从芯片最底层的原语——逻辑门(Logic Gate: 用于执行基本逻辑运算的硬件基础电路)开始,包括与门(AND)、或门(OR)和非门(NOT),它们通过金属导线连接在一起。我们现在都知道,AI芯片的核心任务是矩阵乘法,而矩阵乘法内部最基本的操作就叫做乘加运算(Multiply-accumulate: 将两数相乘并加到累加器里的基础计算操作)。为什么乘加是天然的原语呢?大家看看这个矩阵乘法的伪代码就明白了,每一步循环都在做乘加。

而且AI芯片还有一个特点,那就是乘法用的是低精度,比如FP4,而累加需要更高的精度,比如FP8,因为误差会在累加过程中累积。莱纳用了一个4比特乘以4比特的例子在黑板上手算了一遍。其中,要产生所有的部分积,就需要p×q个与门,所以4比特乘以4比特就是16个。但是这些与门还只是开胃菜,真正的功夫在求和,求和的工具叫做全加器(Full Adder: 在芯片层面将三个单比特数相加,输出两个比特的电路)。我们一般会认为全加器是加32位数的,但是在芯片层面,它其实只加三个单比特数,也就是输入三个比特,输出两个比特。比如0+1+1=2,但是2的二进制是10,相当于三比特信息压缩成了两比特。换句话说,全加器就是要数一数这一列里有多少个1,然后把它们用二进制表示出来。

莱纳在黑板上演示了一种名为Dadda乘法器(Dadda Multiplier: 一种通过不断从列中取出三个比特输入,输出两个比特,压缩比特网格的算法)的算法。它需要把所有需要加的比特排成网格,然后用全加器不断从每一列取出三个比特,输出两个比特,反复操作,直到最后只剩下一个数。那么,一个4比特乘以4比特的乘加运算,究竟需要多少个全加器呢?答案是p×q个,也就是16个。公式很简单,输入有p×q + (p+q)个比特,输出有p+q个比特,每用一个全加器消灭一个比特,所以需要p×q个。这背后其实揭示了一个关键规律,那就是乘法器的面积和比特位宽是平方关系,所以精度减半,理论上算力应该增加4倍。英伟达B300及之后的芯片规格中,已经开始承认这一点,明确指出FP4的性能是FP8的3倍,当然从理论上来讲应该是4倍。

脉动阵列:解决数据搬运的成本矛盾

真正的震撼在后面。随后,莱纳把视角拉远,在一个传统的CUDA核心或者CPU核心里,乘法器旁边是一个寄存器堆(Register File: 存放运算操作数的存储区域),里面存放着一些操作数。所以,要想进行乘加操作,就需要从寄存器堆里随机读取三个数,送给乘法器,再把结果写回到寄存器堆里。那么该怎么做到随机读取呢?这就要靠一个名为多路选择器(Mux/Multiplexer: 用于在不同寄存器间选择数据流的电路)的电路了。对于一个n路的Mux,假设每个寄存器存p个比特的数据,那么就需要n×p个与门加上(n-1)×p个或门。假设寄存器堆有8个条目,每个4比特,那么读取三个操作数需要3×8×4=96个与门,而乘加器本身只需要p×q=16个与门。显然,光是搬运数据的电路,就是计算电路的好几倍。这还只是最小的寄存器堆,莱纳说,在这个设计里,大约7/8的成本都花在了数据的读写上,只有1/8花在真正的计算上。这就是芯片设计中最核心的矛盾:你关心的计算占的面积其实很小,而你不关心的数据搬运却花了最多的面积。

在Volta架构出现之前,英伟达GPU的CUDA核心就是前面说的这个样子,大部分面积都被数据搬运吃掉了。不过,Tensor Core的出现改变了这一切,而它背后的核心思想就是脉动阵列(Systolic Array: 一种通过将权重固化在硬件中,大幅降低数据搬运需求的矩阵乘法电路)。它是怎么解决数据搬运太贵的问题的呢?思路很巧妙,那就是往上走一层循环。之前我们会把一次乘加固化到硬件里,而现在我们是把一整段矩阵乘法循环固化到硬件里了。这会带来两个关键的优化:第一,让单位数据搬运能做更多的计算;第二,利用矩阵乘法的一个特性,也就是权重矩阵可以长期保持不变。

具体做法是,把权重矩阵直接存储在脉动阵列里面,不来回搬。输入向量从左到右流入,每一列做一次点积,结果从底部流出,然后把权重存在本地寄存器里,这样它可以被反复使用,不需要每次都从寄存器堆重新加载。但是权重矩阵一开始是怎么装进去的呢?答案就是慢慢灌,通过采用菊花链(Daisy Chain: 一种串行加载数据的结构,在此处用于逐周期加载权重矩阵)的方式,一个时钟周期加载一行,总共花y个时钟周期把整个矩阵装好。因为权重会停留很长时间,所以加载慢一点没关系,关键是加载的带宽被控制在了O(x),而不是O(x*y)的复杂度上。其实,芯片设计的每一个层级实际上都是在做同一件事,那就是最大化计算相对于通信的比例。

芯片同步、FPGA与缓存设计的权衡

一块芯片有1000亿个晶体管在同时并行工作,它们该如何同步呢?这就要靠一个全局的时钟信号了,大约每一纳秒一次,让芯片上所有的电路暂停并对齐,然后同时迈出下一步,这就是时钟周期。时钟周期的瓶颈在于两个寄存器之间的逻辑云(Logic Cloud: 两个寄存器之间的组合逻辑部分)延迟。简单来说,如果这段逻辑太复杂,信号在下一次时钟脉冲到来之前来不及稳定,就会出错。因此,芯片设计师会留出一定的富余量,确保在25%的时钟周期内就能完成。如果把逻辑云劈成两半,中间插一个流水线寄存器,时钟频率就能翻倍,但是代价就是存储面积变大了。更棘手的是存在反馈回路的情况,这种回路是所有芯片都会遇到的硬约束,也是决定时钟周期的最终因素。

我们再来说FPGAASIC,他俩其实用的是同一套概念模型,也就是逻辑门加连线,在固定的时钟周期下工作。FPGA适合那些需要确定性延迟、高并行度、但是工作负载经常变化的场景,不过,一旦进入大规模量产,ASIC的单片成本就会远低于FPGA,且实现同样的逻辑功能,FPGA消耗的硅面积是ASIC的大约10倍。那么,FPGA是怎么做到可编程的呢?核心其实在于寄存器、查找表(LUT/Look-Up Table: 存储真值表配置来实现逻辑功能的电路)、以及随处可见的多路选择器。FPGA的编程本质上就是配置所有这些多路选择器的控制位,告诉它应该从哪个邻居取数据。

在CPU层面,莱纳指出,CPU的非确定性延迟最大的来源其实是缓存(Cache: 用于自动记录并加速内存访问的存储系统)。CPU缓存比主存(DDR)快两个数量级,但是数据是否命中缓存取决于CPU的环境,这引入了不确定性。而AI芯片换了一种设计哲学,叫做暂存器(Scratchpad: 一种由软件显式管理数据存放位置的片上存储器,可实现确定性延迟)。它不用硬件自动判断数据在哪,而是给软件两种不同的指令,相当于把数据在哪的决定权从硬件交还给了软件。这也是为什么Groq和TPU可以宣称自己有确定性延迟的原因,因为它们用的是暂存器而不是缓存。

大脑启示与架构总结

如果我们从神经科学的角度来看,人类大脑和芯片有什么区别呢?莱纳的解释是:第一个区别是稀疏性,芯片做结构化稀疏,而大脑是非结构化稀疏;第二个区别是时钟频率,大脑更慢是为了节能,而芯片跑得慢并不一定等效于能效高,因为闲置期间不耗什么电;第三个区别是批次大小,GPU跑推理时的批次可能很高,而大脑只有一个。

最后,莱纳给出了一个令人印象深刻的高度概括:从顶层架构看,GPU就是一堆小的TPU平铺在整个芯片上。具体来说,GPU由很多近乎相同的流式多处理器(SM)组成的,排列成规则的网格;而TPU只有几个粗粒度的矩阵单元(MXU),中间夹着一个向量单元。这两种设计各有取舍,TPU的粗粒度设计让单个脉动阵列更大,更好地摊销了寄存器堆的成本,但数据搬运灵活性稍低;而GPU通过有更多路径,数据搬运的灵活性更高。这就是MatX正在尝试做的事情:既要有GPU那样被SRAM包围的小型脉动阵列的灵活性,又要丢掉SM里为支持CUDA架构而存在的大量占用面积的东西。

芯片就像是一个层层叠叠、处处权衡的世界一样,而所有权衡的核心,始终指向同一个问题,那就是如何让计算跑赢通信。

📌 文中提及的人物和组织

人物: Reiner Pope, Dwarkesh Patel

公司/组织: MatX, Google, NVIDIA

产品/模型: TPU, GPU, B300, Tensor Core, FPGA, ASIC, HBM

关键字: ai-chip-architecture matrix-multiplication data-movement-efficiency hardware-logic