Groq LPU:把调度复杂度前移到编译器¶
Groq LPU(Language Processing Unit)的核心思路不是再造一个带更多线程的 GPU,而是把机器学习图编译成一条空间上已放置、时间上精确到周期的张量流水线:矩阵、向量、数据重排和 SRAM 访问由不同功能切片负责,数据通过片上 Stream Register 在切片之间流动;编译器提前决定每条指令、每次访存和每段通信何时发生。
本页沿用 A100 架构图解 的拆解坐标,依次回答 芯片里有什么、数据怎样流、编译器怎样调度、模型怎样跨芯片展开。理解 LPU 的关键,是不要把 GPU 的 SM、Warp、Cache 和动态调度概念原样套过来。
资料范围与命名
Groq 目前用 LPU 描述其面向低延迟 AI 推理的处理器;公开到具体切片、Lane 和指令队列的资料,主要来自 Groq 在 ISCA 2020 发表的第一代 Tensor Streaming Processor(TSP) 论文。本文把该公开 TSP 微架构作为 LPU 设计思想的可验证实例,而不假定 GroqCloud 中所有现行或后续芯片都逐项保持相同数量。当前产品口径引用 GroqCard 规格时会单独标出。
1. 一张图看懂 LPU¶
下图按 Groq 原始 TSP 图的组织范式重画:横向是按功能分列的 Slice,纵向是 20 个 Tile 行。一条 Superlane 是横跨全部功能列的 16-Lane 横截面;20 条 Superlane 合起来形成最大 320-Lane 向量。ICU 从芯片南侧把指令向北送入各列,操作数和结果则沿 32 条 Eastward 与 32 条 Westward Stream 水平流动。它是二维流处理阵列,不是“几个计算模块围着一块共享 SRAM”的总线式结构。
Groq LPU · 指令向北、数据东西流动的二维阵列
320-Byte Vector
Transpose
Read · Write
Gather · Scatter
5,120 Total
Read · Write
Gather · Scatter
Lane Move
320-Byte Vector
- 外框嵌套:包含关系
- 纵向列:同一功能的 Slice/Tile
- 横向带:一条 16-Lane Superlane
- 向北:静态指令流
- ↔东西方向:Stream 数据流
1.1 三组数字先分清口径¶
| 项目 | 首代 TSP 论文口径 | GroqCard 产品口径 | 如何理解 |
|---|---|---|---|
| 工艺与频率 | 14 nm,标称 900 MHz;论文带宽推导常假设 1 GHz | INT8/FP16 性能按 900 MHz 标注 | 架构数字与产品运行点不是同一列 |
| 片上 SRAM | 88 Slice × 2.5 MiB = 220 MiB | 230 MB on-die SRAM | 220 MiB ≈ 230.7 MB,主要是二进制/十进制单位差异 |
| 存储带宽 | SRAM 阵列推导 55 TiB/s;Stream Register 接口 20 TiB/s(均按 1 GHz) | 最高 80 TB/s on-die memory bandwidth | 接口、单位和条件不同,不能把三者画等号 |
| 峰值计算 | 论文以 1 GHz 说明约 820 TOPS | 最高 750 TOPS INT8、188 TFLOPS FP16 @ 900 MHz | 还要核对数据类型、MAC/OP 计数与实际利用率 |
首代 TSP 的详细数字来自 ISCA 2020 论文 Think Fast,产品数字来自 GroqCard Product Brief。峰值吞吐只说明上限,不代表某个 LLM 一定能持续达到该数值。
2. 功能切片微架构¶
传统多核处理器通常把取指、执行、Cache 和网络接口复制进每个 Core;TSP 则把这些部件按功能拆开,沿芯片的一个维度排成功能切片。这样做形成“局部同构、全芯片异构”的组织:同一切片里的 Tile 执行相同类型指令,不同切片分别负责访存、矩阵、向量或重排。
2.1 20 个 Superlane 怎样组成 320 Lane¶
- 一个 Tile 对 16 个 Lane 做 SIMD 运算,这个跨越各功能切片的 16-Lane 横截面称为一个 Superlane。
- 同一功能切片由 20 个 Tile 纵向组成,因此最小向量长度
minVL = 16,最大向量长度maxVL = 20 × 16 = 320。 - 一条最大向量指令并非瞬间广播给 320 个 Lane:它从最南端 Tile 开始,随后逐周期向北传播,20 个 Superlane 的指令与数据因此呈错位流水。
- 数据主要沿东西方向在功能切片之间传播,跨 Lane 的南北移动则由 SXM 完成。换言之,指令流与数据流沿不同轴移动,并在正确的时间和位置相遇。
这不是 GPU 的 Warp。Warp 是动态驻留在 SM 上的一组线程状态;Superlane/Lane 是固定的 SIMD 数据通路,编译器直接选择向量长度、切片和执行周期。
2.2 主要切片与接口各做什么¶
| 功能切片 | 主要任务 | 架构意义 |
|---|---|---|
| ICU | Ifetch、NOP/Repeat、Sync/Notify;维护 144 条独立指令队列 | 用静态指令流和已知延迟代替复杂的动态发射与仲裁 |
| MEM | Read/Write、Gather/Scatter;88 个 Slice、每 Slice 两个 Bank | SRAM 地址、Slice 和 Bank 对编译器可见,可显式安排并发 |
| MXM | 安装权重、接收激活、矩阵乘加与 INT32/FP32 累加 | 四个 320×320 MACC Plane 承担 GEMM/Conv 主计算 |
| VXM | 加减乘、类型转换、ReLU、tanh、exp、rsqrt 等 | 每 Lane 可访问 16 个 32-bit Vector ALU,适合激活、归一化与量化链 |
| SXM | Shift、Permute、Distribute、Rotate、16×16 Transpose | 让重排成为显式全带宽功能,而不是隐含在 Load/Store 或 Cache 行为里 |
| C2C / PCIe | 在 LPU 间发送/接收 320-Byte Vector;Host DMA 与启动 | 把同一 Stream 模型延伸到多芯片,并保持软件规划的通信时序 |
公开图是功能级微架构
论文公开了切片、队列、Lane、SRAM Bank、主要指令和吞吐口径,但没有公开现行 LPU 的完整 RTL、所有流水级或 GroqCloud 部署拓扑。本文据此解释可验证的架构机制,不把厂商的“传送带”比喻进一步臆测成固定的物理连线图。
2.3 计算链为何可以不落回 SRAM¶
Stream 是架构可见的片上寄存器通路。一个切片消费输入 Stream,执行功能,再把结果写到输出 Stream;下游切片可以直接消费结果。编译器因此可把多个操作连成 Producer–Consumer 链:
flowchart LR
MEM0["MEM<br/>Read activation / weight"] -->|"Stream S0/S1"| MXM["MXM<br/>MatMul + Accumulate"]
MXM -->|"INT32/FP result stream"| VXM1["VXM<br/>Scale / Bias"]
VXM1 -->|"intermediate stays on stream"| VXM2["VXM<br/>Activation / Quantize"]
VXM2 -->|"result stream"| MEM1["MEM<br/>Write only if reuse requires it"]
SXM["SXM<br/>reshape / permute"] -. "按布局需要插入" .-> MXM 例如 Read → MXM → Requantize → ReLU → Write 可以让 MXM 结果直接经过多级 VXM ALU,省掉中间张量的一次 SRAM Write 和后续 Read。优势来自显式流水与数据流局部性,不是“计算完全不需要存储”;跨层复用、容量压力或依赖关系仍可能要求写回 SRAM。
3. 确定性执行与存储系统¶
3.1 编译器在二维时空里排程¶
TSP ISA 向编译器暴露功能延迟 d_func 和指令—操作数错位 d_skew。编译器同时追踪:
- 指令在哪个功能切片、哪条队列上执行;
- 数据此刻位于哪条 Stream Register、朝哪个方向传播;
- 指令结果何时产生,以及到下游切片还需多少传输周期;
- 哪个 SRAM Slice/Bank 在该周期可读写;
- 多芯片时,哪个 C2C Link 在哪个时隙承载哪条 Stream。
flowchart TB
GRAPH["Framework / Tensor Graph"] --> LOWER["Graph Lowering<br/>把高阶 Tensor 化为硬件支持的算子与二维布局"]
LOWER --> PLACE["Spatial Placement<br/>选择 MEM Slice、MXM/VXM/SXM 与 LPU 分片"]
PLACE --> TIME["Cycle Schedule<br/>安排依赖、传播延迟、NOP 与通信时隙"]
TIME --> CODE["Per-slice Instruction Streams<br/>程序文本 + SRAM 初始布局"]
CODE --> RUN["Deterministic Execution<br/>相同输入形状下按同一时空计划运行"] 运行时不需要 Warp Scheduler 持续寻找“哪个线程已就绪”,也没有 Cache Miss 后由硬件临时改变顺序的控制路径。代价是编译器必须预先知道形状、延迟和资源冲突;动态图、未覆盖算子或变化很大的 Shape 会增加编译、分桶或回退成本。
3.2 片上 SRAM 不是 Cache¶
首代 TSP 的 88 个 MEM Slice 形成一个分区全局地址空间(PGAS)。每个 Slice 有两个 Bank,若访问不冲突,编译器最多可以利用 176 路 Bank 并发。它与 Cache 的区别是:
| 问题 | GPU Cache/HBM 路径 | LPU MEM/SRAM 路径 |
|---|---|---|
| 数据是否驻留 | 硬件按访问和替换策略决定 Cache Line | 编译器决定张量落在哪个 Slice/Bank |
| Miss 怎么办 | 运行时向下级 Cache/HBM 请求,延迟可变 | 程序只访问已显式放置的数据,没有隐式 Cache Fill |
| 并发冲突 | 由硬件队列、仲裁器与 Cache 控制器处理 | 编译器预先避免 Bank、Stream 和切片冲突 |
| 容量边界 | 单卡通常有数十 GB HBM | 单芯片仅约 230 MB SRAM,大模型必须跨芯片分片 |
| 优势 | 容量大、通用、动态行为适应性强 | 带宽高、延迟可预测、数据移动可精确编排 |
“只有 SRAM”不表示一个 LPU 能装下整个大模型。Groq 的多芯片方案把各芯片 SRAM 组织成逻辑共享、物理分布的全局存储,模型参数和流水阶段分散在多个 LPU 上;芯片间只传递计划中需要的权重、激活或中间结果。该机制由 ISCA 2022 多 TSP 系统论文 详细描述。
3.3 “确定性”不等于端到端永远无抖动¶
确定性主要覆盖已编译程序在 LPU 计算与软件控制网络中的执行。Host 调度、PCIe 重传、网络请求排队、Tokenizer 和共享云服务仍可能引入端到端变化。Groq 的 BERT 论文就观察到 Host–TSP 的 PCIe 传输是测量中少量抖动的来源。因此评价时应分别观察:
- 芯片内 Kernel/程序的周期数;
- 多芯片模型流水的稳态延迟与吞吐;
- API 侧 TTFT(Time to First Token)、TPOT(Time per Output Token)和并发排队;
- Tokenizer、采样、网络等非 LPU 时间。
4. 贯通示例:batch=1 W8A8 线性层如何在 LPU 上执行¶
为了和 A100 页的示例直接对照,这里冻结同一个热点算子:Llama 类 Decoder 在生成一个 Token 时,计算一个 K=N=4096 的 W8A8 线性层。首代 TSP 的真实生产编译器和现行 GroqCloud 二进制不是公开接口,因此下面给出的是由公开 ISA 与 MXM 数据通路支持的教学映射,不是闭源编译产物的反汇编。
4.1 先固定计算、数据类型与规模¶
设输入 Activation 和 Weight 都做对称量化:
q_x[4096]:当前 Token 的 INT8 Activation,附带一个 FP32 Scales_x;q_W[4096,4096]:离线量化的 INT8 Weight,按输出通道保存 FP32s_W[4096];z[4096]:MXM 的 INT32 Accumulator;y[4096]:本例写成 FP16;如果下游仍走 W8A8,也可以在 VXM 中 Requantize 成 INT8 Stream。
| 数据 | 元素数 | 容量 | 执行时的角色 |
|---|---|---|---|
q_W | 16,777,216 × INT8 | 16 MiB | 常驻片上 SRAM,按 MXM Weight Tile 流出 |
q_x | 4,096 × INT8 | 4 KiB | 切成最多 320-Element Vector,送给四个 MXM Plane |
z | 4,096 × INT32 | 16 KiB | 沿 K 维累加 13 个部分和 |
s_W | 4,096 × FP32 | 16 KiB | VXM Epilogue 的逐输出 Scale |
y | 4,096 × FP16 | 8 KiB | 写回 MEM 或直接送入下游 Stream |
仅这一层约占 16.04 MiB,能放进首代 TSP 的 220 MiB SRAM;这不表示完整 Llama 模型也能放进单芯片。程序文本、其他层权重、Activation 和运行时 Buffer 仍会占用 SRAM,完整模型通常需要跨 LPU 分片。
4.2 编译器怎样把 4096×4096 拆给四个 MXM Plane¶
一个 MXM Plane 可安装一个最多 320×320 的 INT8 Weight Tile。由于 4096 = 12×320 + 256:
- K 维拆成 13 段:12 个 320-Element Full Tile + 1 个 256-Element Residual Tile;
- N 维也拆成 13 段:每段产生最多 320 个输出;
- 四个 MXM Plane 可并行负责四个 N Tile,也就是同一 K 段最多同时推进 1,280 个输出;
- 13 个 N Tile 因而分为
4 + 4 + 4 + 1四组,最后一组只有一个 256-Output Residual Tile。
flowchart LR
subgraph MEM["MEM-W / MEM-E · 88 SRAM Slices"]
W0["Weight Tiles<br/>最多 4 × 320×320 INT8"]
A0["Activation K-Tile<br/>320 或 256 INT8"]
S0["sₓ + per-output s_W"]
end
W0 -->|"LW → IW"| MXM["MXM Plane 0..3<br/>四个 N Tile 并行"]
A0 -->|"Read → Stream → ABC"| MXM
MXM -->|"ACC · 重复 13 个 K Tile"| ACC["4 × ≤320 INT32<br/>Output Accumulators"]
ACC -->|"INT32 uses 4 aligned Streams"| VXM["VXM ALU Chain<br/>cast → ×sₓ → ×s_W → FP16/INT8"]
S0 --> VXM
VXM --> OUT["MEM Write / Downstream Stream<br/>最多 1,280 Outputs"] 下面的伪代码表达编译器要生成的调度关系,不是 Groq 汇编语法:
for n_group in [0..3]: # 每组最多占四个 MXM Plane
clear_int32_accumulators()
for k_tile in [0..12]: # 12×320 + 1×256
vl = 320 if k_tile < 12 else 256
MEM: Read q_x[k_tile] -> activation_stream(vl)
MEM: Read q_W[n_group, k_tile] -> weight_streams
MXM: LW -> IW # Load / Install Weight Tile
MXM: ABC activation_stream # Activation Buffer Control
MXM: ACC int8_dot_product # 累加到 INT32
VXM: cast(acc) * s_x * s_W -> fp16
MEM: Write y[n_group] # 或直接交给下游切片
实际编译器还会把 Weight Layout、MEM Bank、Stream 编号、传播方向和 LW/IW 与前一 Pass 的执行重叠起来。公开 BERT 论文明确说明:当 GEMM 需要多次 MXM Pass 时,可在第 i-1 次执行期间装载第 i 次权重,从而减少 Plane 等待时间。
4.3 Tensor 操作怎样落到 Slice 指令¶
| 线性层步骤 | 公开 TSP 指令/机制 | 功能切片 | 编译器必须决定什么 |
|---|---|---|---|
| 读取 Activation | Read address, stream | MEM-W/E | q_x 位于哪个 Slice/Bank、Stream 向东还是向西 |
| 预取 Weight | LW(Load Weights) | MXM + MEM | 哪些 Weight Tile 进入每个 Plane 的 Weight Buffer |
| 安装 Weight | IW(Install Weights) | MXM | 何时把最多四组 320×320 Weight 安装到四个 Plane |
| 接收 Activation | ABC(Activation Buffer Control) | MXM | Activation Vector 在哪个周期到达 MXM 入口 |
| 沿 K 累加 | ACC | MXM | 13 个 K Tile 的先后、INT32/FP32 Accumulator 生命周期 |
| 反量化/Epilogue | Type Convert、Multiply 等 ALU 链 | VXM | INT32 占四条对齐 Stream;Scale 和结果如何路由 |
| 必要的布局变化 | Shift、Permute、Distribute、Transpose | SXM | 纯线性层可通过预打包 Weight 减少 SXM;Attention 重排则显式使用 |
| 保存或继续融合 | Write address, stream 或 Producer–Consumer Chain | MEM / 下游 Slice | 中间结果是否值得写回 SRAM,还是直接被下一操作消费 |
| 维持时序 | Ifetch、NOP/Repeat、Sync/Notify | ICU | 每条独立队列的发射周期与 Stream 的相遇位置 |
Stream 的基本 Lane 宽度是 1 Byte:一个 320-Lane INT8 Vector 占 320 Byte;FP16 需要两条自然对齐的 Stream,INT32/FP32 需要四条。VXM 接收 z 时,编译器因此不仅要追踪“哪个张量”,还要追踪四条 Stream 的编号、对齐和到达周期。
4.4 从装载到写回:一次线性层的执行时间线¶
一个 Token 的 4096×4096 Linear 怎样穿过 MEM → MXM → VXM
q_x + sₓHost 只负责装载、输入输出与启动;周期内不逐项调度 MXM 或 MEM。LW → IW 安装四个 Weight Tile一个 Full Group 最多含 409,600 个 INT8 Weight;下一 Pass 的装载可与当前 Pass 的执行重叠。q_x Vector 沿 Stream 到达 MXMABC 在编译器指定周期接收 Activation;同一 K Tile 被送给承担不同 N Tile 的 Plane。ACC 维持最多 320 个 INT32 部分和。FP16(z × sₓ × s_W);若下游继续 W8A8,可融合 Requantize,避免先写 FP16 再读回。y[4096];是否进 MEM 由下游依赖和生命周期决定。冻结其中一个 N Group,可以看到 Producer–Consumer 关系:
sequenceDiagram
participant MEM as MEM Slices / Banks
participant MXM as MXM Plane 0..3
participant VXM as VXM ALU Chain
participant OUT as MEM or Next Slice
Note over MEM,OUT: 编译器已知每个 d_func、d_skew 与 Stream 传播距离
loop k_tile = 0..12
MEM->>MXM: Read q_x + LW/IW Weight Tile
Note over MEM,MXM: 第 i+1 次 Weight Load 可与第 i 次执行重叠
MXM->>MXM: ABC → INT8 Dot Product → ACC
end
MXM->>VXM: 4 × ≤320 INT32 Output Streams
VXM->>VXM: Cast → ×sₓ → ×s_W → FP16 / INT8
VXM->>OUT: Write,或直接交给下游 Consumer 图中箭头表示数据依赖,不表示所有数据先完整落盘再进入下一步。真实执行时,一批结果一旦在正确 Stream 上出现,下游 VXM Tile 就可在编译器算好的周期开始消费。
4.5 把分块数字代回首代 TSP¶
- K、N 两个维度各有 13 个 Tile 位置,共
13 × 13 = 169个 MXM Plane-Tile 工作项;边缘 Tile 的有效宽度是 256。 - 四个 MXM Plane 并行承担 N Tile,因此教学调度需要
13 × ceil(13/4) = 52个“四 Plane Group”;每个 K Tile 的最后一组只有一个 N Tile 有效。 - 一个 Full Weight Group 为
4 × 320 × 320 = 409,600 Byte。ISCA 2020 论文给出的口径是:MEM 可在不到 40 周期内读取并把约 400K Weight 安装到四个 Plane,已包含 SRAM 与片上网络传输延迟;这不是完整 4096×4096 层的总周期数。 - 有用计算量仍是
4096 × 4096 = 16,777,216 MAC。TSP 的 Vector Length 能以 16 为步长从 16 配到 320,边缘 256 恰好是 16 的整数倍,因此不必像 A100 页的m16n16k16、M=1教学 Kernel 那样强制补出 15 行无效 Activation;MXM 正是面向“一个 Activation Vector × 一块 Weight Matrix → 一个 Output Vector”的数据流。 - Weight 已在片上 SRAM,并不表示不再移动。严格 batch=1、无跨请求复用时,每个 Token 仍需从 MEM 向 MXM 提供约 16 MiB Weight,只是这条高带宽、确定性路径不经过片外 HBM。Continuous Batching 或多请求流水可改变 Weight Tile 的复用策略。
q_x只有 4 KiB,Weight 才是主要数据量。编译器要让四个 Plane 同时工作,同时还要避免 MEM Bank、Stream 和 VXM Epilogue 成为瓶颈;750 TOPS 峰值不能直接换算成本例延迟。
4.6 扩展到 Attention:MXM、SXM、VXM 怎样重叠¶
线性层说明了单个 GEMM 的微观映射;Groq 的 Answer Fast 论文 则公开了完整 BERT-base 子图的流水。论文固定 batch=1、sequence length=128、hidden size=768、12 heads、head dimension=64、FFN=3072,Weight 使用 INT8,并给出以下功能分工:
| Transformer 操作 | LPU 功能切片 | 公开实现中的关键流水方式 |
|---|---|---|
| Q、K、V Projection | MXM | 将各 Head 的 Weight 拼接成较大 GEMM;多 Plane 并行,下一 Pass Weight 与当前 Pass 重叠装载 |
| Head Reshape / Reorder | SXM | 数据流经 SXM 时完成重排和 Mask,避免先完整转置到 SRAM |
QKᵀ Batched GEMM | MXM | SXM 一产出首批 Reordered Vector 即可开始,不等全部 Reorder 完成 |
| Softmax | VXM | 用多条 ALU Chain 实现多 Pass 的 Max/Exp/Sum/Scale,并保存可复用中间量 |
Attention × V | MXM | 与 Softmax 的尾部及独立的 V Projection 交叠安排 |
| Residual + LayerNorm | VXM + MEM | 三个 Pass;公开实现建立四条并行 ALU Chain,每 Pass 最多产出四个 Vector/周期 |
flowchart LR
X["INT8 Input X"] --> Q["MXM · GEMM Q"]
X --> K["MXM · GEMM K"]
X --> V["MXM · GEMM V<br/>independent branch"]
Q --> RQ["SXM · Reorder Q"]
K --> RK["SXM · Reorder K"]
RQ --> QK["MXM · Batched QKᵀ"]
RK --> QK
QK --> SM["VXM Chains · Softmax"]
SM --> AV["MXM · Attention × V"]
V --> AV
AV --> LN["VXM · Residual / LayerNorm / Requantize"]
LN --> NEXT["MEM or Next Layer Stream"] 关键不是把上图的七个方框依次启动,而是让不同切片在同一逻辑时间处理不同批次的 Vector:SXM 仍在重排后部数据时,MXM 已可消费前部数据;Softmax 看到第一条 QKᵀ 结果后即可启动,最后一段 Softmax 又与不依赖它的 V Projection 重叠。这样既隐藏非 GEMM 延迟,也减少必须完整写入 SRAM 的中间 Tensor。
教学线性层与现行 LLM 实现的边界
4.1–4.5 使用公开首代 TSP 的 MXM/ISA 推导一个可复核的 W8A8 映射;4.6 则复述 Groq 已发表的 BERT 实现。它们不是 GroqCloud 某个闭源 Llama 编译产物的反汇编。KV Cache 的具体分片、量化格式、投机解码和服务批处理策略会随模型与平台版本变化,不能从首代芯片框图唯一推出。
4.7 用一条因果链复述 LPU 执行¶
编译器把 16 MiB Weight 条带化到 88 个 MEM Slice/Bank → 将 4096 维 K/N 各拆成 12×320+256 → 每个 N Group 把最多四个 Weight Tile 交给四个 MXM Plane → ICU 让 MEM Read、LW/IW 与 Activation Stream 在精确周期相遇 → ABC 接收 320/256-Element
q_x→ MXM 沿 13 个 K Tile 做 INT8 Dot Product 并 ACC 到 INT32 → 四个 Plane 的结果通过四条对齐 Stream 进入 VXM → VXM 完成 Cast、×sₓ×s_W与 FP16/INT8 转换 → 结果写回 MEM 或直接进入下游切片 → 四个 N Group 完成后得到y[4096]。
如果能把这条链与 A100 页的 Block → Warp → Shared → WMMA → Tensor Core → Epilogue 对照复述,就能看出两者的真正差别:A100 由运行时调度大量 Warp,LPU 则由编译器预先安排功能切片、SRAM、Stream 与周期。
5. 多 LPU:把芯片内 Stream 延伸成系统流水线¶
当模型超过单芯片约 230 MB SRAM 时,编译器把参数、算子和通信共同分片。每个 TSP/LPU 既是计算端点,也能参与软件规划的数据转发;链路路由和发送时刻在编译期确定,以减少运行时争用带来的尾延迟。
sequenceDiagram
participant H as Host
participant L0 as LPU 0 / Stage A
participant L1 as LPU 1 / Stage B
participant L2 as LPU 2 / Stage C
H->>L0: 输入与启动
Note over L0,L2: 编译器已确定 SRAM 布局、链路路由与每个周期的发送/接收
L0->>L1: 中间 Vector Stream
L1->>L2: 中间 Vector Stream
L2-->>H: 输出
Note over L0,L2: 下一份输入可在前一份仍位于后级时进入流水线 这种“装配线”同时利用模型并行和流水并行:单请求延迟取决于穿过所有阶段的时间,稳态吞吐则取决于最慢阶段和流水间隔。只有各阶段负载、SRAM 容量和链路时隙都平衡时,增加 LPU 才能接近线性扩展;静态调度不会自动消除不均衡和通信成本。
6. 与 A100 放在同一坐标系比较¶
| 维度 | NVIDIA A100 | Groq LPU / 公开首代 TSP |
|---|---|---|
| 计算组织 | 108 个 SM;Warp 在 SM 内动态发射到 CUDA/Tensor 等管线 | 单一大型功能切片处理器;MEM/MXM/VXM/SXM 各自执行静态指令流 |
| 并行抽象 | Grid → Block → Warp → Thread | Tensor → Stream → 16–320 Lane Vector |
| 调度位置 | 编译器生成指令,硬件在运行时处理驻留、依赖、Cache Miss 和发射 | 编译器决定切片、周期、数据位置与链路时隙,硬件按计划执行 |
| 主要矩阵单元 | 每 SM 4 个第三代 Tensor Core | 4 个 320×320 MXM Plane(首代公开实现) |
| 存储 | 寄存器 + L1/Shared + 40 MB L2 + 40/80 GB HBM | 约 230 MB on-die SRAM;无传统硬件 Cache 层次 |
| 数据移动 | Load/Store、Cache、Shared Memory、Crossbar/NoC | 显式 MEM Read/Write + 架构可见 Stream + SXM 重排 |
| 适合的优势区间 | 通用并行、训练/推理、动态图与成熟 CUDA 生态 | 已支持模型的低 Batch、低尾延迟推理与可预测流水 |
| 主要约束 | 分支发散、访存与 Kernel 调优、动态争用 | 单芯片容量小、编译与算子覆盖要求高、静态 Shape/资源规划复杂 |
二者不是简单的“同一芯片把 HBM 换成 SRAM”。LPU 用更小的本地容量和更重的编译责任,换取可预测数据移动和深流水;A100 保留动态硬件机制与大容量外存,换取更强的通用性和运行时适应能力。比较 Token/s 时还必须固定模型、精度、上下文长度、Batch、并发和是否包含网络/Tokenizer,不能只比较峰值 TOPS。
7. 校验问题¶
为什么 4096×4096 线性层有 169 个 Tile 工作项,却只有 52 个四 Plane 调度组?
K 与 N 都拆成 13 段,所以逻辑上有 13×13=169 个 K/N Tile 组合。四个 INT8 MXM Plane 可同时承担四个 N Tile,因此每个 K Tile 只需 ceil(13/4)=4 个 N Group;13 个 K Tile 合计 52 个 Group。最后一个 N Group 只有一个 Residual Tile 有效。
为什么本例不像 A100 教学 WMMA 那样需要补出 15 行无效 Activation?
MXM 的自然数据流是“最多 320-Element Activation Vector × 320×320 Weight → Output Vector”,本来就面向 batch=1 的向量—矩阵工作。TSP 的 Vector Length 还能按 16-Element 步长缩放,所以末尾 256 维可作为 Residual Vector;A100 示例则为了调用 m16n16k16 WMMA,把逻辑 M=1 映射进固定 M=16 的 API Tile。
为什么说 LPU 是软件定义,而不只是静态 VLIW?
两者都把部分调度前移到编译期,但 TSP 还把 Stream 的空间位置、传播方向、功能切片延迟、SRAM Bank 和多芯片链路时隙暴露给编译器。编译器求解的是跨计算、存储和网络的二维时空计划,而不只是把若干 ALU 操作打包进一条宽指令。
220 MiB 与 230 MB 是否说明两代芯片容量不同?
仅凭这两个数字不能这样判断。220 MiB × 2^20 ≈ 230.7 MB × 10^6,二者几乎是同一容量用不同单位表示。是否存在实现差异还需要额外的 SKU 或芯片资料。
既然没有 Cache,权重从哪里来?
编译器在执行前把权重和程序显式放进片上 SRAM;MXM 再从 Stream 安装所需权重。大模型的参数分散在多个 LPU 的 SRAM 中,并通过预先规划的芯片间 Stream 连接各阶段。
确定性为何适合自回归 LLM?
Decode 阶段通常 Batch 较小且每个新 Token 串行依赖前一个 Token,尾延迟和稳定的 TPOT 很重要。静态流水可以减少 Cache Miss、动态仲裁和 Kernel 边界造成的变化;但实际 API 延迟仍受排队、网络、采样和模型实现影响。
参考资料¶
- Groq / IEEE:Think Fast: A Tensor Streaming Processor for Accelerating Deep Learning Workloads(ISCA 2020)
- Groq / ACM:A Software-defined Tensor Streaming Multiprocessor for Large-scale Machine Learning(ISCA 2022)
- Groq:GroqCard Accelerator Product Brief
- Groq:The Groq LPU Explained
- Groq:Answer Fast: Accelerating BERT on the Tensor Streaming Processor