各代 × 类型的 Sequencer 操作
本页中的每个操作名、命名空间、地址和枚举值,均从
libtpu-0.0.40-cp314wheel 中libtpu.so的符号表和.text按字节精确读取(BuildID md589edbbe81c5b328a958fe628a9f2207d,未 strip,1,233,709 个符号)。其他版本会不同。
摘要
TPU sequencer slot(Sequencer Slot)并非在每种芯片上都暴露同一套控制流操作。它沿两个轴变化:硅片代际(从 Jellyfish 到 6acc60406)和 sequencer 类型(TpuSequencerType)——即该 bundle 面向的一代芯片内的子核心(TensorCore、BarnaCore,或某个 SparseCore 引擎)。编解码器、proto 命名空间以及可用操作都以 (TpuVersion, TpuSequencerType) 对为键,因此“存在哪些控制流操作”这个精确问题,只有在两个坐标都固定后才有答案。
本页是 gen × type 清单。操作是否存在,是从二进制中每个(gen × type)的 protobuf 消息类型符号恢复的:每个控制流操作都是一个不同的 C++ 类型,例如 vxc::isa::TensorCoreScalarAlu_BranchRelative 或 gxc::gfc::isa::SparseCoreScalarAlu_CallSreg,某一代要么有该符号,要么没有。命名空间前缀本身就是(gen × type)键——vxc::isa 是 Viperfish TensorCore,vxc::vfc::isa 是 Viperfish SparseCore,gxc::glc::isa 是 Ghostlite,gxc::gfc::isa 是 6acc60406,pxc::isa 是 Pufferfish TensorCore,platforms_deepsea::jellyfish::isa 是 Jellyfish。(gxc 配对容易看反:Ghostlite 是 load-core glc,6acc60406 是 fetch-core gfc——见 Sub-Core Taxonomy。)将 …HaltYield、…ReadRegisterLcc{Low,High}、…BranchRelativeRotatingPreg 以及 SparseCore …ScalarMisc_* 同步族在各命名空间中的存在性互相交叉引用,即可得到矩阵。
对重新实现而言,契约如下:
TpuSequencerType是一个 6 值枚举;codec/emitter 注册表以(TpuVersion, TpuSequencerType)为键,同一代会服务多个 sequencer 类型,且操作清单不同。- TensorCore sequencer 在每一代都存在;SparseCore 引擎(SCS / TAC / TEC)仅从 Viperfish 开始出现,并且
6acc60406移除了 TAC。 - branch / call / halt / delay 核心是通用的;差异在于 yield 族(Viperfish 引入,Ghostlite 收窄,
6acc60406移除)、硬件循环计数器读取(仅 Viperfish+)、双通道和旋转谓词同步操作,以及 BarnaCore 同步族。 - 命名会跨代漂移:Pufferfish 使用
Scalar前缀和Reg后缀(ScalarBranchReg);Viperfish+ 去掉前缀并将Reg重命名为Sreg(BranchSreg)。
| 枚举 | tpu::TpuSequencerType,6 个值(内部 0..5) |
| ToString | TpuSequencerTypeToString @ 0x20b362e0(索引 off_22010DE0) |
| FromProto | TpuSequencerTypeFromProto @ 0x20b36300(proto 1..6 → 内部 0..5) |
| 枚举表 | tpu::kTpuSequencerTypes @ 0xb540778(值 0,1,2,3,4,5) |
| Codec 键 | (TpuVersion, TpuSequencerType);SCS 在 TpuSequencerType=3 实例化 |
| TC 命名空间 | JF jellyfish::isa; PF pxc::isa; VF vxc::isa; GL gxc::glc::isa; 6acc60406 gxc::gfc::isa |
| SCS 命名空间 | VF vxc::vfc::isa; GL gxc::glc::isa; 6acc60406 gxc::gfc::isa |
| 通用核心 | Branch{Abs,Rel,Sreg/Ind}, Call{Abs,Rel,Sreg/Ind}, Halt, Delay, Fence |
| Viperfish+ 新增 | ReadRegisterLcc{Low,High}, HaltYield*, ScalarMisc sync lane |
| 6acc60406 新增 | BranchRelativeRotatingPreg, SetRotatingPredicateRegister, SetPOrTState |
TpuSequencerType 枚举
TpuSequencerType 是进入 codec/emitter 注册表的第二个键。它的六个值是按字节精确恢复的:TpuSequencerTypeFromProto(0x20b36300)将 protobuf 枚举(1..6)映射到内部 C++ 枚举(0..5),而 TpuSequencerTypeToString(0x20b362e0)是一个扁平表索引 off_22010DE0[value]。0xbdf2878 处的字符串指针长度表给出了每个名称的长度(19, 18, 23, 19, 33, 34),这唯一钉住了六个名称:
| 内部值 | Proto 值 | 名称(k…) | 角色 | 代号 / 代际 |
|---|---|---|---|---|
| 0 | 1 | kTensorCoreSequencer | TC — 主 TensorCore VLIW sequencer | 所有代 |
| 1 | 2 | kBarnaCoreSequencer | BCS — Pufferfish BarnaCore sequencer | Pufferfish |
| 2 | 3 | kBarnaCoreAddressHandler | BCAH — Jellyfish BarnaCore address handler | Jellyfish |
| 3 | 4 | kSparseCoreSequencer | SCS — SparseCore scalar sequencer | Viperfish+ |
| 4 | 5 | kSparseCoreTileAccessSequencer | TAC — SparseCore tile-access | Viperfish, Ghostlite |
| 5 | 6 | kSparseCoreTileExecuteSequencer | TEC — SparseCore tile-execute | Viperfish+ |
该映射就是反编译后 TpuSequencerTypeFromProto 中的字面 switch:
// tpu::TpuSequencerTypeFromProto(TpuSequencerTypeProto) @ 0x20b36300
switch (proto) {
case 1: result = 0; break; // kTensorCoreSequencer
case 2: result = 1; break; // kBarnaCoreSequencer
case 3: result = 2; break; // kBarnaCoreAddressHandler
case 4: result = 3; break; // kSparseCoreSequencer
case 5: result = 4; break; // kSparseCoreTileAccessSequencer
case 6: result = 5; break; // kSparseCoreTileExecuteSequencer
default: return error("Invalid sequencer type: " + proto);
}
```text
codec 实例化确认了键控方式:SparseCore SCS codec 模板在 `(tpu::TpuSequencerType)3` 实例化,例如 `EncoderBase<…SparseCoreScsCodecBase<…>…, (tpu::TpuSequencerType)3>::EncodeBundle`,与 `kSparseCoreSequencer = 3` 匹配。TAC codec(`gxc::glc::isa::SparseCoreTacCodecBase`)在 `(tpu::TpuSequencerType)4` 实例化,与 `kSparseCoreTileAccessSequencer = 4` 匹配。
> **注意 — sequencer 类型是 codec 键,不是芯片属性。** 单一代际会同时承载多个 sequencer 类型:Ghostlite 有 TensorCore、SCS、TAC 和 TEC sequencer,每个都有自己的 bundle 宽度和操作清单。选择 codec 的是 `(TpuVersion, TpuSequencerType)` 对([Bundle Model](bundle-model-overview.md));如果重新实现把“sequencer 类型”视为仅由芯片推导,将无法在同样运行 TensorCore bundle 的芯片上编码 SparseCore bundle。
---
## 每代的子核心存在性
在操作矩阵之前,先回答更粗粒度的问题:哪些 sequencer 类型存在于哪些代际。这由每代命名空间中 codec 类(`SparseCoreScsCodecBase`、`SparseCoreTacBundle`、`SparseCoreTecBundle`)的存在性决定。
| 代际 | TC | BarnaCore | SCS | TAC | TEC | 来源 |
|---|:--:|:--:|:--:|:--:|:--:|---|
| Jellyfish (v2) | ✓ | BCAH | — | — | — | `jellyfish::isa` + `barna_core` |
| Dragonfish (v3) | ✓ | BCAH | — | — | — | Jellyfish codec 的别名 |
| Pufferfish (v4) | ✓ | BCS | — | — | — | `pxc::isa` + `pxc::pfc::isa` |
| Viperfish (v5p, +v5e lite) | ✓ | — | ✓ | ✓ | ✓ | `vxc::isa`, `vxc::vfc::isa` |
| Ghostlite (v6e) | ✓ | — | ✓ | ✓ | ✓ | `gxc::glc::isa` |
| `6acc60406` (v7) | ✓ | — | ✓ | — | ✓ | `gxc::gfc::isa` |
`6acc60406` 移除 TAC 有字节级锚点:`gxc::gfc::isa::SparseCoreTac{Bundle,CodecBase,Program}` 缺失,而 `gfc::isa::SparseCoreTec{Bundle,Program}` 和 `gfc::isa::SparseCoreScs{Bundle,CodecBase,Program}` 存在(`nm -C`)。Viperfish 和 Ghostlite 各自都有三个 SparseCore codec。BarnaCore 是 Viperfish 之前的构造:Jellyfish 的 address handler(BCAH)和 Pufferfish 的 sequencer(BCS)是不同 sequencer 类型,从 Viperfish 起被 SparseCore 替代而消失。完整子核心分类见 [Sub-Core Taxonomy](../targets/sub-core-taxonomy.md)。
---
## 控制流操作矩阵(gen × sequencer-type)
下方矩阵是每个(gen × type)中各控制流操作族的存在性,锚定到 proto 消息类型符号。`✓` = 该 proto 消息类型存在于该代命名空间;`—` = 不存在。
| Gen × Type | Branch Abs/Rel | Branch Indirect | Call Abs/Rel | Call Indirect | 返回形式 | Halt | HaltYield | HaltYieldCond | Delay | Fence | LCC 读取 |
|---|:--:|:--:|:--:|:--:|---|:--:|:--:|:--:|:--:|:--:|:--:|
| **JF TC** | ✓ | ✓ (BTR) | ✓ | ✓ | branch-to-BTR | ✓ | — | ✓ | ✓ | ✓ | — |
| **JF BCAH** | ✓ | ✓ | ✓ | ✓ | implicit / loop | ✓ | — | ✓ | ✓ | ✓ | — |
| **PF TC** | ✓ `ScalarBranch{Abs,Rel}` | ✓ `ScalarBranchReg` | ✓ `ScalarCall{Abs,Rel}` | ✓ `ScalarCallReg` | dest sreg | ✓ | — | — | ✓ | ✓ | — |
| **PF BCS** | ✓ `ScalarBranch{Abs,Rel}` | ✓ `ScalarBranchReg` | ✓ `ScalarCall{Abs,Rel}` | ✓ `ScalarCallReg` | dest sreg | ✓ | — | — | ✓ | ✓ | — |
| **VF TC** | ✓ | ✓ `BranchSreg` | ✓ | ✓ `CallSreg` | branch-to-dest | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **VF SCS** | ✓ + `BranchAbsoluteClearIbuf` | ✓ `BranchSreg` | ✓ (link #5) | ✓ `CallSreg` | branch-to-dest | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **GL TC** | ✓ | ✓ `BranchSreg` | ✓ | ✓ `CallSreg` | branch-to-dest | ✓ | — | ✓ | ✓ | ✓ | ✓ |
| **GL SCS** | ✓ + `BranchAbsoluteClearIbuf` | ✓ `BranchSreg` | ✓ (link #5) | ✓ `CallSreg` | branch-to-dest | ✓ | — | ✓ | ✓ | ✓ | ✓ |
| **GF TC** | ✓ | ✓ `BranchSreg` | ✓ | ✓ `CallSreg` | branch-to-dest | ✓ | — | — | ✓ | ✓ | ✓ |
| **GF SCS** | ✓ + `BranchAbsoluteClearIbuf` + `BranchRelativeRotatingPreg` | ✓ `BranchSreg` | ✓ (link #5) | ✓ `CallSreg` | branch-to-dest | ✓ | — | — | ✓ | ✓ | ✓ |
该矩阵从以下字节级锚定的符号事实恢复:
- **`HaltYield`(无条件)**仅存在于 `vxc::isa::TensorCoreScalarAlu_HaltYield` 和 `vxc::vfc::isa::SparseCoreScalarAlu_HaltYield`——**只有 Viperfish**。
- **`HaltYieldConditional`**存在于 `vxc`(VF TC + SCS)和 `gxc::glc::isa`(GL TC + SCS),并且**不存在于 `gxc::gfc::isa`**——因此 `6acc60406` 完全移除了 yield。
- **`ReadRegisterLccLow` / `ReadRegisterLccHigh`**存在于 `vxc`、`glc`、`gfc`(TC 和 SCS),并且**不存在于 JF/PF**——硬件循环计数器是 Viperfish+ 特性。
- **`BranchAbsoluteClearIbuf`**是只属于 SCS 的 branch,会清除指令缓冲;存在于 `vfc`/`glc`/`gfc` SCS 命名空间,不存在于任何 TC 命名空间。
- **`BranchRelativeRotatingPreg`**和 **`SetRotatingPredicateRegister`**仅存在于 `gxc::gfc::isa::SparseCoreScalarAlu_*`——只属于 `6acc60406` SCS。
- **`ReadRegisterYieldRequest`**位于 `vxc`(VF)和 `glc`(GL)TensorCore,缺失于 `gfc`——确认 `6acc60406` 完全没有 yield 机制。
TAC 和 TEC 不声明自己的 `Branch*`/`Call*` 消息类型;它们的 scalar-ALU 子 bundle(`TacScalarSubBundle`、`TecScalarSubBundle`)嵌入共享的 `SparseCoreScalarAlu_*` 操作消息,并复用 SCS branch/call/halt 集合。它们各自不同的 codec(类型 4 上的 `SparseCoreTacCodecBase`、`SparseCoreTecBundle`)差异在 stream/DMA 字段,而不在控制流操作清单,因此 TAC/TEC 控制流行镜像同一代的 SCS 行。
> **陷阱 — 命名会漂移,必须跨代归一化。** *同一个*操作在 Pufferfish 上是 `ScalarBranchAbsolute`(`pxc::isa::TensorCoreScalar0_ScalarBranchAbsolute`),在 Viperfish+ 上是 `BranchAbsolute`(`vxc::isa::TensorCoreScalarAlu_BranchAbsolute`),在 Jellyfish 上则是 `ScalarOpcode` 枚举值 `8..11`。间接形式在 PF 上是 `ScalarBranchReg`,在 Viperfish+ 上是 `BranchSreg`,在 JF 上是 `ScalarBranchIndirect`。如果重新实现按字面 proto 名称为操作表建键,会把一个逻辑操作当成四个不同操作;应先归一化为与代际无关的 op id。
---
## Jellyfish `ScalarOpcode` 枚举(TC sequencer 子集)
Jellyfish 早于逐操作 proto 消息;它的 TensorCore sequencer 操作是一个扁平 62 项 `ScalarOpcode` 枚举(`ScalarOpcode_descriptor()` @ `0x1fa1fc00`)的值。sequencer 相关子集锚定到 `ProtoUtils` 分类器和 `.rodata` 字符串:
| 范围 | 分类器 | 操作 | 来源 |
|---|---|---|---|
| 8..11 | `IsBranch` @ `0x1e876120` (`op & ~3 == 8`) | `ScalarBranch{Relative,Absolute,Indirect}` + 1 | 字节精确反汇编 |
| 12..15 | `IsCall` @ `0x1e876140` (`op & ~3 == 12`) | `ScalarCall{Relative,Absolute,Indirect}` + 1 | 字节精确反汇编 |
| — | — | `ScalarHalt`, `ScalarHaltOnError`, `ScalarHaltYieldConditional` | 字符串 |
| — | — | `ScalarDelay`, `ScalarFence` | 字符串 |
| — | — | `ScalarReadCycle{Start,End,Low,High}` | 字符串 |
branch 范围 `8..11` 和 call 范围 `12..15` 来自分类器反汇编,字节精确。Jellyfish TensorCore emitter(`JellyfishEmitter`)确认了 JF TC 的完整控制流能力:它有 `EmitScalarBranchWithDelay`、`EmitScalarUnconditionalCallWithDelay`、`EmitScalarIndirectBranchWithDelay`、`EmitScalarHalt`、`EmitScalarHaltYieldConditional` 和 `EmitScalarDelay`——也就是说 Jellyfish TensorCore *不是*没有 call,并且确实有 halt-yield-conditional。Jellyfish BarnaCore address handler(`BarnaCoreAddressHandlerEmitter`)携带同一套 `EmitScalar*` 集合,外加软件循环构建器 `AddressHandlerProgramBuilder::BeginLoop`(`0xfa90d40`)/ `EndLoop`(`0xfa91300`)。
---
## Sync 操作及其位置
sync-flag、barrier 和 atomic 操作是 sequencer 工作的一部分,但它们占用的 slot 随代际不同,并且形成自己的(gen × type)清单:
| Gen × Type | Sync slot | Sync 操作族 | 来源 |
|---|---|---|---|
| JF TC | vector path | `EmitVectorSyncFlag{Set,Add,SetRemote,AddRemote,PublicAccessSet}` | `JellyfishEmitter::*` |
| PF BCS | `Scalar0` **和** `Scalar1` | `Sync{Add,Done,EqualTo,GreaterOrEqualTo,GreaterThan,LessThan,NotEqualTo}` (7) | `BarnaCoreSequencerScalar{0,1}_*` |
| VF SCS / TAC / TEC | 专用 `ScalarMisc` lane | 基础 sync 族(`SetSyncFlag`, `SyncEqual`, `SyncGreaterOrEqual`, `SyncBarrier`, `AddSyncFlag`, `SmemFetchAndAdd`, atomics, `ReadSync*`) | `vfc::isa::SparseCoreScalarMisc_*` |
| GL SCS / TAC / TEC | 专用 `ScalarMisc` lane | 基础族 **+ 双通道**(`AddBothSyncFlag`, `SetBothSyncFlag`, `SetOtherSyncFlag`)**+ `YieldableSync*`** | `glc::isa::SparseCoreScalarMisc_*` |
| 6acc60406 SCS / TEC | 专用 `ScalarMisc` lane | **仅**基础族(移除双通道 + Yieldable)**+ `SetPOrTState`** | `gfc::isa::SparseCoreScalarMisc_*` |
sync 族的代际差异有字节级锚点:双通道操作(`AddBothSyncFlag` / `SetBothSyncFlag` / `SetOtherSyncFlag`)和 `YieldableSync*` 族(`YieldableSyncEqual`、`YieldableSyncGreater`、`YieldableSyncDone`,…)存在于 `gxc::glc::isa`(Ghostlite),但**不存在于 `gxc::gfc::isa`**(`6acc60406`);`6acc60406` 新增了唯一的 `SparseCoreScalarMisc_SetPOrTState`。`ScalarMisc` lane 由 `EmitBarrierSync<Bundle, …ScalarMisc>` 编码——在 Ghostlite 上为 SCS(`0x13a5f100`)、TAC(`0x139f1f80`)和 TEC(`0x13a38600`)实例化——atomic add-return-old 则由 `EmitFetchAndAddOp<…SmemFetchAndAdd>`(`0x13a60e00`)编码。barrier 操作设置 `ScalarMisc` present bit(`orb $0x4`),并通过 `ScalarY` 操作数写入 sflag id/threshold,其立即数形式复用 immediate slot 0。
> **注意 — `ScalarMisc` lane 不同于 `ScalarAlu0` sequencer lane。** 在 Viperfish+ 上,sync 操作不共享 lane-0 sequencer slot;它们占用 SparseCore bundle 中独立的 `ScalarMisc` lane。`ScalarAlu0` lane 负责 PC 变更(branch/call/halt);`ScalarMisc` lane 负责 sync。一个 bundle 可以在同一周期同时发出一个 branch 和一个 sync 操作,因为它们位于不同 lane。Jellyfish 是例外——它的 sync 工作在 vector path 中,而完全不是 scalar lane。
---
## 每代演进摘要
| 代际 | Sequencer 演进(字节级锚定) |
|---|---|
| **Jellyfish v2** | TensorCore 具备完整 Branch/Call(包括通过 BTR 的 indirect)、Halt、HaltYieldConditional、Delay、Fence、ReadCycle。没有 LCC 寄存器;硬件循环是软件 bundle-index 后向 branch(BCAH `BeginLoop`/`EndLoop`)。通过 vector path 做 sync。5 位谓词(15 个寄存器 + always=15 + never=31)。 |
| **Pufferfish v4** | 重命名为 `Scalar` 前缀 + `Reg` 后缀(`ScalarBranchReg`、`ScalarCallReg`)。BCS sequencer 在 `Scalar0` 和 `Scalar1` 中都获得 7 操作 sync 族。没有 LCC 寄存器;没有 HaltYield。 |
| **Viperfish v5p (+v5e lite)** | 移除 `Scalar` 前缀,将 `Reg` 重命名为 `Sreg`,新增显式 `BranchSreg::x()` / `CallSreg::{x,dest}`。在 TC + SCS 上引入硬件 LCC 读取(`ReadRegisterLcc{Low,High}`)、`HaltYield` + `HaltYieldConditional`,并在 SparseCore 引擎上引入专用 `ScalarMisc` sync lane。`BranchAbsoluteClearIbuf` 仅属于 SCS。 |
| **Ghostlite v6e** | 移除无条件 `HaltYield`(保留 `HaltYieldConditional`)。SparseCore `ScalarMisc` 族扩展:双通道 sync(`AddBothSyncFlag` / `SetBothSyncFlag` / `SetOtherSyncFlag`)+ `YieldableSync*` 族。 |
| **`6acc60406` v7** | 完全移除 yieldable 执行(没有 `HaltYield`、没有 `HaltYieldConditional`、没有 `ReadRegisterYieldRequest`、没有 `YieldableSync*`)。移除 TAC sequencer 和双通道 sync 操作。新增仅 `gfc` SCS 拥有的操作 `BranchRelativeRotatingPreg` + `SetRotatingPredicateRegister` 和 `ScalarMisc_SetPOrTState`。新增双谓词(`6acc60406` 条件 branch 可由每个 bundle 的两个谓词之一保护)。 |
---
## 交叉引用
- [Sequencer Slot](slot-sequencer.md) — slot 身份、三层编码模型,以及 branch/call/halt/delay 字段布局。
- [Bundle Model](bundle-model-overview.md) — 以 `(TpuVersion, TpuSequencerType)` 为键的 codec,以及逐代 bundle 宽度。
- [Sub-Core Taxonomy](../targets/sub-core-taxonomy.md) — 完整的逐代子核心 / sequencer 类型清单。