想象你站在一家超级快递分拣中心的二层走廊上。楼下是几万个分拣工位,每个工位前都有一排小抽屉——里面预先塞好了该片区最常见的快递单号对应的货架号。一件包裹从传送带入口滑下来,经过第1个工位时,工人瞄一眼面单,不用查电脑,直接按手边那张固定的小抄,秒速把包裹推向对应滑槽;包裹继续往前滚,滚到第2个工位,这个工位的小抄写的是“根据包裹上的数字和上一个工位传来的结果做一次累加”,于是工人又快速加了一笔再传给第3个工位……整条流水线上,成千上万个包裹像心跳一样同步前进,每个工位只做一件极简单的事,但整条线每秒钟完成的“面单匹配+累加”次数却高达千万亿次。 这,就是TPU(张量处理器)里那颗神秘引擎——MXU(矩阵乘单元)的真实工作画面。今天,我们就走进这座“矩阵乘法超级分拣厂”,看看它是如何用2.56万个规规矩矩的工位(PE),把让其他芯片头疼的矩阵乘法,变成一条永不堵塞的传送带流水线的。

岗位关联

对AI从业者而言,理解MXU是理解AI芯片性能上限的钥匙——无论是估算大模型推理成本、设计高效算子,还是和硬件团队高效沟通,你都需要知道“做乘法这件事”,芯片内部到底是怎么干的。

目录
  1. 可视化演示
  2. 矩阵乘法之重
  3. 脉动阵列大阅兵
  4. 权重钉在工位上
  5. 数据流动模式
  6. 硬件运算链
  7. 利用率与演进
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示256x256 PE脉动阵列数据流、数据复用模式及MXU与GPU张量核架构性能对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

PE阵列架构 256x256 PE阵列脉动计算矩阵乘 激活从顶部流入权重从左侧流入 部分和沿对角线累加输出结果

矩阵乘法之重

你可能会问:为什么一座快递分拣中心,非得专门建一个巨型车间来处理“包裹面单匹配”这件事?因为在AI的世界里,“矩阵乘法”就是那个无处不在的包裹面单匹配。神经网络里的每个神经元,做的本质工作就是“把一堆输入数字各自乘上一个权重,再全部加起来”。几十亿个神经元堆在一起,你算一算,一次推理要做多少次乘加?答案是几十亿次起步,训练时更是要来回算上几万亿次。可以说,AI计算的九成以上,都是在做矩阵乘法这件事。

传统计算机面对这种海量乘法时,会撞上一堵墙——“内存墙”。冯·诺依曼结构里,计算单元和内存是分开的,CPU得先把数据从内存里“搬”到计算单元,算完再“搬”回去。搬数据的速度,远跟不上算数据的速度。就像快递分拣中心如果只有一个人,他需要反复跑到仓库深处去翻找面单对照表,那他一天也分拣不了几个包裹。

MXU的破局思路是“空间换时间”。既然搬数据慢,那就把要用的数据一次性摊开,摆在一个巨大的工位阵上,让数据在工位之间像流水一样自己流动起来。谷歌的第一代TPU里,MXU直接配了256×256个PE(处理单元)工位,也就是65536个工人同时开工。这相当于把原来只有一条传送带的小作坊,升级成了2.56万个工位同步运转的超级工厂。

回到我们的比喻:矩阵乘法如此重要,就像面单匹配是分拣中心的灵魂。MXU的存在,就是把这个灵魂动作极致地工厂化——让每一件包裹经过每个工位时,工人只需做一个简单动作,剩下的交给流水线本身。

AI 算力需求≈矩阵乘法运算量∝参数量×数据量\text{AI 算力需求} \approx \text{矩阵乘法运算量} \propto \text{参数量} \times \text{数据量}
公式含义:AI 模型的算力需求几乎完全由矩阵乘法的规模决定。参数量越大、处理的数据越多,矩阵乘法的运算量就越大,对硬件并行计算能力的要求也就越高。
  1. 算力需求AI 模型每跑一次,需要完成的浮点运算总次数,通常以万亿次(TOPS)为单位衡量。
    AI 算力需求\text{AI 算力需求}
  2. 矩阵乘法运算量神经网络的前向传播和反向传播,最终都归结为大量矩阵乘法,后者是前者的主体。
    矩阵乘法运算量\text{矩阵乘法运算量}
  3. 参数量模型里所有权重系数的个数,参数越多,每次推理要做的乘法就越多。
    参数量\text{参数量}
  4. 数据量模型一次处理多少条输入(比如一次看多少张图片),数据量越大,公式重复执行的次数就越多。
    数据量\text{数据量}

脉动阵列大阅兵

现在让我们走进MXU的核心——脉动阵列。想象你站在一个巨大的厂房里,2.56万名工人(PE)站成一个方方正正的棋盘,每人面前一台像计算器一样的小机器。有趣的是,每个工人不需要看任何屏幕或操作台,他们只需要做两个动作:把收到的两个数字乘起来,再加到自己本子上记的那个数上。就这么简单。工人之间没有复杂的电话线,只靠一条条短短的滑槽(寄存器直连)把包裹递给左边、右边或前方的邻居。

这就是“脉动阵列”名字的由来——数据不是乱哄哄地各自乱跑,而是像血管里的血液一样,随着心脏(时钟)的每一次跳动,整齐地向前涌动一格。每个时钟周期,每个PE完成一次“乘法+累加”(MAC操作),然后把结果传给下一个PE。这里的“下一次”,不是随机任务,而是精心安排的流水线接力。

流水线的妙处在于“时间上重叠”。第一个数据刚走完第一列,第二个数据就已经开始进入第一列了。就像包裹流水线上,第一个包裹还在第3个工位时,第100个包裹已经滑进了第1个工位。这样一来,2.56万个PE几乎每个周期都在满负荷运转,而不是像传统架构那样,大部分时间都在“等待下一个数据”。

脉动阵列的威力,不在单个工人有多快,而在“阵列”本身——2.56万个工人步调一致地重复简单动作,汇成一股每秒千万亿次的算力洪流。这就是它和普通处理器的本质区别:后者是少数几个全能冠军轮流上阵,前者是2.56万个专才永不疲倦地同步开火。

每个 PE 每周期→1 次乘法+1 次累加=1 MAC\text{每个 PE 每周期} \to 1 \text{ 次乘法} + 1 \text{ 次累加} = 1 \text{ MAC}
公式含义:脉动阵列的基本动作单元是MAC(乘累加),即一次乘法和一次加法。MXU 的性能指标“每秒万亿次操作”(TOPS),本质上就是2.56万个PE同时做MAC的累计速率。
  1. 每个 PE阵列中的一个处理单元,就是一个“工人”,包含一个乘法器、一个加法器和若干寄存器。
    PE\text{PE}
  2. 每周期一个时钟周期,可以理解为一次“心跳”,全阵列同步前进一格。
    周期\text{周期}
  3. 乘法 + 累加PE 的核心动作,把输入数据乘以权重,再加到之前的中间结果上。
    乘法+累加\text{乘法} + \text{累加}
  4. MACMultiply-Accumulate 的缩写,即“乘累加”,是AI芯片的基本工作量单位。
    1 MAC1 \text{ MAC}

权重钉在工位上

快递分拣中心有一个巧妙的设计:每个工位的小抽屉里,预先塞好了一张“面单对照表”——这不是谁临时塞的,而是开工前,整个厂房的管理系统根据今天要处理的包裹批次,统一给每个工位配好的。工人们开工后,只需要低头看一眼抽屉里那张固定不变的小抄,不需要去仓库翻任何手册。这张小抄,在MXU的世界里,就是“权重”。

为什么要这样做?因为在一个计算批次中,权重矩阵会被反复使用。如果用传统方式,每个PE每做一次乘法,都要跑到内存里去取一次对应的权重值,那2.56万个工位就是2.56万个同时冲向仓库的快递员,仓库的吞吐能力瞬间被挤爆。这就是“内存墙”的具体体现。MXU的做法是:先把整个权重矩阵一次性载入每个PE的寄存器阵列——每个PE的寄存器里,稳稳地存着它负责的那一个权重值。

于是,在推理过程中,权重“纹丝不动”,而输入数据(激活值)像传送带上的包裹一样,一列一列地流经每个工位。每流经一个工位,就完成一次“当前权重×当前输入”的乘法。这样,同一份权重被反复使用了成千上万次,而取权重的次数,被压缩到了最小——只在最开始装载一次。这就是“权重固定”数据复用的精髓。

“权重钉在工位上”这个设计,把最费时的数据搬运工作压缩到了极致。试想,如果每个包裹都要工人跑到仓库核对一次面单,那分拣中心早就瘫痪了。正因为小抄就在手边,工人们才能以每秒数十亿次的速度,行云流水地完成分拣——MXU 也正是靠这个绝招,在 2015 年就以远超同代 GPU 的能效,惊艳了整个 AI 界。

数据复用率=总 MAC 次数从内存取数的次数=O(N2N)=O(N)\text{数据复用率} = \frac{\text{总 MAC 次数}}{\text{从内存取数的次数}} = O(\frac{N^2}{N}) = O(N)
公式含义:MXU 通过权重固定让每次取数都“物超所值”。传统架构每做一次乘法可能就要取一次权重,而MXU一次取权重可以参与 N 次乘法(N 为阵列规模),数据复用率达到 O(N) 量级。
  1. 总 MAC 次数整个计算过程中,阵列完成的乘法累加总数,等于 N×N 个 PE 各自算 N 次。
    总 MAC 次数=N3\text{总 MAC 次数} = N^3
  2. 取数次数从内存加载数据(权重或输入)的次数,权重固定后,权重只加载 N×N 次。
    取数次数=O(N2)\text{取数次数} = O(N^2)
  3. 数据复用率一次取数能被多少操作共享,是衡量芯片内存效率的关键指标。
    数据复用率=N3N2=N\text{数据复用率} = \frac{N^3}{N^2} = N

数据流动模式

权重视为“推不动”的固定工位,那数据呢?数据是“流动”的。在 MXU 的脉动阵列里,输入数据(激活值)不是一次性广播给所有PE,而是沿着行方向,一个周期一个周期地“接力推进”。每个PE从左侧邻居那里接过数据,用它做一次乘法累加,然后在下个周期把它传给右侧邻居。就像快递流水线上,包裹不会瞬间瞬移到最后一站,而是跟着传送带一格一格地走——但正因为每格都有工人处理,整条线并没有“等待”的时间。

数据流动的深层妙处,是“半成品”也沿着对角线方向自然传播。假设我们要计算 C = A×B,C 矩阵里每个元素是 A 的一行和 B 的一列的点积。在脉动阵列中,A 的各个元素沿行方向流动,B 的各个元素沿列方向流动,它们在每个 PE 处“相逢”,相乘后累加,累加的结果(部分和)被 PE 保留下来,等待和下一个到达的元素继续累加。最终,当最后一批数据流过之后,每个 PE 的累加器里,就静静躺着结果矩阵的一个元素。

为了让这幕配合完美,所有数据必须步调一致,这就是“脉动”的含义。整个阵列由全局时钟统一控制:每个周期,每个PE同时完成“接收左邻居的数据→乘上自己寄存器里的权重→加到累加器→把数据传给右邻居”。不允许谁快一步,也不允许谁慢一步。这种严格的同步,让数据流动像训练有素的仪仗队,整齐划一。

在数据流动的世界里,不存在“把数据从远处取来”的概念——数据永远来自身边的邻居,而结果永远积攒在自己的本子上。这种“让数据动起来,而不是让工人跑起来”的哲学,正是脉动阵列对冯·诺依曼结构最优雅的反叛。

Cij=∑k=1KAik×WkjC_{ij} = \sum_{k=1}^{K} A_{ik} \times W_{kj}
公式含义:结果是矩阵乘法的基本运算。每个输出元素,都是A矩阵第 i 行所有元素与权重矩阵第 j 列所有元素逐个相乘再累加得到的。脉动阵列就是把这个“逐个相乘再累加”的过程,用空间上的流水线并行加速。
  1. C_ij结果矩阵第 i 行第 j 列的元素,即第 i 个输出神经元的值。
    CijC_{ij}
  2. 求和符号从 k=1 到 K 累加,K是输入特征的数量,也是内层循环的次数。
    ∑k=1K\sum_{k=1}^{K}
  3. A_ik第 i 个输入样本的第 k 个特征值,沿行方向在阵列中流动。
    AikA_{ik}
  4. W_kj第 k 个输入特征到第 j 个输出神经元的权重,预先存放在 PE 中。
    WkjW_{kj}

硬件运算链

现在我们把镜头拉近,看看单个PE的内部构造。每个PE,本质上是一台微型计算站,里面有三个核心部件:一个乘法器(负责把两个数相乘)、一个加法器(把乘法和之前的累加值相加)、以及一组寄存器(负责暂存数据)。它们排成一条微型流水线:数据从左边的邻居进来,乘法器立刻把它和寄存器里的权重相乘,乘积送入加法器,与累加器里的旧值相加,新值存回累加器——一个周期内完成全部动作。

为了让这套流水线高速运转,MXU 在物理设计上做了两个关键决策。第一,寄存器直接嵌在PE旁边,数据从上一个PE传过来不需要经过复杂的总线,直接通过窄而短的导线“手递手”传递,延迟极低。第二,整个阵列由统一时钟驱动,所有PE的“心跳”完全同步,避免了异步设计带来的协调开销。正是这种高度规整的物理布局,让 2.56 万个PE可以在单个芯片上愉快地并肩作战,而不会因为布线问题互相打架。

MXU 的规模通常表达为 256×256——即 256 行、256 列,共 65536 个PE。这个数字不是随意定的,它和 TPU 的片上存储(SRAM)容量、内存带宽之间是精心匹配的。每个时钟周期,MXU 可以从左边的缓冲器取 256 个激活值,从下方的缓冲器取 256 个权重,完成 65536 次乘法累加。如果主频是 700MHz,那么峰值算力就是 65536×2×700M ≈ 92 TOPS——这里的"×2"是因为一次 MAC 算一次乘法和一次加法,共两次浮点操作。

回忆快递分拣中心:每个工人(PE)的工位都配有一台固定的小计算器(乘法器+加法器)和一本流水账本(累加器)。2.56万个工人,人人手边有账本,每秒钟计算器同步按下 7 亿次,整座工厂的吞吐量自然惊人。MXU 的全部秘密,就是把这套极其简单的工位,乘以 2.56 万份,再用时钟完美地同步起来。

峰值算力=PE 数量×2×主频\text{峰值算力} = \text{PE 数量} \times 2 \times \text{主频}
公式含义:MXU 的峰值吞吐率由三个因素决定:PE 数量决定并行度,2 表示一次 MAC 算两次浮点操作,主频决定每秒跳多少次“心跳”。
  1. PE 数量阵列规模,256×256=65536 个处理单元。
    PE 数量=256×256\text{PE 数量} = 256 \times 256
  2. 乘以 2一次乘累加包含一次乘法和一次加法,算两个浮点操作(FLOPS)。
    ×2\times 2
  3. 主频时钟每秒跳动的次数,如 700MHz = 每秒 7 亿次心跳。
    主频=700MHz\text{主频} = 700\text{MHz}

利用率与演进

脉动阵列如此强大,但它并非“银弹”。MXU 有个挥之不去的烦恼:形状匹配。脉动阵列就像一个固定尺寸的棋盘——256×256,只能高效处理 256×256 的矩阵乘法。如果输入矩阵的某一维不是 256 的整数倍,就会出现“部分工位空转”的现象。比如要算一个 100×100 的矩阵乘法,会有超过 80% 的工位闲着。这就像分拣中心有 2.56 万个工位,但今天只来了 100 件包裹,绝大多数工人只能干瞪眼。

另一个瓶颈是数据搬运开销。权重固定解决了权重重复取用的问题,但输入数据(激活值)依然是“流”进来的——它必须先被从内存搬到芯片上的缓冲器里,才能喂给阵列。如果阵列算得太快,而数据供给跟不上,MXU 就会“等米下锅”,利用率大幅下降。谷歌的解决方案之一是“批处理”:一次喂一批数据进来,让权重被更多数据复用,摊薄单个数据的搬运成本。批处理越大,复用率越高,利用率越好——这也是为什么 TPU 特别适合大 batch 的推理和训练场景。

MXU 自身的演进也印证着这些思考。TPU v1(2015)是推理专用,MXU 搭载 256×256 阵列和 28MB 片上存储;TPU v2/v3 走向训练,MXU 改为“脉动阵列+向量单元”双引擎,并引入“数据流”(数据沿列方向流动)模式;TPU v4 则把超级计算机的互联拓扑融入 MXU 集群,让 4096 块芯片协同工作。每一代的宿敌没变——都是那堵“内存墙”,每一代的破局思路也没变——继续提高数据复用,减少搬运。

回顾全文,MXU 就是一座把“做乘法”这件事极致工厂化的超级分拣中心。它的聪明之处不是让单个工人变快,而是用权重固定、数据流动、脉动同步这三大设计,让 2.56 万个工人像一个人一样高效协同。理解 MXU,你就拿到了理解 TPU 乃至整个 AI 芯片设计哲学的金钥匙。

MXU 利用率=实际完成 MAC 次数峰值 MAC 次数=计算时间计算时间+空转时间\text{MXU 利用率} = \frac{\text{实际完成 MAC 次数}}{\text{峰值 MAC 次数}} = \frac{\text{计算时间}}{\text{计算时间} + \text{空转时间}}
公式含义:MXU 利用率等于实际算力除以理论峰值算力。当矩阵形状与阵列规模匹配、数据供给充足时,利用率接近 100%;形状不匹配或数据断供时,利用率显著下降。
  1. 实际完成真正做有用的 MAC 操作的次数,排除了空转周期。
    实际完成 MAC\text{实际完成 MAC}
  2. 峰值 MAC所有 PE 全速运转时理论上能完成的 MAC 次数。
    峰值 MAC\text{峰值 MAC}
  3. 计算时间阵列真正在做乘累加的时间。
    计算时间\text{计算时间}
  4. 空转时间数据没跟上、或者形状不匹配导致 PE 闲等的时间。
    空转时间\text{空转时间}

AI 应用场景

大模型推理加速的“硬核底座”

阶段:模型推理与部署优化

解决的问题:大语言模型(LLM)生成一个 token 要做一次巨大的矩阵乘法(如 4096×4096 乘以 4096×1),如果使用传统 GPU,取权重本身就占掉大量时间。MXU 的权重固定设计,让权重一次性载入后反复被每个 token 复用,显著降低数据搬运开销。

具体案例:Google 将 TPU v4 用于训练和部署其 PaLM 大模型。因为 LLM 的参数量高达数千亿,推理时每个 token 都要和全部参数做矩阵乘。TPU 的 MXU 阵列让权重常驻在 PE 寄存器中,激活值像传送带一样流过整个矩阵,吞吐量远超同代 GPU。

批量图像识别的“流水线工厂”

阶段:数据预处理与批量推理

解决的问题:当 AI 需要同时处理成千上万张图片(如 OCR 识别发票、人脸识别打卡),传统的 CPU/GPU 逐张处理会浪费宝贵的权重加载开销。MXU 偏好大 batch——一次喂入 256 张图片,让已被加载的权重矩阵被 256 个输入反复复用,摊薄每次搬运成本。

具体案例:Google 图片搜索背后的视觉模型,在 TPU 上对海量图片进行批量特征提取。每张图经过卷积层时,卷积核权重(等效为矩阵)被固定在 MXU 中,256 张图的特征图按行流入阵列,实现接近 100% 的阵列利用率。

边缘设备能效优化的“设计蓝图”

阶段:AI 芯片选型与能效评估

解决的问题:在选择端侧 AI 芯片时,传统的 “看 TOPS” 会误导——真正重要的是“数据复用率”。MXU 的脉动阵列设计理念,启发了大量边缘 NPU 的架构设计,让它们在做矩阵乘时减少对外部 DRAM 的依赖。

具体案例:华为昇腾、寒武纪等 AI 芯片在设计时都借鉴了脉动阵列思想——把权重预存进 PE,数据以流水方式推进。NPU 跑 MobileNet 这类轻量模型时,能效比(FPS/W)远高于 GPU,正是因为照搬了 MXU 的“权重固定”哲学。

Python 演示

python81 行
import numpy as np class PESystolicArray:    """模拟一个 NxN 的脉动阵列,权重固定模式。"""     def __init__(self, n, weight_matrix):        self.n = n        # 每个 PE 存放一个权重值        self.weights = np.array(weight_matrix, dtype=np.float32)        # 每个 PE 的累加器清零        self.accumulators = np.zeros((n, n), dtype=np.float32)     def run(self, a_matrix):        """a_matrix 形状为 (n, n),按行流入阵列。"""        a = np.array(a_matrix, dtype=np.float32)        # 初始化累加器        self.accumulators.fill(0.0)         for t in range(2 * self.n - 1):            for i in range(self.n):                j = t - i                if 0 <= j < self.n:                    # PE(i, j) 从左方接收 a[i][j] 并乘上权重                    self.accumulators[i][j] += a[i][j] * self.weights[i][j]        return self.accumulators.copy()  class MXUEmulator:    """MXU 仿真器:分批处理大矩阵乘法。"""     def __init__(self, array_size=4):        self.array_size = array_size        self.total_mac = 0        self.idle_cycles = 0     def multiply(self, a, b):        """计算 A (m x k) 与 B (k x n) 的乘积,使用 2D 分块。"""        m, k = a.shape        k2, n = b.shape        assert k == k2        c = np.zeros((m, n), dtype=np.float32)        s = self.array_size         for i0 in range(0, m, s):            for j0 in range(0, n, s):                for k0 in range(0, k, s):                    a_block = a[i0:i0+s, k0:k0+s]                    b_block = b[k0:k0+s, j0:j0+s]                    if a_block.shape[0] < s:                        a_block = np.pad(a_block, ((0, s - a_block.shape[0]), (0, 0)))                    if a_block.shape[1] < s:                        a_block = np.pad(a_block, ((0, 0), (0, s - a_block.shape[1])))                    if b_block.shape[0] < s:                        b_block = np.pad(b_block, ((0, s - b_block.shape[0]), (0, 0)))                    if b_block.shape[1] < s:                        b_block = np.pad(b_block, ((0, 0), (0, s - b_block.shape[1])))                    pe_array = PESystolicArray(s, b_block.T)                    partial = pe_array.run(a_block)                    c[i0:i0+s, j0:j0+s] += partial[:min(s, m-i0), :min(s, n-j0)]                    self.total_mac += s * s * s        return c  def main():    m, n, k = 8, 6, 7    rng = np.random.default_rng(42)    a = rng.normal(size=(m, k))    b = rng.normal(size=(k, n))     emulator = MXUEmulator(array_size=4)    c_mxu = emulator.multiply(a, b)    c_np = a @ b     print("MXU 仿真结果:\n", c_mxu)    print("NumPy 参考结果:\n", c_np)    print("最大误差:", np.max(np.abs(c_mxu - c_np)))    print("总 MAC 次数:", emulator.total_mac)  if __name__ == "__main__":    main()
目的:通过分块模拟脉动阵列的权重固定与数据流动方式,验证 MXU 计算矩阵乘法的原理,并与 NumPy 结果对比确认正确性。
  1. class PESystolicArray定义单个脉动阵列块,内部用二维数组模拟 PE 网格。
  2. self.weights = np.array(...)把权重矩阵“钉”在每个 PE 的寄存器中,对应权重固定设计。
  3. for t in range(2 * self.n - 1)模拟脉动时序:数据沿对角线逐拍流入,共需 2n-1 个周期。
  4. self.accumulators[i][j] += a[i][j] * self.weights[i][j]每个 PE 完成一次乘累加,对应 MAC 操作。
  5. class MXUEmulator外层仿真器,处理任意形状矩阵的分块计算。
  6. for i0 in range(0, m, s)按 4x4 块遍历大矩阵,把大矩阵乘法拆成多个小方块,让每个块都适配脉动阵列尺寸。
  7. np.pad当矩阵边缘不足 4x4 时补零,模拟真实硬件中“形状不匹配导致的部分空转”。
  8. self.total_mac += s * s * s统计完成的总乘累加次数,用于评估硬件利用率。

常见误区

误区既然 TPU 的 MXU 算力这么高(几百 TOPS),那我随便什么模型丢上去都能享受这个算力,比 GPU 快好几倍。

正解MXU 只对“大规模规则矩阵乘法”高效。对于稀疏模型(大量零元素)、小矩阵、动态 shape 的模型,脉动阵列的形状匹配问题会导致大量 PE 空转,实际算力可能连峰值的 10% 都不到。就像 2.56 万个工人的分拣中心,如果今天只有 100 件包裹,效率远不如一个小作坊。MXU 是“专才”,不是“通才”。

为何常见:硬件厂商宣传时习惯用峰值 TOPS 做营销,而峰值是在“完美形状+完美数据供给”下测出来的,实际场景很难达到。

误区MXU 把权重固定在 PE 里,训练时每个 step 权重都要更新,那它是不是只能做推理,不能做训练?

正解权重固定是“在一个计算批次内固定”,不是“永远固定”。训练时每个 step 算完梯度后,权重会更新,然后把新权重重新载入 PE。TPU v2/v3 之所以能训练,是因为每次迭代都重新装载更新后的权重。这就像分拣中心每来一批新货,工人们就换一张新面单对照表——换表也需要时间,这也是为什么训练比推理更容易触碰数据供给瓶颈。

为何常见:把“固定”理解成了“静态”,忽略了时间维度上“批内固定、批间更新”的动态过程。

误区MXU 里数据自己会流动,那我写 Python 代码时什么都不用管,编译器会搞定一切布局。

正解脉动阵列的数据流动时序需要精心编排。同一个矩阵乘法,数据从哪个方向流入、权重放在哪个 PE、分块大小怎么选,直接影响性能和正确性。AI 编译器(如 XLA)要对计算图做大量“布局优化”,才能把高层算子映射到 MXU 的物理结构上。数据流动的“指挥”是编译器的核心工作之一,不是自动发生的。

为何常见:高层框架(PyTorch/TensorFlow)隐藏了硬件细节,让人误以为“自动微分+自动并行”就万事大吉,忽略了中间还有一层艰巨的编译器映射工作。

误区MXU 有 256×256=65536 个 PE,那我做一个 512×512 的 MXU,算力直接翻四倍,肯定更强。

正解PE 变多意味着同一周期要喂入更多数据,对片上 Buffer 容量、内存带宽、供电散热都提出更高要求。如果带宽跟不上,阵列越大,饿死(数据断供空转)的 PE 越多,利用率反而下降。TPU v1 选 256×256 是带宽、面积、功耗三者权衡的结果,而不是单纯追求 PE 数。就像分拣中心不可能无限扩编工人——传送带只有那么宽,人多了反而互相挡路。

为何常见:线性外推思维——“规模翻倍性能翻倍”只在资源无约束时成立,真实系统的短板约束才是决定上限的因素。

误区谷歌的 TPU 有 MXU,NVIDIA 的 GPU 没有,所以 MXU 一定全面碾压 GPU,AI 计算以后都用 TPU 了。

正解两者是不同设计哲学。MXU(脉动阵列)擅长规则的矩阵乘法,但灵活性差;GPU(SIMT 架构)拥有几千个通用核心和强大编程生态,能处理各种不规则计算(如稀疏注意力、动态控制流)。在矩阵乘法密集、网络结构规整的任务上 TPU 能效更高;在灵活多变的前沿模型上,GPU 的通用性依然不可替代。真实场景中,Google 内部也同时使用 GPU 和 TPU。

为何常见:非黑即白的二元对立思维,忽略了“专才 vs 通才”的分工互补关系。

面试题

Q1. MXU 中 PE 的核心运算操作是什么?

单选题 · mid

  • A.向量点积和归一化
  • B.乘法累加(MAC)← 正确答案
  • C.矩阵转置和求逆
  • D.数据搬移和缓存

答案:B。MXU 的每个 PE 就是一个微型计算站,核心动作是“乘上权重再加到累加器”,即 MAC(乘法累加)。向量点积是多个 MAC 的组合,矩阵转置是数据整理操作,搬移缓存是数据通路的工作,都不是 PE 的核心运算。

Q2. 第一代 TPU 中 MXU 的阵列规模是?

单选题 · easy

  • A.128×128
  • B.192×192
  • C.256×256← 正确答案
  • D.512×512

答案:C。TPU v1 的 MXU 采用 256×256 的脉动阵列,共 65536 个 PE。这个数字是带宽、片上存储和功耗折中的结果。128×128 是缩水版,512×512 远超当时带宽供给能力,192×192 并非标准选择。

Q3. “权重固定”数据复用策略的核心收益是什么?

单选题 · mid

  • A.减少权重从内存重复加载← 正确答案
  • B.提高每个 PE 的时钟频率
  • C.让权重数值保持不更新
  • D.降低激活值的数据精度

答案:A。权重固定把权重预加载进 PE 寄存器,一个批次的推理中反复使用,避免了每个 MAC 都去内存取权重,大幅降低数据搬运。它不改变时钟频率,也不意味着权重永远不更新(训练时仍会重新装载),更与激活值精度无关。

Q4. 脉动阵列名称的由来是什么?

单选题 · easy

  • A.数据像心跳一样同步流动← 正确答案
  • B.电压像脉搏一样波动
  • C.计算速度时快时慢
  • D.散热系统周期性启动

答案:A。“脉动”借喻血液循环——数据在全局时钟驱动下,以固定节奏在 PE 间逐拍传递,像心跳驱动的血流。MXU 的计算是严格同步的,不会时快时慢,与电压和散热无关。

Q5. 以下哪些属于 MXU 的设计特点?

多选题 · mid

  • A.PE 间通过寄存器直连← 正确答案
  • B.每个 PE 都含乘法器和加法器← 正确答案
  • C.使用全局时钟同步所有 PE← 正确答案
  • D.每个 PE 拥有独立的大容量缓存

答案:ABC。MXU 的关键设计是 PE 寄存器直连、乘加器一体、时钟全局同步。选项 D 错误——MXU 的 PE 只有小容量寄存器,没有独立大缓存,数据主要依靠邻居间流动,这正是它节省面积和功耗的原因。

Q6. MXU 在计算 100×100 的小矩阵时利用率低,主要原因是?

单选题 · mid

  • A.PE 的乘法器功耗过高
  • B.矩阵形状与 256×256 阵列不匹配← 正确答案
  • C.权重固定策略失效
  • D.数据精度不够高

答案:B。MXU 是 256×256 的固定棋盘,100×100 的矩阵放入后,约 85% 的 PE 处于空转状态,利用率急剧下降。这就像 2.56 万工位的分拣中心只来了几百件包裹。这不涉及功耗、精度或权重固定失效。

Q7. TPU v2/v3 相比 v1 的重要改进包括哪些?

多选题 · hard

  • A.从推理扩展到训练场景← 正确答案
  • B.引入向量单元配合 MXU← 正确答案
  • C.支持数据流(Data Flow)模式← 正确答案
  • D.彻底取消脉动阵列架构

答案:ABC。v2/v3 从推理芯片扩展到训练,结构上增加向量单元处理非矩阵运算,同时改进数据流模式支持训练时频繁的权重更新。但脉动阵列依然是 MXU 的核心,D 说“彻底取消”完全错误。

Q8. MXU 的峰值算力公式中 "×2" 代表什么?

单选题 · mid

  • A.一次 MAC 算乘法和加法两次操作← 正确答案
  • B.两个 MXU 同时工作
  • C.数据双向流动
  • D.权重和激活各占一半

答案:A。一次 MAC(乘累加)= 1 次乘法 + 1 次加法 = 2 次浮点操作(FLOPS),所以算力公式里要 ×2。它不是指双引擎或双向流动,而是对 FLOPS 定义的正确理解。

Q9. 编译器在将算子映射到 MXU 时,最重要的优化目标是?

单选题 · hard

  • A.最大化数据复用、最小化数据搬运← 正确答案
  • B.让每个 PE 的寄存器更省电
  • C.提高 Python 代码的可读性
  • D.增加权重矩阵的稀疏度

答案:A。MXU 的性能瓶颈是数据供给而非计算本身,编译器(如 XLA)的核心工作是做布局优化——选择合适的分块、决定数据流向,让已加载进阵列的数据被最大化复用,减少对内存的访问。寄存器功耗、代码可读性、稀疏度都不是编译器优化 MXU 映射的目标。

Q10. 关于 MXU 的“脉动阵列”与 GPU 的"SIMT"架构,正确的说法是?

多选题 · easy

  • A.脉动阵列擅长规则矩阵乘法← 正确答案
  • B.SIMT 架构灵活性更高← 正确答案
  • C.两者在数据复用策略上思路不同← 正确答案
  • D.脉动阵列已被 GPU 全面淘汰

答案:ABC。MXU 脉动阵列用空间换时间,擅长规则矩阵乘;GPU 的 SIMT 用海量通用线程处理不规则任务,灵活性更高;两者最大差异正是“数据复用 vs 通用并行”的策略选择。D 错误——脉动阵列至今仍是 AI 芯片的重要架构。