Skip to content

每个代号 compiler_reserved SFLAG 整数

此页面上的所有地址、文件偏移量和整数适用于 libtpu-0.0.40-cp314 轮中的 libtpu.so(构建 ID 89edbbe81c5b328a958fe628a9f2207d,构建 libtpu_lts_20260413_b_RC00;781,691,048 B;附带完整的 C++ 符号)。 .text/.lrodata/.rodata VMA == 文件偏移量; .data.rel.ro 使用 −0x200000 文件偏移量增量,filewrapper_toc 使用 −0x400000 增量。其他版本会有所不同。

摘要

每个 TensorCore 势垒公式中参数化的两个整数 - base (Target+0x8c0) 和 count (Target+0x8c4) - 不是 .text 中的常量。它们是在目标构造时从芯片配置原型中携带的每核心类型 compiler_reserved 重复 int32 范围中读取的,每代芯片一个 (codename, deployment) blob。 base/count的通用公式在屏障 → SFLAG 绑定上直播;原型载体、其 FromProto 接收器和 EnumMap 元素布局位于 SpecialPurposeSyncFlags 上;将 REPLICA 引脚固定到 count − 1 的标准化器位于 InferBarrierConfig 上。 此页面拥有每个代号整数的文字 - 每代实际的 compiler_reserved {base, count} 数字 (jellyfish/dragonfish/pufferfish/viperfish/ghostlite/6acc60406),这些数字物理存储在二进制文件中,以及 Target::Init / SparseCoreTarget::Init 如何将它们解析为两个int32 结构标量。

同级屏障页面将这些整数标记为(“嵌入式内存文件依赖项/不可静态提取”)。 它们实际上是静态可提取的。 芯片配置 blob 编译成 .lrodata/.rodata;所谓的“memfiles”不是运行时加载的——它们是由指向编译数据的加载时 R_X86_64_RELATIVE 重定位填充的。下面的每个每代整数都是直接从嵌入的 blob 字节中提取出来的,并根据编写器反汇编进行交叉检查。这些数字已确认,字节精确。

重新实现,合约为:

  • TC 雕刻是 gen 形状的,而不是 gen 键控的。 compiler_reserved(kTensorCore) 是一个升序连续块,**始终从 base = 8 开始;仅长度不同 — JF/DF (count = 12) 上的 17 整数,PF/VF/GL/GF (count = 38) 上的 43 整数。生成 count−5 是硬编码文字,与生成无关。
  • SC 雕刻在存在的地方是恒定的。 SparseCore 首先在 Viperfish 携带 SpecialPurposeSyncFlags;从 VF 开始,compiler_reserved(kSparseCore)[7055..7154](base = 7055count = 100−5),四个命名标量固定在正上方(7155/7156/7157/7167)。
  • TC sequencer_overlay 标量是唯一的每代,其步骤如下: 2545114095 (0xFE/0x1FF/0xFFF, 2^n − 1n = 8/9/12 形成)。
  • 存储是 .lrodata/.rodata blob + .data.rel.ro FileWrapper 描述符,可通过 9 个 tpu_chip_config_memfile_<deployment>_embed_internal_create 存根(filewrapper_toc 插槽 39–47)和 47 个描述符的超集进行访问在.data.rel.ro 0x2200e350
拥有每个代号 compiler_reserved {base, count} 整数的文字 + 它们的静态存储 + Init 分辨率
TC 雕刻Target::Init @0x1d60fc20base = CR_TC[0] @Target+0x8c0count = |CR_TC| − 5 @Target+0x8c4
SC 雕刻SparseCoreTarget::Init @0x1d612b20base = CR_SC[0] @+0x1d0count = |CR_SC| @+0x1d4(无 −5)
TC 底座(所有代)8
TC 计数12 (JF/DF), 38 (PF/VF/GL/GF)
SC 底座/数量7055 / 100(VF/GL/GF;缺少 JF/DF/PF)
TC sequencer_overlay254 (JF/DF) / 511 (PF/VF/GL) / 4095 (GF)
原型载体TpuChipConfigProto.special_purpose_sync_flags(字段 13)→ compiler_reserved(字段 3,重复 int32)
存储*_chip_configs.binarypb .lrodata/.rodata 中的斑点; FileWrapper 描述符 @.data.rel.ro 0x2200e350
证据等级已确认(从嵌入式 blob 字节雕刻 + 编写器反汇编;更正兄弟页低)

1. 每代SFLAG内存映射

这是权威表。每个单元都是从嵌入的 blob 字节 (§4) 中解码的,并且与 Target::Init / SparseCoreTarget::Init 编写器 (§3) 一致。 TpuVersion proto-wire 值(每个 blob 的字段 1)命名生成;运行时枚举是wire − 1 (TpuVersionFromProto)。

代号原型版TC cr 系列(原始)TC baseTC count (−5)TC可用窗口[base, base+count)TC保留前5名(mega/gap/AR1/AR2/global)TC sequencer_overlaySC cr 系列SC baseSC countSC 本地/全局/seq/tile
JF水母1[8..24] (17)812[8..19]20 / 21 / 22 / 23 / 24254 (0xFE)— (no SC)
DF龙鱼2[8..24] (17)812[8..19]20 / 21 / 22 / 23 / 24254 (0xFE)— (no SC)
PF河豚3[8..50] (43)838[8..45]46 / 47 / 48 / 49 / 50511 (0x1FF)— (no SC)
VF毒蛇鱼4[8..50] (43)838[8..45]46 / 47 / 48 / 49 / 50511 (0x1FF)[7055..7154] (100)70551007155 / 7156 / 7157 / 7167
GL鬼石5[8..50] (43)838[8..45]46 / 47 / 48 / 49 / 50511 (0x1FF)[7055..7154] (100)70551007155 / 7156 / 7157 / 7167
GF6acc604066[8..50] (43)838[8..45]46 / 47 / 48 / 49 / 504095 (0xFFF)[7055..7154] (100)70551007155 / 7156 / 7157 / 7167

读取重新实现者必须从此携带:

  • TC base 是每一代的 8 compiler_reserved(kTensorCore) 范围是升序连续的,并且始终锚定在 8;每代变量是长度(JF/DF → PF 边界处的 1743)。 −5 雕刻 (§3) 在所有世代中都是相同的文字。
  • GlobalBarrier 槽完全等于最后一个 cr 元素。 base + count + 4 = JF/DF 24、PF/VF/GL/GF 50 — 正是 CR_TC[-1]。五个指定的顶部插槽是连续范围的前五个整数;可用的 per-id 窗口是底部的 countSFLAG 绑定 base+count+{0,2,3,4} 公式现在解析为具体数字(例如 GF 全局屏障 = 50、megacore = 46、AR(1) = 48、AR(2) = 49;JF/DF 全局屏障 = 24、megacore = 20)。
  • sequencer_overlay 是高于 TC 范围的单独 SFLAG 标量,也是每代步进的唯一值 (254/511/4095)。它是单个 SFLAG 索引,而不是位掩码 — 请参阅 SpecialPurposeSyncFlags §5.32^n − 1 形式 (n = 8/9/12) 跟踪每代 SFLAG 编号编码宽度,而不是掩码。
  • SparseCore compiler_reserved 首次出现在 Viperfish (v4),此后一直为 [7055..7154]。 SC count 被视为 FULL(无 −5); SC 全局/局部障碍是命名标量 7156/7155,而不是顶级保留。没有一代带有 BarnaCore (core_type = 2) SpecialPurposeSyncFlags 条目。

注意 — 此页面对整数具有权威性。 屏障 → SFLAG 绑定SpecialPurposeSyncFlags 将这些文字标记为低,因为它们仅记录窗口几何形状(雕刻、−5、五槽地图 — 全部与生成无关并在那里确认)并处理每个 (codename, deployment) 整数作为 memfile 依赖项。这些 blob 在 (§2) 中静态编译,并且整数在此处 (§4) 已确认字节精确,因此请使用此页面获取具体数字。


2. 整数存储位置 — 静态嵌入,而非运行时加载

整数位于 *_chip_configs.binarypb blob 内,这些 blob 被编译为只读数据段。 “memfile”抽象是一个静态嵌入包装器,而不是文件系统或网络路径。

2.1 9 个部署名称 memfile 存根 → filewrapper_toc 插槽 39–47

每个 tpu_chip_config_memfile_<deployment>_embed_internal_create() 都是一个两指令存根 (mov rax,[rip+disp]; ret),它返回 filewrapper_toc (VMA 0x224bf798) 内的 toc_ptr 全局值。反编译后的 default 存根字面意思是:

c
// tpu_chip_config_memfile_default_embed_internal_create @0x20b18fa0
char **tpu_chip_config_memfile_default_embed_internal_create() {
    return toc_ptr[0];          // a filewrapper_toc slot pointer
}
```text

槽位索引为`(toc_ptr − 0x224bf798) / 8`;槽描述符携带 blob 的数据指针(`desc+8`,相对重新定位)和大小(`desc+0x10`,原始 `u64`)。此构建的部署→插槽→blob→代号映射:

| Memfile部署 | `create` @ | `toc_ptr` | 插槽 | 斑点 `*_chip_configs_*` || 尺寸 |
|---|---|---|---|---|---|---|
| `default` | `0x20b18fa0` | `0x224bf8d0` | 39 | `6acc60406_tensornode_chip_configs_default` | 6 | 1309 |
| `inference` | `0x20b18fc0` | `0x224bf8d8` | 40 | `6acc60406_chip_configs_inference` | 6 | 1481 |
| `legacy` | `0x20b18fe0` | `0x224bf8e0` | 41 | `6acc60406_tensornode_chip_configs_legacy` | 6 | 1190 |
| `legacy_dense` | `0x20b19000` | `0x224bf8e8` | 42 | `pufferfish_chip_configs_legacy_dense` | 3 | 870 |
| `megacore` | `0x20b19020` | `0x224bf8f0` | 43 | `viperfish_glp_emulation_chip_configs_megacore` | 4 | 985 |
| `megacore_dense` | `0x20b19040` | `0x224bf8f8` | 44 | `pufferfish_chip_configs_megacore_dense` | 3 | 819 |
| `megacore_inference` | `0x20b19060` | `0x224bf900` | 45 | `pufferfish_chip_configs_megacore_inference` | 3 | 786 |
| `megachip` | `0x20b19080` | `0x224bf908` | 46 | `viperfish_chip_configs_megacore` | 4 | 1458 |
| `legacy_sparse_core` | `0x20b190a0` | `0x224bf910` | 47 | `6acc60406_tensornode_chip_configs_legacy_sparse_core` | 6 | 1174 |

memfile名称是*deployment*名称; blob 基本名称嵌入*代号*。在此构建中,9 个 memfile 绑定 `{6acc60406 ×4, pufferfish ×3, viperfish ×2}` — JF/DF/GL 部署不会通过这些存根显示。

### 2.2 完整的 47 个描述符/35 个唯一 blob 注册表

9-memfile TOC 只是一个子集。 **47 `FileWrapper` 描述符**(40 字节步长 `{name@+0, data@+8, size@+0x10, fp@+0x18}`)的超集在 `.data.rel.ro 0x2200e350..0x2200ec00` 处连续打包,其中 `data`/`name` 作为 `R_X86_64_RELATIVE` 重新定位到芯片配置数据簇中(`.lrodata 0x5f01400..`、`.rodata 0xbdc6000../0xbded800..`)和 `size`/`fp` 作为 `.data.rel.ro` 文件映像中的原始字节。遍历它会产生 **35 个独特的 `(codename, deployment)` blob**,分布式 JF 2 / DF 2 / PF 9 / VF 11 / GL 4 / GF 7。因此 **每个运行时 `TpuVersion` 都至少有一个嵌入的 blob** - 文字 SFLAG 范围静态存在于所有六个世代,而不仅仅是通过 memfile 存根出现的三个。 (`47 > 35` 是描述符别名:多个部署为相同的数据 blob 起别名,例如 `megachip` 为 viperfish `megacore` blob 起别名。)

|| 代表斑点 | `FileWrapper` 说明 | 数据 VA(== 文件关闭) | 尺寸 | `fp[:8]` |
|---|---|---|---|---|---|
| JF | `jellyfish_chip_configs_default` | `0x2200e4b8` | `0xbdee4c0` | 848 | `95d58454…` |
| DF | `dragonfish_chip_configs_default` | `0x2200e4e0` | `0xbdee820` | 918 | `ac2ac3da…` |
| PF | `pufferfish_chip_configs_legacy` | `0x2200e490` | `0xbdee0d0` | 996 | `7ff2f7f9…` |
| VF | `viperfish_chip_configs_megacore` | `0x2200ea10` | `0x5f05b70` | 1458 | `6306c936…` |
| GL | `ghostlite_chip_configs_inference` | `0x2200e558` | `0x5f03570` | 1263 | `3ce606ef…` |
| GF | `6acc60406_tensornode_chip_configs_default` | `0x2200e350` | `0x5f01460` | 1309 | `30c55c21…` |

> **注意 — 不是运行时加载的。** 这些 blob 没有 `fopen`/`mmap`/embed-FS 路径。它们被编译成`.lrodata`/`.rodata`;描述符被编译成`.data.rel.ro`;唯一的“加载”是加载时 `R_X86_64_RELATIVE` 重定位,它填充 `name`/`data` 指针和 `toc_ptr` 全局变量。 `FLAGS_deepsea_chip_config_name` @`0x224714b0` 选择*部署*名称,`(TpuVersion, name, TpuCoreType)` 平面哈希映射选择嵌入的 Blob 源 `TpuChipConfig::FromProto` @`0x20aea100`。不需要默认后备常量——文字****嵌入的字节。

---

## 3. `Init` 如何将整数解析为 `{base, count}`

两个雕刻都读取一个 `SpecialPurposeSyncFlags` 元素(通过 `GetSpecialPurposeSyncFlags(core)` — 解析/访问路径归 [SpecialPurposeSyncFlags](special-purpose-sync-flags.md) 所有)并将两个 `int32` 复制到目标对象上。 TC方减五; SC 方则不然。

### 3.1 TensorCore — `Target::Init` (`size − 5`)

```c
// Target::Init @0x1d60fc20 — TC compiler_reserved carve (lines 1969-2068, byte-exact)
SpecialPurposeSyncFlags = GetSpecialPurposeSyncFlags(kTensorCore);   // line 1969
if (!SpecialPurposeSyncFlags)
    DieBecauseNull("chip_config.GetSpecialPurposeSyncFlags("
                   "::tpu::TpuCoreType::kTensorCore)");               // line 1971 — TC entry mandatory

size = element->compiler_reserved.size();                            // v284
data = element->compiler_reserved.data();                            // v286
for (i = 1; i < size; ++i)                                           // contiguity assertion
    CHECK(data[i] == data[i-1] + 1,
          "compiler_reserved_tensor_core_sync_flags[i] =="
          " compiler_reserved_tensor_core_sync_flags[i - 1] + 1");   // line 2018

*((_DWORD *)target + 560) = data[0];   // base  = CR_TC[0]   @Target+0x8c0   line 2067
*((_DWORD *)target + 561) = size - 5;  // count = |CR_TC|-5  @Target+0x8c4   line 2068

data[0] 对于每一代都是 8,所以 base = 8 始终是。 size − 512(JF/DF、17 − 5)或 38(PF+、43 − 5)。连续性 CHECK 保证 base + index SFLAG 编号,这就是 结合公式 是纯算术的原因。

3.2 SparseCore — SparseCoreTarget::Init(无 −5)

c
// SparseCoreTarget::Init @0x1d612b20 — SC compiler_reserved carve (lines 546-547, byte-exact)
SpecialPurposeSyncFlags = GetSpecialPurposeSyncFlags(kSparseCore);          // line 454
*(_DWORD *)(sc_target + 464) = *(_DWORD *)SpecialPurposeSyncFlags[1];       // base  = CR_SC[0]   @+0x1d0  line 546
*(_DWORD *)(sc_target + 468) = *((_DWORD *)SpecialPurposeSyncFlags + 4);    // count = |CR_SC|    @+0x1d4  line 547
// then the four named scalars, each gated by & 0x100000000 (presence bit-32):
//   tile_overlay  -> +488 (0x1e8) ;  sequencer_overlay -> +512 (0x200)
//   global_barrier-> +516 (0x204) ;  local_barrier     -> +520 (0x208)
```text

`SC base = 7055`、`SC count = 100` — 已满。仅当打包元素 qword 的位 32 置位时,四个标量 (`7167`/`7157`/`7156`/`7155`) 才会存储到 `SparseCoreTarget` 字段中;他们的消费者仅使用 SparseCore(请参阅 [SpecialPurposeSyncFlags §5.2](special-purpose-sync-flags.md))。

> **明白了 —** `−5` 仅存在于 TC 路径上。将 `−5` 应用于 SC 范围的重新实现会将可用的 SC 屏障 ID 窗口缩小 5,并破坏 SC 树屏障 id 空间; SC 全局/局部障碍是命名标量 (`7156`/`7155`),而不是顶级保留。

---

## 4. 根据嵌入字节确认整数

每个每代整数都是直接从 blob 的文件偏移量(`.lrodata`/`.rodata` VMA == 文件偏移量)中雕刻出来的。 TC `compiler_reserved` 是 Packed-int32 field-3(每个值 `< 128` 都是单个 varint 字节,因此 `[8..24]`/`[8..50]` 显示为文字字节序列 `08 0918` / `0832`); `sequencer_overlay` 是字段 4(标签 `0x20`)作为 LE 变体; SC 范围 `[7055..7154]` 是打包的两字节 LE 变体。每代的调查结果:

|| Blob @ 文件关闭 | TC `cr` 字节运行 | `seq_overlay` 标记字节 | SC `cr` 打包运行 |
|---|---|---|---|---|
| JF | `0xbdee4c0` (848) | `08..18` (`[8..24]`) 礼物 | `20 FE 01` (`254`) 礼物 ||
| DF | `0xbdee820` (918) | `08..18` (`[8..24]`) 礼物 | `20 FE 01` (`254`) 礼物 ||
| PF | `0xbdee0d0` (996) | `08..32` (`[8..50]`) 礼物 | `20 FF 03` (`511`) 礼物 ||
| VF | `0x5f05b70` (1458) | `08..32` (`[8..50]`) 礼物 | `20 FF 03` (`511`) 礼物 | `[7055..7154]` 存在 |
| GL | `0x5f03570` (1263) | `08..32` (`[8..50]`) 礼物 | `20 FF 03` (`511`) 礼物 | `[7055..7154]` 存在 |
| GF | `0x5f01460` (1309) | `08..32` (`[8..50]`) 礼物 | `20 FF 1F` (`4095`) 礼物 | `[7055..7154]` 存在;标量 `F3 37`/`F4 37`/`F5 37`/`FF 37` (`7155`/`7156`/`7157`/`7167`) 全部存在 |

雕刻的范围正是 `Init` writers3) 副本的输入。三个独立的解码器一致:手写的打包变体解码器、每个 blob 的 `protoc --decode_raw`(字段 13 通过打包 `compiler_reserved` + 标量可见)以及编写器反汇编。 blob 顶级为 `TpuChipConfigProto`(存在字段 12 `memory_reservations`、字段 13 `special_purpose_sync_flags`); `SpecialPurposeSyncFlags` 字段模式(`f1 core_type` 枚举 `.tpu.TpuCoreTypeProto`、`f3 compiler_reserved` 重复 int32、`f4`–`f7` 标量)从嵌入描述符重新解码并匹配 [SpecialPurposeSyncFlags §1](special-purpose-sync-flags.md)。

---

## 5. 部署级差异和边缘情况

在所有 35 个唯一 blob 中,TC `cr` 范围和 TC `sequencer_overlay` 仅取决于生成,而不取决于部署名称(`default`/`inference`/`legacy`/`legacy_dense`/`megacore`/ `megacore_dense`/`megacore_inference`/`megachip`/`legacy_sparse_core`/`lite`)。重新实现者不应过度概括两个部署级事实:

- **`viperfish_glp_emulation_chip_configs_*` Blob 携带空 SC 边缘情况。** 五个 GLP 仿真 Blob (`legacy`/`legacy_sparse_core`/`megachip`/`megachip_tccontrol`/`megacore`) 携带 SC `SpecialPurposeSyncFlags` 与 **空 `compiler_reserved` (`count = 0`)** 但四个命名标量仍然设置 (`7155`/`7156`/`7157`/`7167`)。因此,GLP 仿真超级核心 SC 没有可用的屏障 ID 范围 (`SparseCoreTarget+0x1d4 == 0`),但保留其覆盖/屏障标量数。
- **`pufferfish_lite` / `viperfish_lite` 重复使用父代 TC 系列**(lite 是没有 SC 的 PF-/VF 版本)。 `megachip`(部署)是 `viperfish_chip_configs_megacore` blob 的别名,因此此版本上的 `megachip` 是具有完整 SC `[7055..7154]` 的 VF-megacore 配置。

> **QUIRK —** 因为给定代的所有 35 个嵌入式 blob 共享相同的 TC `cr` + `seq_overlay`(以及存在的 SC),所以每代整数*在此构建中*是部署不变的。未来的 libtpu 原则上可以发布具有不同 `cr` 长度的部署(仅从该二进制文件无法测试),但此构建中的任何内容都不会因部署而改变 SFLAG 范围。

---

## 6. 什么保持低/开放

> 每代 `compiler_reserved` `{base, count}` 整数(TC `base = 8` 所有代、`count = 12`/`38`;SC `base = 7055`、`count = 100`)、TC `sequencer_overlay` 值 (`254`/`511`/`4095`)、SC 命名标量 (`7155`/`7156`/`7157`/`7167`)、静态嵌入存储(`.lrodata`/`.rodata` blob + `.data.rel.ro` 描述符 + memfile-stub TOC 插槽 39-47),以及 `Target::Init` (`size − 5`) / `SparseCoreTarget::Init`(无 `−5`)分辨率已确认 —从嵌入的 blob 字节中提取并与编写器反汇编进行匹配。这些是权威整数(兄弟页面将它们标记为低只是因为它们不雕刻 blob)。
>
> **[低] 未清项目,范围超出本页:**
>
> - **四个命名标量**在 `EnumMap` 元素 (`+0x20..+0x3c`) 内的运行时放置以及 `FromProto` 是否当场消耗任何内容 — 由 [SpecialPurposeSyncFlags](special-purpose-sync-flags.md) 拥有;原型**在这里被确认,元素偏移量在那里读取。
> - **为什么 `sequencer_overlay` 步 `2545114095`。** `2^n − 1` 形式 (`n = 8/9/12`) 归因于每代 SFLAG 数字编码宽度,而不是作为单个二进制文字读取;索引非位掩码结论已确认([SpecialPurposeSyncFlags §5.3](special-purpose-sync-flags.md)),宽度是推断的。
> - **跨构建可达性:**此构建嵌入 35 个 blob,但通过 memfile 仅显示 9 个 blob。正在运行的编译器实际上可以选择哪些 `(codename, deployment, core)` 元组(即 JF/DF blob 是活的还是死的)取决于 `(TpuVersion, name, TpuCoreType)` 映射总体,此处不进行跟踪。

---

## 交叉引用

### 屏障算法(本节)

- [屏障和同步标志 — 剖面图](overview.md) — 子系统图; §5 总结了 SFLAG 窗口和这些整数
- [屏障 → SFLAG 绑定](barrier-to-sflag-binding.md) — `base+count+{0,2,3,4}` 公式这些整数参数化;使用 §1 表解析为具体数字
- [SpecialPurposeSyncFlags](special-purpose-sync-flags.md) — 原型载波、`FromProto` 接收器、`EnumMap` 元素和四个命名标量的元素偏移
- [InferBarrierConfig](infer-barrier-config.md) — 将 `REPLICA` 固定到 `id = count − 1`(顶部可用 TC id)和 `GLOBAL` 固定到 `id =1` 的标准化器
- [屏障着色](barrier-coloring.md) — 分配索引** `[base, base+count)` 的每键 `CUSTOM` id 的引擎
- [全局屏障窗口](global-barrier-window.md) — Mosaic 功能级 TC 树屏障; ****读取 `base+count+4` 的一个“全局”路径
- [每代远程 SFLAG 编码器](remote-sflag-encoders.md) — SFLAG 数字空间的跨芯片侧

### 同级子系统

- [SFLAG 同步标志层](../memory/sflag-protocol.md) — 每个 SFLAG 数字索引的片上原子计数器基板
- [返回索引](../index.md)