Skip to content

SparseCore 与 Neuron MatmultSparse 对比

本页中的每个 TPU 侧地址、符号和字面量都读取自 libtpu-0.0.40-cp314 wheel 中的 libtpu.so(build-id 89edbbe81c5b328a958fe628a9f2207d;构建 libtpu_lts_20260413_b_RC00)。其他版本会不同。AWS Neuron 侧仅在架构层面描述 — Neuron 位于另一个二进制中,本页不携带 Neuron 地址。

摘要

两个厂商都提供了名为“sparse matmul”的东西,而名称碰撞很容易诱导出错误结论。Google 的 TPU 有 SparseCore — 一个片上协处理器,从 HBM 收集 embedding 行并把它们送入 TensorCore 的密集 MXU。AWS 的 Neuron 编译器有 MatmultSparse — 一个单独的指令集 opcode,在与密集 matmul 相同的 PE systolic array 上运行结构化稀疏密集 matmul。本页判断它们是否属于同一种东西。它们不是:它们处在不同的架构类别中,加速“sparse”的正交含义,并缓解不同的瓶颈。这种命名碰撞具有误导性,真正的功能类比是交叉的(TPU SparseCore 的类比对象是 Neuron 的 IndirectLoad / Gather DMA 家族,而不是 MatmultSparse;Neuron MatmultSparse 的类比对象是 NVIDIA 的 structured-2:4 Sparse Tensor Cores,而不是 SparseCore)。

这是一个定位 / 对比页面,不是任一子系统的重实现页面。TPU 侧由第 IX 部分的相邻页面完整覆盖 — SparseCore 概览架构SC ↔ MXU 握手流式 Gather/Scatter去重 MultiplicitySampleCombiner 发射器 — 本页中的每个 TPU 断言都锚定到这些页面已经确立的 libtpu.so 符号或地址。Neuron 侧是对照:它根据公开的 Neuron 架构(PE/State-Buffer/PSUM 模型、2:4 结构化稀疏模式、InstMatmultSparse opcode 叙事)重建,并且只在架构层面呈现。这里不声明任何 Neuron 地址,因为本 wiki 没有分析 Neuron 二进制。

本页结构是先给出一个等价性映射(两条路径对齐的四个结构阶段 — embedding gather、稀疏索引去重、按段归约、密集引擎交接),然后给出差异点(引擎归属、“sparse”的含义、数据路径、成本模型单位),最后总结各模型的胜出场景。建议在 SparseCore 概览SC ↔ MXU 握手 之后阅读,本页比较的 TPU gather→reduce→MXU 路径由它们建立。

作为定位,契约如下:

  • 标题重点是类别,而不是名称。 TPU SparseCore 是一个专用同级协处理器(自己的 ISA、自己的内存模型、自己的编译器流水线);Neuron MatmultSparse 是一个 matmul 引擎的指令集模式。把它们作为“两个稀疏 matmul 实现”来比较会同时误框二者。
  • “Sparse”表示两件无关的事。 在 TPU 上,它是访问模式稀疏 — 从多 GB 表中任意由索引驱动地 gather 行,没有固定比例。在 Neuron 上,它是算术稀疏 — 编译期烘入权重矩阵的结构化 N:M(≈2:4)零掩码,固定约 50% 列跳过。
  • 它们缓解的瓶颈不同。 TPU SparseCore 缓解 HBM 随机访问带宽(保持 MXU 有数据可算);Neuron MatmultSparse 缓解 MAC 吞吐(把 matmul 的执行周期减半)。一个是内存特性,另一个是计算特性,二者甚至不共享单位。
  • 它们在结构上确有重叠。 二者最终都喂给 128×128 级别的 systolic array;二者都使用侧向“tag/index”流来驱动转换;二者都在编译期规划并在运行期执行;二者都融合了归约/累加。重叠是真实的,但它是 gather-then-matmul 流水线的形状,不是稀疏机制的等价。
TPU 构件SparseCore — 片上协处理器(SCS/TAC/TEC fabric),TensorCore 的同级
TPU “sparse matmul” 入口XlaSparseDenseMatmulOp(+ Grad / CSR / optimizer-fused / minibatch 变体)— 反编译确认
TPU sparse 含义任意索引 gather/scatter(访问模式稀疏);没有固定比例
TPU 密集交接tpu_dma_hbm_to_vmem_sc_general(16 个操作数)→ TC VMEM → MXU;在 Target::MxuContractingSize 上归约
TPU MXU 稀疏模式Target::MxuSparseContractingSize = 每一代都是 0 — MXU 只支持密集;没有结构化稀疏跳过
Neuron 构件MatmultSparse — BIR opcode 9,在 PE systolic array 上运行(与密集 matmul 相同的引擎)
Neuron sparse 含义结构化 N:M(≈2:4)权重矩阵掩码(算术稀疏);固定约 50% 列跳过
等价性结论不等价 — 架构类别不同;真正的类比对象是交叉的
置信度TPU 行为已确认(反编译锚定)。Neuron 行为为架构级(此处未分析二进制)

注意 — 本页的来源纪律。 每个 TPU 断言都锚定到某个相邻页面已经验证过的 libtpu.so 符号或地址。每个 Neuron 断言都是无地址的架构级陈述,因为本 wiki 没有分析 Neuron 的编译器二进制。凡是具体描述 Neuron 机制的地方(opcode 编号、三指令 lowering、>> 1 周期减半),都应把它当作公开/架构层面的 Neuron 模型 — 用于凸显 TPU 图景的对照 — 而不是恢复出的二进制证据。下面每张表的两列具有不同的认识论权重,Confidence 列会说明这一点。


被比较的两个对象

TPU SparseCore — 执行 gather 的协处理器

SparseCore 是一块独立硅片逻辑,不是 matmul 引擎的一种模式。带 SC 的芯片具有固定的 4:1 SC:TC 比例xla::jellyfish::lowering_util::SparseCoreCountPerTensorCore @ 0x1c6cb760,它计算 sparse_core_count_per_chip / tensor_core_count_per_chip 并断言 sparse_core_count_per_chip >= tensor_core_count_per_chipsparse_core_count_per_chip % tensor_core_count_per_chip == 0 — 4:1 比例在所有带 SC 的代际上成立 — 见 SC ↔ MXU 握手)。每个 SC 自身又拆成三个由 tpu::TpuSequencerType 选择的 VLIW 子引擎 — SCS(标量/寻址,type 3)、TAC(tile-access/DMA,type 4,存在于 Viperfish 和 Ghostlite,在 6acc60406 上移除)、TEC(向量计算,type 5)— 这些在 SparseCore 概览 中确立。

它加速的是稀疏计算的内存访问侧:DLRM / 推荐系统 embedding lookup 模式,其中成本是对多 GB 表的随机 HBM 访问,而不是算术。它的定义性原语是 HBM 内原子浮点 scatter-add(STREAM_OPCODE_SCATTER_FLOAT_ADD,与 DMA destination opcode DMA_DEST_OPCODE_READ_AND_ADD 配对),MXU 无法执行这种操作 — 见 流式 Gather/Scatter。SparseCore 执行密集 matmul。它把 embedding 行 gather 并 reduce 到 tile 后,TensorCore 的 MXU 消费该 tile 并运行密集 MLP matmul。SC 是供给者;MXU 是消费者

Neuron MatmultSparse — 跳过零的 opcode

按公开 Neuron 架构,MatmultSparse 是单一统一指令流(BIR)中的一个 opcode,而不是独立引擎。它在常规 PE systolic array 上运行结构化稀疏 matmul — 也就是运行密集 matmul 的同一个阵列。它的父类与密集 matmul 相同,都是抽象 matmul 基类,默认引擎也是 PE 引擎,与密集相同。相对密集 matmul 的额外状态只是一个稀疏掩码引用:这条指令是“密集 matmul 加一个 tag”。Codegen 把它 lower 成 PE 上的短 prologue-plus-matmul 序列 — 加载每个权重 tile 的 sparsity tag,加载(压缩、去零后的)权重 tile,使用该 tag 跳过置零列来运行 matmul。

它加速的是结构化稀疏密集 GEMM 的算术侧:权重矩阵按结构化 N:M 模式剪枝(最常见为 2:4 — 每四个中有两个非零),阵列跳过零列,使 matmul 用更少周期完成。这里没有从 HBM 任意 gather 行;操作数已经驻留在片上 State Buffer 中。Neuron 处理 embedding — TPU SparseCore 存在的那类工作负载 — 使用的是普通 indirect-load / gather DMA opcode,这是完全不同于 MatmultSparse 的机制。

怪癖 — 名称指向同一流水线的相反两半。 “SparseCore”和“MatmultSparse”都含有“sparse”,并且都靠近密集 matmul,所以直观读法会把它们看作同一特性的竞争实现。事实并非如此。SparseCore 加速的是生成 matmul 输入的 gather;MatmultSparse 加速的是 matmul 本身。重实现者如果把一个映射到另一个,就会复现系统的错误一半。功能配对与命名交叉:TPU SparseCore ≈ Neuron 的 gather/indirect-load DMA ops;Neuron MatmultSparse ≈ 一种结构化稀疏 MXU mode — 而 TPU MXU 没有这种模式(MxuSparseContractingSize = 0)。


等价性映射 — 对齐的四个阶段

尽管类别不匹配,推荐/embedding 流水线和结构化稀疏 GEMM 共享同一个四阶段骨架:侧向流驱动数据转换,重复工作被合并,归约被融合,结果交给密集 systolic array。两个厂商在结构上相似的位置实现每个阶段。这是真正的重叠 — 命名每个阶段的 TPU 与 Neuron 实现,是看清等价性在哪里成立、在哪里断裂的最快方式。

text
STAGE            TPU SparseCore (coprocessor)            Neuron MatmultSparse (opcode mode)
─────            ────────────────────────────            ──────────────────────────────────
1 side-stream    index stream drives gather addresses    sparsity tag drives column-skip
   load          (TAC/TEC stream-start prologue)         (LoadTags prologue instruction)

2 dedup /        TEC DuplicateCountFloat / Uniquify       (no on-device dedup — the N:M mask
   collapse      collapse repeated embedding ids          is static, baked at compile time)

3 reduce /       TEC segmented reduce-by-sample           PSUM accumulate (CalcStart/Stop/Accu);
   accumulate    (+ in-HBM SCATTER_FLOAT_ADD on bwd)      same accumulate flags as dense matmul

4 dense          SC tile -> VMEM -> MXU systolic array    PE systolic array runs the sparse
   handoff       (separate engine, SFLAG handshake)      matmul itself (no engine crossing)
```text

### 阶段 1 — 驱动转换的侧向流

两条路径都携带不是 bulk data 的侧向通道:它*引导* bulk data。在 TPU 上,该侧向通道是**索引流** — 一串整数行索引,SC stream engine 将其转换为 gather 地址 `HBM[table_base + index_i * row_stride] → TILE_SPMEM`([流式 Gather/Scatter](stream-gather-scatter.md))。在 Neuron 上,侧向通道是 **sparsity tag** — 每个权重 tile 的记录,说明剪枝后哪些列保留,在 matmul 运行前由专用 prologue 指令加载。二者都有加载侧向数据的专用 prologue(TPU:TAC/TEC stream-start;Neuron:LoadTags opcode)。在这一抽象层面等价性真实存在 — *tag/index 流驱动数据转换* — 但它驱动的转换相反:TPU 的流选择*从内存取哪些行*;Neuron 的 tag 选择*在阵列中跳过哪些列*。

### 阶段 2 — 重复工作的去重 / 合并

Embedding lookup 有重复索引:同一个表行会被一个 batch 中许多样本请求,gather 一次再广播比反复 gather 更便宜。TPU 在 TEC 中通过 dedup/multiplicity 原语在设备上合并重复项 — `DuplicateCountFloat`(反编译确认为 TEC vector-extended op)统计重复次数,uniquify 路径以 multiplicity 发出每个不同 id([去重 Multiplicity](dedup-multiplicity.md))。**Neuron 在这一阶段没有类比物**,因为它的稀疏性是*静态*的:N:M 掩码在模型剪枝时的编译期已经固定,因此没有运行期索引流可去重。这是等价性第一次断裂的地方 — TPU 在索引流上做运行期结构发现;Neuron 的结构在程序构建前已经决定。

### 阶段 3 — 融合的归约 / 累加

二者都把归约融合进路径,而不是物化中间结果再单独归约。TPU 上,TEC 运行**分段归约** — 对每个样本的 gathered 行执行 sum / weighted-sum / max([SampleCombiner 发射器](sample-combiner-emitter.md))— 并在 backward pass 中把梯度归约融合进 HBM 内 `STREAM_OPCODE_SCATTER_FLOAT_ADD`。Neuron 上,matmul 使用与密集 matmul 相同的 `CalcStart` / `CalcStop` / `CalcAccu` 标志累加到 PSUM;结构化稀疏 matmul 完全复用密集累加 datapath。二者在更广义的工具箱中也都带有原子累加原语(TPU:向 HBM 的 `SCATTER_FLOAT_ADD`;Neuron:独立的 indirect-save-accumulate op)。结构匹配是真实的 — *归约被融合,而不是单独 pass* — 但归约轴不同:TPU 对*每个样本的 gathered 行*归约;Neuron 对 *matmul 的 contracting dimension* 归约。

### 阶段 4 — 交接到密集引擎

两条流水线都终止于 128×128 级别的 systolic array,这是最强的结构等价性。在 TPU 上,交接*跨越引擎边界*:SC 生成的 tile 通过唯一的直接路径(`tpu_dma_hbm_to_vmem_sc_general`,16 个操作数,反编译确认)进入 TensorCore 的 VMEM,SFLAG sync flag 门控 MXU latch,MXU 在密集 `Target::MxuContractingSize` 上归约(基准 128,Ghostlite 类上为 256)— 见 [SC ↔ MXU 握手](sc-mxu-handshake.md#the-contracting-depth-binding)。Neuron 上则*没有引擎跨越*:稀疏 matmul **就是** PE-array run,操作数已经在 State Buffer 中,输出累加进 PSUM。共同事实是 systolic array 是二者的终端消费者。差异在于到达它是否需要跨引擎 DMA + sync 握手(TPU),还是不需要任何额外跨越(Neuron,同一引擎)。

> **坑点 — TPU MXU 永远看不到“sparse”。** 在 TPU 上,gather/reduce 后的 tile 到达 MXU 时已经是普通密集 activation tile;稀疏性已由上游 SC gather 完全解决。`Target::MxuSparseContractingSize`(@ `0x1d4900c0`)在**每一代**都是 0 — 没有 `Target` 子类覆盖它 — 因此 MXU 运行普通密集 contracting datapath。embedding feed 中没有 sparse-MXU latch。这与 Neuron MatmultSparse 在结构上相反,后者的稀疏性以 column-skip 形式存在于 *matmul 引擎内部*。重实现者不应在 TPU MXU 中寻找结构化稀疏模式;在 TPU 上,稀疏性是上游协处理器关注的问题,仅此而已。

---

## 差异点 — 它们为何不同

### 引擎归属

首要差异。TPU SparseCore 是独立硅块:每个 TC 配四个 SC,自己的三引擎 VLIW fabric,自己的寄存器文件和 bundle 格式(每代 `SparseCore{Scs,Tac,Tec}CodecBase`,[SparseCore 概览](overview.md))。Neuron MatmultSparse 在与密集 matmul 相同的 *PE systolic array* 上运行 — 按公开 Neuron 成本模型,稀疏和密集 matmul 共享同一个 exec-latency 函数(两个 opcode 名下都可达),这是只有一个 datapath 而不是两个 datapath 的最清晰证明。TPU 侧的等价证明正好相反:这里存在一个完整独立引擎,由 `Target::SupportsSparseCore` 门控(pre-SparseCore Jellyfish/Dragonfish/Pufferfish 代上为 false — 见 [SC ↔ MXU 握手](sc-mxu-handshake.md#partition-assignment--which-sc-feeds-which-mxu)),并且 SC↔TC 边界是显式 DMA + SFLAG 握手。

### “sparse”的含义

| 轴 | TPU SparseCore | Neuron MatmultSparse |
|---|---|---|
| 稀疏性位于 | **访问模式**(读取哪些行) | **权重矩阵**(哪些条目为零) |
| 结构 | 非结构化 — 任意索引、任意顺序、可重复 | 结构化 N:M(≈2:4)— group 内固定模式 |
| 比例 | 无 — 一个 window 可取 1 行或数千行,数据相关 | 固定约 50% 列削减 |
| 何时决定 | 运行期(索引随 minibatch 到达) | 编译期(剪枝把掩码烘入权重) |
| HLO / 格式 | CSR 输入(`XlaSparseDenseMatmulWithCsrInputOp`)描述每个样本的行 | 压缩(去零)权重 tile + position tag |

这些是正交含义。TPU 稀疏性是*数据移动*稀疏 — 矩阵是密集的,*访问*是稀疏的。Neuron 稀疏性是*算术*稀疏 — 访问是密集的,*矩阵*是稀疏的。TPU 的“sparse-dense matmul”名称字面上可解析为“sparse(embedding)*lookup* feeding a dense matmul”;Neuron 的“matmul-sparse”可解析为“其*操作数*稀疏的 matmul”。它们用同一个词指代相反属性。

> **怪癖 — TPU 按设计没有固定稀疏比例。** 来自 NVIDIA 2:4 世界的重实现者会期待固定 N:M 比例和压缩存储格式。TPU SparseCore 二者都没有:`VariableWindowAllocationEstimator`(@ `0x13ca2200`)不编码任何比例 — 它检查一个*不等式*(这个 lookup window 的可变大小 id 集合是否适合 TILE_SPMEM?),不适合就做 mini-batch([embedding minibatching](embedding-minibatching.md))。这里的“sparsity”是可变的、数据相关的 window size,而不是结构化掩码。把 2:4 风格比例硬编码到 SparseCore 重实现中是类别错误。

### 数据路径

TPU 数据路径是一个**穿过独立引擎、再经 HBM/VMEM 到 MXU 的多跳流水线**,在引擎边界上带 sync-flag 握手:

```text
indices ─► SCS (address calc) ─► TAC/TEC stream-gather
        ─► HBM[table + idx*stride] ─► TILE_SPMEM (per-tile SC SRAM)
        ─► TEC vector reduce (sum / weighted-sum / max)
        ─► TILE_SPMEM ─► (HBM) ─► VMEM ─► MXU latch ─► dense matmul ─► PSUM

规范的 SC→MXU fastpath 是 SC TEC → TILE_SPMEM → HBM → VMEM → MXU;只有一条直接 SC→VMEM DMA 路线(tpu_dma_hbm_to_vmem_sc_general)和一条 TC→SC 路线,其他所有东西都经由 HBM(SC ↔ MXU 握手)。流水线是 double-buffered — SC 生产 tile N,同时 MXU 消费 tile N−1,由两个 SFLAG 握手协调。

相比之下,Neuron 数据路径从不离开 PE 引擎。按公开架构,压缩权重、tag 和 activation 都驻留在片上 State Buffer 中,并且必须共享 base partition;matmul 在 PE array 中运行并累加到 PSUM。没有 HBM gather,没有跨引擎 DMA,没有 sync-flag 握手 — 整个转换就是一条 prologue 指令加一个引擎内的 column-skip。

成本模型单位

两个性能模型不共享单位,这是类别差异最具体的后果。

TPU SparseCoreNeuron MatmultSparse
模型类型内存模型计算模型
限制资源HBM 随机访问带宽(credit-arbitrated)PE-array 周期
指标随机 HBM 访问的 bytes/secMAC cycles,减半(约 2× FLOPS)
加速类型隐藏延迟(保持 MXU 有数据)matmul 上约 2× 算术吞吐
调节项GetSparseCoreHbmBandwidthAdjustmentFactor,DMA credit / throttleexec 阶段的单个 >> 1 周期减半

在 TPU 上没有 FLOPS 加速 — SC 几乎不做算术;它的任务是让 MXU 不因 HBM 而停顿。成本模型是按表的 HBM 使用估计和分数带宽份额(GetSparseCoreHbmBandwidthAdjustmentFactor,由 RunMemorySpaceAssignment 引用),并用 starvation timeout(FLAGS_xla_tpu_debug_sc_sflag_wait_timeout_ms)捕捉 SC 未能在 MXU 需要前产出 tile 的情况(SC ↔ MXU 握手)。Neuron 上整个性能叙事是结构化稀疏的周期减半 — 对相同输出形状,稀疏 matmul 的 exec cycles 是密集 matmul 的一半,除去可在大 contracting depth 下摊销的固定 tag-load 开销。一个模型是 bytes/sec;另一个是 MAC cycles。它们不可直接比较。


按代际的可用性

TPU SparseCore 存在性(已确认 — libtpu.so

SparseCore 存在性和引擎名册直接从 codec-class family namespace 与 SparseCore<Engine>* 反编译函数计数读取(SparseCore 概览):

TPU genCodenameFamily nsSparseCoreEnginesNotes
v2 / v3 / v4Jellyfish / Dragonfish / PufferfishNOBarnaCore 时代;Target::SupportsSparseCore = false
v5pViperfishvxc.vfcYESSCS + TAC + TEC第一个三引擎拆分
v6e ("Trillium")Ghostlitegxc.glcYESSCS + TAC + TEC三个引擎俱全;GhostliteTarget::MxuContractingSize = 256
TPU7x ("Ironwood")6acc60406gxc.gfcYESSCS + TEC (no TAC)TAC 折叠进 SCS+TEC;0 个 gfc::*SparseCoreTac* 符号

Neuron MatmultSparse 可用性(架构级 — 未分析二进制)

按公开 Neuron 架构,MatmultSparse 不存在于最早的 inference-only 代(该架构的 matmul 只支持密集),从第一个 training 代开始出现,并作为 PE-engine 特性继承到后续核心。此列没有地址,只作为 TPU 列的对照;请把细节视为架构级 Neuron 模型,而不是恢复证据。

Neuron arch classMatmultSparseNotes
inference-gen-0NO此架构上的 matmul 只支持密集
training-gen (introduced)YES第一个带 sparse matmul opcode 的架构
later training gensYES作为 PE-engine 特性继承;正交的 microscaling/FP-format 模式另行添加

注意 — TPU 根本没有 MatmultSparse 类比物。 Neuron MatmultSparse 在 TPU 上最接近的同级对象不是 SparseCore — 而是密集 MXU 自身的 dtype/precision 模式(例如 MxuContractingSizeIsDoubled 4-bit packed-nibble 路径,SC ↔ MXU 握手)。并且 Target::MxuSparseContractingSize = 0 在每一代上都意味着 TPU MXU 没有结构化稀疏 column-skip 模式。工作结论是,TPU 在内存侧(SparseCore)处理全部稀疏性并运行严格密集的 MXU,而 Neuron 在计算侧处理结构化稀疏性并为内存侧使用普通 DMA。两个厂商沿着稀疏问题的相反分界拆分。


结论 — 不等价

二者不等价;它们占据不同的架构类别。

  • TPU SparseCore 是一个专用协处理器 — 一个同级引擎(4 SC : 1 TC),具有自己的 ISA、内存模型、编译器流水线和编程模型 — 加速 embedding lookup 的 gather/scatter 内存模式
  • Neuron MatmultSparse 是现有 matmul 引擎的指令集模式 — 与密集 matmul 相同 PE array 上的一个 opcode — 加速结构化稀疏密集 GEMM 的算术

用三种方式表述:(1)引擎归属 — SparseCore 是独立硅片;MatmultSparse 与密集 matmul 是同一阵列。(2)“sparse”的含义 — TPU = 访问模式(gather indices);Neuron = 权重矩阵掩码(结构化 N:M 零)。(3)缓解的瓶颈 — TPU 缓解 HBM 随机访问带宽;Neuron 缓解 MAC 吞吐。功能类比是交叉的:TPU SparseCore ≈ Neuron 的 indirect-load / gather / scatter-accumulate DMA 家族;Neuron MatmultSparse ≈ NVIDIA 的 structured-2:4 Sparse Tensor Cores。共同的“sparse”一词把错误对象配到了一起。

各自胜出的场景

WorkloadWinnerWhy
带多 GB embedding 表的推荐系统 / DLRMTPU SparseCore为随机 HBM gather + HBM 内原子 FP scatter-add 专门构建;MXU 完全做不了这个
剪枝后的(2:4 结构化稀疏)transformer / CNN 权重Neuron MatmultSparse在 compute-bound GEMM 上约 2× MAC-cycle 削减;密集-only TPU MXU 没有等价物
密集 matmul(无稀疏)平局 — 二者都运行自己的密集 systolic array两边都会绕过稀疏机制
Neuron 上的 embedding lookupNeuron 的 indirect-load / gather DMA,不是 MatmultSparseMatmultSparse 没有 gather;embedding 走普通 DMA
TPU 上的结构化稀疏 matmul无原生支持MxuSparseContractingSize = 0;TPU MXU 只支持密集

注意 — 这里哪些可恢复,哪些不可恢复。 上面每个 TPU 侧断言都锚定在 libtpu.so 中(XlaSparseDenseMatmul* 家族、tpu_dma_*_sc_* 路线、SparseCoreCountPerTensorCore @ 0x1c6cb760MxuSparseContractingSize @ 0x1d4900c0DuplicateCountFloatVariableWindowAllocationEstimator @ 0x13ca2200)。Neuron 侧只是架构对照 — opcode 编号、三指令 lowering、>> 1 周期模型 — 来自公开 Neuron 架构,不来自本 wiki 分析过的任何二进制,因此不携带地址。核心结论(类别不同、类比对象交叉)对 Neuron 细节是稳健的,因为它依赖的是每个系统的结构事实,而不是任一侧的精确 bit layout。


交叉引用

  • SparseCore 概览 — TPU 侧全貌:SCS/TAC/TEC fabric、按代际的存在性、embedding 数据路径。
  • 架构 — SC 几何、四级内存模型,以及 embedding datapath 深入说明。
  • SC ↔ MXU 握手 — gather→VMEM→MXU 边界、SFLAG sync,以及本页依赖的 MxuSparseContractingSize = 0 事实。
  • 流式 Gather/Scatter — indirect-DMA descriptor 和 STREAM_OPCODE_* 集合(包括 HBM 内原子 scatter-add)。
  • 去重 Multiplicity — 折叠重复 embedding ids 的 TEC DuplicateCountFloat / uniquify 路径(等价性映射的阶段 2)。
  • SampleCombiner 发射器 — 每样本分段归约(等价性映射的阶段 3)。
  • Binary: extracted/libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64/libtpu/libtpu.so (build-id 89edbbe81c5b328a958fe628a9f2207d)
  • 索引项: Part IX — SparseCore & BarnaCore / SparseCore cross-cutting — 返回索引