SparseCore 概览
本页中的每个代号、engine 名称以及逐代存在性声明,均读取自
libtpu-0.0.40-cp314wheel 中的libtpu.so(build-id89edbbe81c5b328a958fe628a9f2207d)——来源包括 demangle 后的 C++ 符号表和嵌入的 proto-descriptor 字符串。其他版本会不同。
摘要
SparseCore (SC) 是 TPU 片上的 embedding / sparse-gather 协处理器。它与矩阵密集型 TensorCore (TC) 位于同一 die 上,共享芯片的 HBM 物理接口,并且存在的目的正是做 TensorCore 的 systolic MXU 无法完成的一件事:对 HBM 中 GB 级表执行间接(索引驱动)的流式读写,包括原子浮点 scatter-add。典型工作负载是推荐 / DLRM 类模型的 embedding lookup——从 embedding table 中 gather 数百万个可变长度行,把每个样本的多行 reduce 成一个 dense vector,将 dense 结果交给 TensorCore 做 matmul,并在反向传播中通过 atomic add 把梯度 scatter 回 HBM。TensorCore 的 HBM controller 针对长连续 burst 调优;SparseCore 的 controller 针对大量短随机事务调优。这种访问模式分裂就是采用两个 engine 而非一个 engine 的完整架构理由。
SparseCore 不是 TensorCore 扩展。它是独立的 ISA 家族,拥有自己的 opcode 集、自己的寄存器文件、自己的 VLIW bundle 格式,以及自己的逐代 encoder/decoder codec。在 SparseCore 内部,计算结构本身又分为三个子 engine 类别,每个都由独立 VLIW bundle stream 驱动,并由 tpu::TpuSequencerType enum 值选择:
- SCS — SparseCore Scalar sequencer。控制 / 寻址 CPU。32 字节 bundle。
TpuSequencerType = 3。 - TAC — Tile Access Core。专用地址处理器 + DMA issuer;没有向量计算。64 字节 bundle。
TpuSequencerType = 4。 - TEC — Tile Execute Core。运行逐 tile reduce 的宽向量 engine。64 字节 bundle。
TpuSequencerType = 5。
该二进制记录的最重要结构事实是:该清单并非在所有硅片代际上恒定。SparseCore 首次出现在 Viperfish 代,以 SCS+TAC+TEC 三 engine 分裂形式出现;Ghostlite 保留全部三者;6acc60406 完全移除了 TAC,把 tile-fetch 发射折叠进 SCS+TEC 这对 engine 中。还有一个旧式单体前身 SCv0,在此 build 中只剩两个 profiler-label 常量——没有随附 SCv0 codec。
本页用于导航。它确定 SparseCore 是什么,命名三个 engine 类别及其有二进制证据支撑的逐代存在性,勾勒 host→HBM→SparseCore→TensorCore 数据路径,并指向拥有各个部分细节的页面。深层机制——opcode 清单、slot 位布局、embedding scan 数据路径、后端 pass pipeline——位于下面交叉引用的同级页面。
对重新实现而言,契约是:
- 三个子 engine 类别,三个独立 bundle stream。 SCS、TAC 和 TEC 是不同 codec(逐代
SparseCore{Scs,Tac,Tec}CodecBase),各自由其TpuSequencerType非类型模板参数(3 / 4 / 5)选择。重新实现者必须把它们视为三台通过 sync flag 和共享内存协作的独立 VLIW 机器,而不是一台带三种模式的机器。 - 逐代存在性是契约的一部分。 Viperfish 和 Ghostlite 提供全部三个 engine;6acc60406 只提供 SCS + TEC。为 6acc60406 target 发射 TAC 程序是 codec 错误——
gfcnamespace 中没有任何SparseCoreTac*符号。 - 数据路径经由 HBM 且是间接的。 Embedding table 位于 HBM;SC 将 tile row gather 到逐 tile SRAM(
TILE_SPMEM)中,TEC 对其 reduce,dense 结果被 DMA 到 TensorCore 的 VMEM(或 scatter 回 HBM)。SC 的STREAM_OPCODE_SCATTER_FLOAT_ADD直接在 HBM 中执行 atomic FP-add,不需要 TC 往返——这是证明 SC 作为独立 engine 有价值的原语。 - SCv0 只保留 enum。 旧式单 personality SparseCore 只保留为
TpuSequencerTypeProto值 7 / 8(proto enum)和两个 profiler label;它没有 C++TpuSequencerType值(TpuSequencerTypeFromProto会拒绝它),也没有随附 encoder、decoder、codec 或 descriptor。
| 它是什么 | 片上 embedding / sparse-gather 协处理器,与 TensorCore 共址,共享 HBM |
| Engine 类别 | SCS(标量 sequencer) · TAC(tile-access / DMA) · TEC(向量计算) |
| Sequencer enum | C++ tpu::TpuSequencerType — SCS=3, TAC=4, TEC=5(与 codec 模板相同)。SCv0 没有 C++ 值 — 关于 proto-enum +1 对应项,见 getSequencerType |
| Codec class 根 | SparseCore{Scs,Tac,Tec}CodecBase(逐代,位于 asic_sw::deepsea::<fam>::isa) |
| 带 SC 的代际 | Viperfish(全部 3 个) · Ghostlite(全部 3 个) · 6acc60406(SCS+TEC,无 TAC) |
| 不带 SC 的代际 | Jellyfish / Dragonfish / Pufferfish(BarnaCore 时代 — 见 BarnaCore Overview) |
| 内存 | HBM(全芯片) · SPMEM(逐芯片 SC SRAM) · TILE_SPMEM(逐 tile) · TIMEM(逐 tile instr) |
| 置信度 | CONFIRMED(以符号表 / descriptor 为锚点),除非某行或标注另有说明 |
SparseCore 是什么 — 以及为什么它是独立的
TensorCore 是围绕 systolic matrix unit 构建的静态调度 VLIW 机器;当数据以 dense tile 形式从 HBM 连续流出时,它表现最佳。Embedding 密集型模型打破了这一假设:主导成本不是 matmul FLOPs,而是指针追逐——从包含数百万行的表中读取少量行,且访问哪些行取决于数据并随每个 minibatch 变化。强行让这种流量经过 TensorCore 针对连续 burst 优化的 HBM controller 会浪费 burst,而 systolic array 的累加路径也无法对任意 HBM 地址执行原子浮点 add(embedding-gradient accumulation 在每个 backward step 都需要的操作)。
SparseCore 的存在正是为了吸收这类流量。它是同一 die 上的 peer engine,拥有对同一 HBM 的读写访问,但通过不同的 MMU translation surface 和 prefetcher policy 到达 HBM,这些策略针对大量短随机事务而非长 burst 调优。它的指令集围绕 gather、scatter、scan、sort、uniquify 和 pack/unpack 构建——这些操作把可变长度索引列表流转换为 dense embedding vector。SparseCore 和 TensorCore 并行运行,并通过共享 HBM、编程式 VMEM↔SPMEM DMA 以及共享 sync-flag pool 交接。
注意 — SparseCore 是自己的 ISA 家族,不是 TensorCore 模式。 二进制在每代下都携带完全独立的
SparseCore{Scs,Tac,Tec}CodecBase模板层级,作用域位于asic_sw::deepsea::{vxc.vfc, gxc.glc, gxc.gfc}::isa。它们拥有自己的 bundle 宽度、opcode enum 和 operand-field proto,不同于 ISA Overview 中记录的 TensorCoreLloOpcodeProto/ 逐代 bundle encoder。把 SparseCore 建模为额外 TensorCore slot 的重新实现者无法生成可编码的 SC 程序。
三个 Engine 类别
在 SparseCore 内部,计算结构被划分为三个子 engine 类别;每个都是独立 VLIW 机器,拥有自己的 bundle stream、自己的 program type 和自己的 codec。它们在二进制中通过 encoder 模板作为非类型参数携带的 tpu::TpuSequencerType enum,以及 engine 专属名称字符串区分。
数值列拆分两套编号:C++ 是 codec 模板和 TpuSequencerTypeToString 都使用的 tpu::TpuSequencerType enum(wiki 规范编号);proto 是其对等的 TpuSequencerTypeProto,该 enum 保留 INVALID=0 槽位,因此整体高一位(关于 FromProto 桥接,见 getSequencerType)。
| C++ | proto | TpuSequencerTypeProto literal | Short | Bundle | Role |
|---|---|---|---|---|---|
| 3 | 4 | TPU_SEQUENCER_TYPE_SPARSE_CORE_SEQUENCER | SCS | 32 B | 标量控制 / 寻址 sequencer |
| 4 | 5 | TPU_SEQUENCER_TYPE_SPARSE_CORE_TILE_ACCESS_CORE_SEQUENCER | TAC | 64 B | 地址生成 + tile-fetch DMA issuer |
| 5 | 6 | TPU_SEQUENCER_TYPE_SPARSE_CORE_TILE_EXECUTE_CORE_SEQUENCER | TEC | 64 B | 对已加载 tile 执行宽向量计算 |
| — | 7 | TPU_SEQUENCER_TYPE_SPARSE_CORE_V0_SEQUENCER | SCv0 | (legacy) | 单体前身 — 仅 proto,无 C++ 值,无 codec |
| — | 8 | TPU_SEQUENCER_TYPE_SPARSE_CORE_V0_ADDRESS_HANDLER | SCv0-AH | (legacy) | SCv0 address handler — 仅 proto,无 C++ 值,无 codec |
SCS — 标量 sequencer。 SCS 是控制面:它运行 program counter、计算地址、管理 circular buffer、读取芯片寄存器(GTC clocks、tile id、sparse-core id、DMA credits),并发射协调 SC tile 彼此以及与 TensorCore 协作的 sync-flag 和 atomic 操作。其 32 字节 bundle 是三者中最窄的。其指令集主要由 scalar ALU slot(整数 + F32 算术、比较、移位、分支)和承载 atomic-and-sync 家族的 "scalar misc" slot 构成。见 SCS (Scalar) Engine 和 Scalar Opcode Enum。
TAC — tile-access core。 TAC 是位于 SCS 和 TEC 之间的专用地址处理器 + DMA issuer。它有自己的 sequencer 线程(分支、halt、delay)、整数地址算术、比较、用于 address-buffer staging 的 SMEM load/store,以及 stream slot——但没有 FPU、没有 vector ALU、没有 vector load/store。它的唯一职责是接收索引流并发射 tile-fetch DMA,将 embedding row 从 HBM/SPMEM 拉入 TILE_SPMEM。尽管不携带向量计算,它的 bundle 仍为 64 字节,因为宽度用于许多标量风格的地址操作。TAC 只存在于 Viperfish 和 Ghostlite。见 TAC Engine。
TEC — tile-execute core。 TEC 是宽计算 engine。单个 64 字节 TEC bundle 可以在一个周期内发射三个 vector ALU 操作、一个 vector load、一个 vector store、一个 "vector extended" 操作(scan / sort / uniquify)、一个 "vector result" pop、两个 scalar ALU slot、immediates、一个 DMA 和一个 stream slot。逐 row reduce、精度 pack/unpack(包括最新一代上的 FP8 E4m3/E5m2 和 sub-byte 格式)以及 embedding-optimizer 数学都在这里执行。Vector ALU slot 是整个 SparseCore 中最宽的 opcode 集。见 TEC (Vector) Engine、Vector Opcode Enum 和 Stream Gather/Scatter 数据路径。
易错点 — TAC 复用 SCS 的 proto-enum opcode 空间,但会对其加以约束。 TAC 子 bundle 不声明独立的
SparseCoreTacScalarAluproto-enum namespace;它复用通用的SparseCoreScalarAlu/SparseCoreScalarMiscenum,并在发射期间由SparseCoreTacScalarAlu{0,1}Encoderclass 对合法性设门。重新实现者不能从专用 enum 中枚举“TAC 的 opcode”——TAC 合法性是 SCS 标量集减去 FPU 和向量操作,并在编码时强制执行。
逐代存在性
SparseCore 是 v5+ 特性。提供 SC 硅片的代际是 Viperfish、Ghostlite 和 6acc60406;更早的 BarnaCore 时代代际(Jellyfish / Dragonfish / Pufferfish)不携带 SparseCore。哪些子 engine 存在本身就是逐代属性,也是重新实现者必须编码的最重要事实。
判别依据是 codec class family。SparseCore codec 位于逐代 asic_sw::deepsea family namespace 下——vxc.vfc(Viperfish)、gxc.glc(Ghostlite)、gxc.gfc(6acc60406)——而该 namespace 中是否存在 SparseCore<Engine>CodecBase class,就是该 engine 是否随硅片提供的直接二进制读数。
| Gen | Codename | Family ns | SCS | TAC | TEC | SCv0 | Notes |
|---|---|---|---|---|---|---|---|
| TPU v2 | Jellyfish | jxc | – | – | – | – | 无 SparseCore(BarnaCore 时代) |
| TPU v3 | Dragonfish | jxc | – | – | – | – | 无 SparseCore(共享 Jellyfish codec) |
| TPU v4 | Pufferfish | pxc.pfc | – | – | – | – | 无 SparseCore(BarnaCore VLIW) |
| TPU v5p | Viperfish | vxc.vfc | Y | Y | Y | – | 首个带三 engine 分裂的代际 |
| TPU v6e | Ghostlite | gxc.glc | Y | Y | Y | – | 完整 SCS+TAC+TEC;向量集加宽 |
| TPU7x | 6acc60406 | gxc.gfc | Y | – | Y | – | TAC 被移除;TEC 加宽(FP8/FP4 pack/unpack) |
注意 — 代号到营销名称的映射。 SparseCore 在二进制中以硅片代号 Viperfish、Ghostlite 和
6acc60406出现——从不以任何营销字符串出现。上表的 marketing-name 列遵循 SparseCore 专属同级页面 SparseCore Target Descriptor(nSparseCoreTarget= v5p;GhostLiteSparseCoreTarget= v6e Ghostlite + v7x6acc60406);二进制本身的 key 始终是代号 family namespace 和 SC codec 模板中携带的TpuVersionordinal,而不是营销名称。(一些同级部分把 Viperfish 标为v5/v5e;代号 + family namespace 是唯一具二进制权威性的判别符。作为记录,Google 的 Trillium 营销名称是 TPU v6e,即代号 Ghostlite——不是6acc60406,后者是 TPU7x。)应把代号 + family namespace 视为权威;marketing 列是 MEDIUM confidence。
反编译交叉检查 — engine 清单和 TAC 缺失
清单以及 6acc60406 缺失 TAC 已直接用反编译函数集确认。按 family namespace 计数反编译的 SparseCore<Engine>* 函数:
| Family ns | Gen | SparseCoreScs* fns | SparseCoreTac* fns | SparseCoreTec* fns |
|---|---|---|---|---|
vxc.vfc | Viperfish | 509 | 770 | 4218 |
gxc.glc | Ghostlite | 498 | 762 | 5961 |
gxc.gfc | 6acc60406 | 493 | 0 | 6526 |
gfc(6acc60406)namespace 中有 zero 个 SparseCoreTac* 反编译函数,而 Viperfish 和 Ghostlite 各自约有 760–770 个——TAC 在 6acc60406 硅片中完全不存在。(唯一保留下来的 gfc 标记 SparseCoreTac 符号 llvm::TPUGfcSubtarget::isSparseCoreTac 是返回 false 的 subtarget query,不是 codec leaf。)对应的 SparseCoreTacCodecBase class 只存在于 vxc.vfc 和 gxc.glc 下,从不存在于 gxc.gfc。相反,TEC 函数计数逐代增长(4218 → 5961 → 6526),这与 TAC 的 tile-fetch 角色在 6acc60406 上被折叠进 SCS+TEC 这一点一致。SCS 在三代中都存在且数量大致稳定。
CONFIRMED — 6acc60406 将 3-engine pipeline 折叠为 2 个。 在 Viperfish/Ghostlite 上,路径是 SCS → TAC(tile-fetch DMA)→ TEC(compute)。在 6acc60406 上,TAC 消失,TEC 通过自己的 stream slot 吸收地址生成 + DMA 发射职责,只留下一个 SCS↔TEC 边界。这就是 "2-sequencer (SCS+TEC) model"。关于被吸收的角色细节,见 TAC Engine。
SCv0 — 旧式单体前身
proto enum TpuSequencerTypeProto 为早于 SCS/TAC/TEC 分裂的单 personality SparseCore 保留了两个值(7、8)(C++ TpuSequencerType enum 没有 SCv0 值——TpuSequencerTypeFromProto 拒绝 proto 7/8),另有一个 TPU_CORE_TYPE_SPARSE_CORE_V0 core-type。在此 build 中,SCv0 只以两个 profiler-label 常量存活——kHloSparseCoreV0Infeed 和 kHloSparseCoreV0Outfeed,它们从 XLA HLO profiler 的 DisambiguateInfeedOutfeed 被引用。没有随附 SCv0 encoder、decoder、codec metadata、scheduling table 或 descriptor proto。命名 SCv0 的用户 proto 会在 codec lookup 失败。这些 enum 值仅为 schema 向后兼容保留。
易错点 —
6acc60406TEC field 符号上的V0后缀不是 SCv0。 反编译符号如gfc::isa::SparseCoreTecVectorExtendedAddScanF32V0XField携带的V0是实时6acc60406TEC vector-extended 操作上的 operand-field version tag——与 SCv0 core type 无关。真正的 SCv0 引用只有上面的两个 profiler label。
数据路径
SparseCore 存在的理由是 embedding lookup。高层流程把 host 驻留的 embedding table 移入 HBM,按需 gather tile row,在 TEC 上 reduce,并把 dense 结果交给 TensorCore——梯度则沿反向路径流回。
HOST HBM (shared TC/SC) SPARSECORE TENSORCORE
──── ───────────────── ────────── ──────────
embedding tables ──load──▶ embedding rows matmul / MLP
(GB-scale, indirect)
│
index stream ────┤ STREAM_OPCODE_GATHER SCS schedules
▼ ───────────────────────▶ tile-fetch program
[HBM row r_i] │
TAC* / TEC stream slot
issues tile-fetch DMA
▼
TILE_SPMEM ◀── row tiles
│
TEC vector reduce
(sum / max / weighted)
│
DMA VMEM ◀────────────────┘ dense vector
(DMA_CORE_ID_TENSOR_CORE_0,
DMA_MEMORY_ID_VMEM) ──sync flag──▶ consume
│
── backward pass ── ▼
TEC loads grad slice ◀── DMA SPMEM
applies optimizer math
│
[HBM row r_i] ◀── STREAM_OPCODE_SCATTER_FLOAT_ADD (atomic, in-HBM)
```text
前向传播:TensorCore 请求下一个 minibatch 的 embedding;SCS 接收并调度 tile-fetch program;在 Viperfish/Ghostlite 上,TAC 发射从 HBM table 到 TILE_SPMEM 的 stream-gather DMA,而在 `6acc60406` 上由 TEC 自己的 stream slot 执行;TEC vector-load tile,运行逐样本 reduce,并将 dense 结果 DMA 到 TensorCore 的 VMEM,然后置起 TC 等待的 sync flag。反向传播按相反方向运行:TC 将 gradient slice 写入 SPMEM,TEC 加载它们并应用 embedding-optimizer 数学(最新一代 TEC 专门支持 stochastic round-to-bf16 和 packed FP8 格式,用于 optimizer-state quantisation),SC 的 stream engine 则向 HBM 中的 embedding-row 地址发射 `STREAM_OPCODE_SCATTER_FLOAT_ADD`——这是直接落在 HBM 中的原子浮点 add,不经过 TensorCore 往返。
SparseCore 拥有四个地址空间,作用域递减而速度递增:**HBM**(全芯片,GB 级,embedding table + gradient buffer)、**SPMEM**(芯片上所有 SC core,MB 级,跨 SC 通信和大 buffer)、**TILE_SPMEM**(逐 tile,KB 级,TEC 计算的本地工作集)以及 **TIMEM**(逐 tile instruction memory)。与 TensorCore 的交接使用三种机制——HBM(慢,全局)、编程式 VMEM↔SPMEM DMA(快)以及共享 sync-flag pool(控制面)。gather/scatter 描述符格式的细节见 [Stream Gather/Scatter](stream-gather-scatter.md);SC↔MXU 集成握手见 [SC ↔ MXU Handshake](sc-mxu-handshake.md)。
> **注意 — HBM 内原子 add 是关键原语。** `STREAM_OPCODE_SCATTER_FLOAT_ADD`(与 DMA destination opcode `DMA_DEST_OPCODE_READ_AND_ADD` 配对)把浮点梯度直接累加进 HBM 中的 embedding row。TensorCore 的 MXU 无法做到这一点。没有它,embedding 梯度要么需要把表缩小到 VMEM 能容纳的大小,要么需要多 pass scatter-gather-add。在 DLRM 类模型中,这一个操作为每个 backward step 上的每个 embedding table 承载梯度累加流量——这就是 SparseCore 值得占用硅面积的架构理由。
---
## Part IX 的组织方式
Part IX 将 SparseCore 保持为整体,而不是像 TensorCore 部分那样沿 ISA / cost / scheduling 接缝拆分,因为它是一个自包含 engine,读者希望在一处理解。页面分组如下:
- **Engines(本组)** — 本 overview,加上 [Architecture](architecture.md)(engine 角色 + embedding datapath 深入)、[SCS (Scalar) Engine](scs-engine.md)、[TAC Engine](tac-engine.md)、[TEC (Vector) Engine](tec-engine.md)、逐 engine 的 [Bundle Slot-Base Map](bundle-slot-base-map.md)、将 SC 计算划分为逐 engine bundle 的 [Region → Sequencer Outliner](region-to-sequencer-outliner.md),以及 [getSequencerType](getsequencertype.md)(SCS/TAC/TEC 选择函数)。
- **ISA** — opcode enum 和 slot 编码:[Scalar Opcode Enum](scalar-opcode-enum.md)、[Vector Opcode Enum](vector-opcode-enum.md)、[OneSlot Scalar Router](oneslot-router.md)、[VectorLoad](vectorload-slot.md) / [VectorStore](vectorstore-slot.md) / [VectorExtended / VEX](vectorextended-vex.md) slot 页面、[VEX Operand-Port Binding](vex-operand-port.md)、[VEX Mask / Dest-Port / Sub-Opcode](vex-mask-destport-subopcode.md)、[M-Register Predicate Word](m-register-predicate.md) 和 [CBREG Circular-Buffer Register](cbreg.md)。
- **Embedding datapath** — 稀疏计算:[Scan Datapath](scan-datapath.md)、[Segmented Scan](segmented-scan.md)、[Segmented-Add-Scan](segmented-add-scan.md)、[Embedding Minibatching Decomposition](embedding-minibatching.md)、[SampleCombiner Emitter](sample-combiner-emitter.md)、[EmitValencyLoop](emit-valency-loop.md)、[RankAndPermute / RadixSort](rank-and-permute-radixsort.md) 和 [Dedup Multiplicity](dedup-multiplicity.md)。
- **Pointers & DMA** — 寻址模型:[Fat Pointers (AS7/8/9)](fat-pointers-as789.md)、[addrspacecast ISel](addrspacecast-isel.md)、[Tile-ID Cast](tile-id-cast.md)、[Stream Gather/Scatter](stream-gather-scatter.md) 和 [IndirectVregStream](indirect-vreg-stream.md)。
- **Back-end** — 编译器 offload 路径:[SC Backend Pipeline](sc-backend-pipeline.md)(RunPasses 和 MEGACORE barrier)、[SC EmitX Dispatcher](sc-emitx-dispatcher.md)(seq3/seq4/seq5 → EmitX 跳转表)、[SC Core Selection](sc-core-selection.md)、[SC Queue Assignment & Reservation](sc-queue-assignment-reservation.md) 和 [GetSparseCoreConfig](getsparsecoreconfig.md)。
- **Cross-cutting** — [SC ↔ MXU Handshake](sc-mxu-handshake.md) 和跨厂商 [SparseCore vs Neuron MatmultSparse](sparsecore-vs-neuron-matmultsparse.md)。
已退役的前身 **BarnaCore**(Jellyfish / Dragonfish / Pufferfish 上的 embedding accelerator,从 Viperfish 起被 SparseCore 取代)有自己的分组,从 [BarnaCore Overview](../barnacore/overview.md) 开始。SparseCore 交接到的 TensorCore ISA 是 [ISA Overview](../isa/overview.md);collective-offload 叙事位于 Part XIII。
---
## 置信度摘要
| Claim | Evidence |
|---|---|
| 三个 engine 类别 SCS/TAC/TEC,由 `TpuSequencerType` 3/4/5 选择 | `TpuSequencerType` enum(`TpuSequencerTypeToString` @ `0x20b362e0`,通过 `off_22010DE0` 上的跳转表);`EncoderBase<…, TpuSequencerType=3/5>` 模板实例 |
| 逐代 codec 根 `SparseCore{Scs,Tac,Tec}CodecBase` 作用域为 `vxc.vfc` / `gxc.glc` / `gxc.gfc` | 反编译集合中的 demangled codec-base class 符号 |
| Viperfish + Ghostlite 提供全部三个 engine | `vxc.vfc` 和 `gxc.glc` 各自具有 Scs/Tac/Tec codec base;fn counts Scs≈500, Tac≈760, Tec 4218/5961 |
| `6acc60406` 移除 TAC(仅 SCS+TEC) | zero `gfc::…SparseCoreTac*` symbols / functions;无 `gxc.gfc` `SparseCoreTacCodecBase`;TEC fn count 6526 |
| Jellyfish / Dragonfish / Pufferfish 不携带 SparseCore | `jxc` / `pxc.pfc` 下无 `SparseCore*CodecBase`;这些是 BarnaCore-era gens |
| SCv0 只保留 enum(无 codec) | `TpuSequencerTypeProto` 7/8(仅 proto;无 C++ 值,`FromProto` 拒绝)+ `kHloSparseCoreV0{Infeed,Outfeed}` profiler label;无随附 SCv0 encoder/decoder/descriptor |
| SCS=32 B,TAC=64 B,TEC=64 B bundle;无 check byte | `BundleSizeBytes` 读取 codec-metadata vtable slot 并返回 32/64;SC bundle 不携带 `0x55` trailer |
| HBM 内 atomic FP scatter-add 是关键原语 | `STREAM_OPCODE_SCATTER_FLOAT_ADD` + `DMA_DEST_OPCODE_READ_AND_ADD` enum 字符串 |
| `6acc60406` TEC field 符号上的 `V0` 后缀是 operand-version tag,不是 SCv0 | `gfc::isa::SparseCoreTecVectorExtended*V0XField` 是实时 `6acc60406` TEC 操作 |
| 代号 Viperfish/Ghostlite/`6acc60406` 对应营销名称 v5p/v6e/v7x | 遵循同级 [SparseCore Target Descriptor](../targets/sparsecore-target-descriptor.md);二进制以代号 family ns 为 key,而非营销名称 |
---
## 交叉引用
- [Architecture](architecture.md) — engine 角色和完整深度的 embedding datapath。
- [SCS (Scalar) Engine](scs-engine.md) — 标量控制 / 寻址 sequencer。
- [TAC Engine](tac-engine.md) — tile-access / DMA-issuer engine 及其在 `6acc60406` 上的移除。
- [TEC (Vector) Engine](tec-engine.md) — 宽向量计算 engine。
- [getSequencerType](getsequencertype.md) — SCS/TAC/TEC engine 选择函数。
- [Region → Sequencer Outliner](region-to-sequencer-outliner.md) — 将 SC 计算划分为逐 engine bundle stream。
- [Scalar Opcode Enum](scalar-opcode-enum.md) — SCS / TAC scalar ALU 和 scalar-misc opcode 清单。
- [Vector Opcode Enum](vector-opcode-enum.md) — TEC vector ALU opcode 清单(逐代宽度)。
- [Stream Gather/Scatter](stream-gather-scatter.md) — indirect-DMA 描述符格式和 `STREAM_OPCODE_*` 集。
- [SC Backend Pipeline](sc-backend-pipeline.md) — SparseCore 编译器 offload pass pipeline。
- [SC ↔ MXU Handshake](sc-mxu-handshake.md) — SparseCore ↔ TensorCore 集成握手。
- [GetSparseCoreConfig](getsparsecoreconfig.md) — offload op-type 配置来源。
- [SparseCore vs Neuron MatmultSparse](sparsecore-vs-neuron-matmultsparse.md) — 跨厂商比较。
- [ISA Overview](../isa/overview.md) — SparseCore 交接到的 TensorCore VLIW ISA。
- [BarnaCore Overview](../barnacore/overview.md) — SparseCore 取代的已退役 v2–v4 embedding accelerator。
- **Binary:** `extracted/libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64/libtpu/libtpu.so`(build-id `89edbbe81c5b328a958fe628a9f2207d`)
- **Index entry:** Part IX — SparseCore & BarnaCore / SparseCore engines — [back to index](../index.md)