Skip to content

各代 × 类型的 Sequencer 操作

本页中的每个操作名、命名空间、地址和枚举值,均从 libtpu-0.0.40-cp314 wheel 中 libtpu.so 的符号表和 .text 按字节精确读取(BuildID md5 89edbbe81c5b328a958fe628a9f2207d,未 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_BranchRelativegxc::gfc::isa::SparseCoreScalarAlu_CallSreg,某一代要么有该符号,要么没有。命名空间前缀本身就是(gen × type)键——vxc::isa 是 Viperfish TensorCore,vxc::vfc::isa 是 Viperfish SparseCore,gxc::glc::isa 是 Ghostlite,gxc::gfc::isa6acc60406pxc::isa 是 Pufferfish TensorCore,platforms_deepsea::jellyfish::isa 是 Jellyfish。(gxc 配对容易看反:Ghostlite 是 load-core glc6acc60406 是 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 重命名为 SregBranchSreg)。
枚举tpu::TpuSequencerType,6 个值(内部 0..5
ToStringTpuSequencerTypeToString @ 0x20b362e0(索引 off_22010DE0
FromProtoTpuSequencerTypeFromProto @ 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 注册表的第二个键。它的六个值是按字节精确恢复的:TpuSequencerTypeFromProto0x20b36300)将 protobuf 枚举(1..6)映射到内部 C++ 枚举(0..5),而 TpuSequencerTypeToString0x20b362e0)是一个扁平表索引 off_22010DE0[value]0xbdf2878 处的字符串指针长度表给出了每个名称的长度(19, 18, 23, 19, 33, 34),这唯一钉住了六个名称:

内部值Proto 值名称(k…角色代号 / 代际
01kTensorCoreSequencerTC — 主 TensorCore VLIW sequencer所有代
12kBarnaCoreSequencerBCS — Pufferfish BarnaCore sequencerPufferfish
23kBarnaCoreAddressHandlerBCAH — Jellyfish BarnaCore address handlerJellyfish
34kSparseCoreSequencerSCS — SparseCore scalar sequencerViperfish+
45kSparseCoreTileAccessSequencerTAC — SparseCore tile-accessViperfish, Ghostlite
56kSparseCoreTileExecuteSequencerTEC — SparseCore tile-executeViperfish+

该映射就是反编译后 TpuSequencerTypeFromProto 中的字面 switch:

c
// 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 类型清单。