每代比较矩阵
此页面上的每个每代常量都是从
libtpu-0.0.40-cp314轮中的libtpu.so中精确字节解码的(构建libtpu_lts_20260413_b_RC00,BuildID md589edbbe81c5b328a958fe628a9f2207d)。二进制文件并未被剥离——每个访问器都是一个经过分解的 C++ 名称;.text/.rodata/.lrodata映射 VMA == 文件偏移量,.data.rel.ro映射 VMA −0x200000== 文件偏移量。其他版本会有所不同。
摘要
本附录是 libtpu.so 所了解的每一代 TPU 的单一主表 — jellyfish (v2)、dragonfish (v3)、pufferfish (v4, + v4 lite)、viperfish (v5p, + v5e lite)、ghostlite (v6e)、6acc60406 (v7) — 重新实现者需要在每个恢复的硬件常量上并排建模一代:捆绑字节大小、通道/子通道/块几何结构、MXU / XLU / IAR 执行单元计数和尺寸、每层内存容量(VMEM、 SMEM、SFLAG、CMEM、HBM)、成本模型三重奏(LatencyTable / CycleTable / Performance 子类)、本地 DMA 带宽、ICI/PCIe 带宽、加速器核心类型(BarnaCore 与 SparseCore,带有 SCS/TAC/TEC 定序器拆分)以及三个独立版本序号。每列的深度推导都位于专用的成本/ISA/目标页面上;该页面是这些页面指向的跨代索引。
三个事实使得合并值得在一页上进行。首先,几乎每个芯片的几何常量都来自同一个源——嵌入式 <codename>_chip_parts.binarypb 原型,由 TpuChipParts::DefaultsForVersion (0x20b1b040) 选择并在启动时具体化到运行时 Target / TpuTopology 对象中——因此整个矩阵锚定到一个加载路径,而不是分散的 C++ 文字。其次,每代“看起来”的两个常数实际上是稳定的(每代 lane_count = 128、sublane_count = 8、iar_count = 2);真正的每代 ISA 几何旋钮是 mxu_count (1→2→4→4→2→2) 和 xlu_count (1→1→2→3→2→2)。第三,成本模型在硅架构接缝处将 6 个版本折叠到 5 个类边界上:v2 和 v3 共享一个 LatencyTable 类(仅通过 DeviceIdentifiers 比较分为 PerformanceJf/PerformanceDf),而 v6e 和 v7 在不同的包装类后面共享 GhostlitePerformance。下面的矩阵使这些合并变得明确。
对于导航,合约是:
- 主矩阵每代一行,标题常数作为列,每行携带一个置信度。这是规范查找;其余的维基链接在这里。
- 分组详细表,然后按子系统(几何结构、计算单元、内存层、成本模型类、互连和 BarnaCore↔SparseCore 枢轴)拆分矩阵,因为没有单个 30 列表是可读的。
- 标注 标记陷阱:在运行时通过字符串比较决定的 Viperfish std/lite 变体分割、v7
6acc60406丢弃 TAC 序列器、仅v4的 CMEM 层以及此构建真正无法确认的单元。
| 版本轴(内部) | tpu::TpuVersion 0..5 — TpuVersionToString @ 0x20b3a480,表 off_22011BF0(6 点) |
| 每芯片几何源 | <codename>_chip_parts.binarypb → TpuChipParts::DefaultsForVersion @ 0x20b1b040 → FromProto |
| 几何缓存 | tpu::TpuTopology ctor@0x20acee60(车道→+0x198,副车道→+0x1a0);通过 Target[+0x3b8] 读取 |
| ISA 几何源 | VectorIsa 子消息 (mxu/xlu/iar) → Target+0x4ac/+0x4b0/+0x4a8 |
| 成本模型工厂 | LatencyTable::Create @ 0x1c89fba0(版本索引); CycleTable::Create @ 0x1c89cc00(目标键控) |
| 信心 | 已确认(字节锚定),除非单元格或标注另有说明 |
主每代矩阵
每代一行,按 tpu::TpuVersion 顺序。单元格是每个芯片(单张量节点)的标题值;精简版和全芯片增量位于下面的分组表中。 置信度列适用于整行的二元锚定单元格。
| 一代 | TpuVer | 编解码器 | 捆绑包 | 巷×子 | 块/瓷砖 | MXU(计数×几何) | XLU | IAR | VMEM | SMEM | SFLAG | CMEM | 加速核心 | 成本三重奏 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 水母 v2 | 0 | jxc | 41 B | 128×8 | 16 | 1 × 128² | 1 | 2 | 16 MiB | 16 KiB | 1 KiB | — | BarnaCore ×2 | JF / Jf / PerformanceJf |
| 龙鱼 v3 | 1 | jxc | 41 B | 128×8 | 16 | 2 × 128² | 1 | 2 | 16 MiB | 16 KiB | 1 KiB | — | BarnaCore ×2 | JF / Jf / PerformanceDf |
| 河豚 v4 | 2 | pxc / pfc | 51 B | 128×8 | 16 | 4 × 128² | 2 | 2 | 16 MiB | 1 MiB | 2 KiB | 128 MiB | BarnaCore ×4 | PF / Pf / PufferfishPerformance |
| Viperfish v5p | 3 | vxc / vfc | 64 B | 128×8 | 16 | 4 × 128² | 3 | 2 | 64 MiB | 1 MiB | 2 KiB | — | SparseCore ×4 | VF / Vf / ViperfishPerformance |
| Ghostlite v6e | 4 | gxc / glc | 64 B | 128×8 | 16 | 2 × 256² | 2 | 2 | 128 MiB | 1 MiB | 2 KiB | — | SparseCore ×2 | GL / Glc / GhostlitePerformance |
| 6acc60406 v7 | 5 | gxc / gfc | 64 B | 128×8 | 16 | 2 × 256² | 2 | 2 | 64 MiB | 1 MiB | 16 KiB | — | SparseCore ×2 | Gf / Gfc / GhostlitePerformance |
注意 — v7
6acc60406blob 在此版本中提供(单芯片tensornode和 2 芯片全芯片变体),因此其内存/ISA 常量直接从原始线字节解码。 v2–v6e blob 也嵌入在此版本中(总共 9 个chip_parts.binarypbblob,在.rodata中的0xbdf29a0..中连续),因此旧一代的车道/子车道/MXU/内存值同样是原始来源的,而不是推断的 -chip_partsHBM/VMEM/SMEM/SFLAG 字节、MXUVectorIsa和每代频率都是可实现的。成本模型类别选择(LatencyTable/CycleTable/Performance)完全由TpuVersion序号通过上述两个工厂决定。明白了 —
lane_count(128)、sublane_count(8) 和iar_count(2) 不会随一代一起成长。预计通道宽度在 v5/v7 处加宽(如 HBM 时钟和 VMEM 所做的那样)的重新实现者会对每个图块循环进行错误建模。当原型省略字段时,车道/子车道增长是TpuTopologyctor (0x20acee60) 安装为128/8的“持续后备”;每个 blob 还显式地携带128/8,因此两条路径一致。唯一的每代VectorIsa增量是mxu_count和xlu_count。
几何 — 车道/子车道/块
转置/平铺几何体是缓存在 TpuTopology 上的 chip_parts 属性,通过 Target 访问器读取。整个矩阵在各代之间的数值相同,因为每个 blob 的 TensorCore VectorIsa 报告 lane_count = 128,sublane_count = 8。
| 常数 | 配件 | 值(所有世代) | 源码 |
|---|---|---|---|
LaneCount | Target::LaneCount @ 0x1d60f400 | 128 | *(Target[+0x3b8] + 0x198) ← VectorIsa.lane_count |
SublaneCount | Target::SublaneCount @ 0x1d60f300 | 8 | *(Target[+0x3b8] + 0x1a0) ← VectorIsa.sublane_count |
ChunksPerTile | Target::ChunksPerTile @ 0x1d60f2c0 | 16 | LaneCount / SublaneCount(idiv,32位快速路径) |
| Tile 元素计数 | TpuTopology[+0x1a8] | 1024 | LaneCount × SublaneCount(构造函数@0x20acf2e8) |
写入路径明确:平台 has-TensorCore 字节 (topo[+0x80]) 上的 TpuTopology 构造函数 (0x20acee60) 门,读取 CoreParts(TENSOR_CORE).SequencerParts(0).vector_isa(),检查矩阵单元 has-bit,然后存储 LaneCount ← vector_isa[+0x0] (@0x20acf2bc) 和 SublaneCount ← vector_isa[+0x4] (@0x20acf2c6),硬编码的 128/8 后备位于@0x20acf2cc/@0x20acf2dc。然后,Target::Init (0x1d60fc20) 将 TpuTopology* 安装在 Target[+0x3b8] (mov [rcx+0x3b8],rdi) 处。
注意 — 车道/子车道几何形状 不是 由
tpu::TpuChipConfig::Create(0x20ae98e0) 编写。TpuChipConfig::Create通过kChipConfigAliases平面图 (0x2200b8b0) 解析配置别名并构建驱动程序端内存/队列布局;它不接触LaneCount/SublaneCount。几何图形是TpuChipParts/TpuTopology属性,由 MXUVectorIsa中的TpuTopologyctor 编写。MaximumNumberOfChunks中的cfg是TpuTopology对象(Target[+0x3b8]),而不是单独的配置结构。注意 — 哪一代读取哪个
kChipConfigAliases条目。kChipConfigAliases(0x2200b8b0) 不是由运行时探测的设备字符串键入的;它是一个静态gtl::flat_map<tpu::TpuVersionAndVariant, MapView<string_view, string_view>>,恰好有 四个 内联条目,由TpuVersion序数 {2, 3, 4, 5} 键入 - 每个条目都有变体"default"(版本字段是每个 48 字节条目+0x0的文字字节:02/03/04/05,在.data.rel.ro中字节确认)。TpuChipConfig::Create(TpuVersion, string_view variant)(0x20ae98e0) 查找与gtl::flat_map::find(0x20afd7c0) 的配对并返回该版本的别名子映射。四个子地图的别名词汇为default、legacy、megacore、megachip、megachip_tccontrol(.rodatastring_views at0x84f7d8c/0x84be65c/0x86a44a9/0x85c5f87/0x861b61d)。 v4 和 v5 条目(TpuVersion4 和 5)共享一个 MapView 支持(两个条目+0x28都重新定位到0x2200b9b0),因此这两代通过相同的子映射解析别名。因此,消费者分割是完全静态的并且按TpuVersion进行;每个类型擦除的 MapView 中的确切键→值对是唯一的残差。 [置信度:对于 4 条目版本键控结构、变体 ="default"键、别名词汇表和 v4/v5 共享子映射,为高 — 所有字节均从.data.rel.ro/.rodata+find调用站点读取; MEDIUM 表示内部对方向。请参阅 TpuVersion ↔ 代号矩阵 用于序号→代号绑定。] 因此,
MaximumNumberOfChunks(VxposeMode, n) (0x1d60f200) 是完全数字的,并且在各代中都是相同的(ElementCount 表 0xb53c830 = {1,2,4,1,2}):B32 → 16,CompressedB16 → 8, CompressedB8 → 4、SegmentedB32 → n/8、SegmentedB16 → n/16。
计算单元 — MXU / XLU / IAR
这三个计数来自 TensorCore VectorIsa 子消息(TpuSequencerPartsProto 字段 5),从每个 blob 的线字节逐字段渲染。每代仅 mxu_count 和 xlu_count 有所不同; iar_count 到处都是 2。
TpuVer | 代 | mxu_count (f5) | xlu_count (f6) | iar_count (f7) | MXU 收缩压暗淡 | FLOPS-衍生MXU |
|---|---|---|---|---|---|---|
| 0 | 水母v2 | 1 | 1 | 2 | 128×128 | 1 × 128² |
| 1 | 龙鱼v3 | 2 | 1 | 2 | 128×128 | 2 × 128² |
| 2 | 河豚 v4 | 4 | 2 | 2 | 128×128 | 4 × 128² |
| 3 | Viperfish v5p | 4 | 3 | 2 | 128×128 | 4 × 128² |
| 4 | Ghostlite v6e | 2 | 2 | 2 | 256×256 | 2 × 256²(覆盖) |
| 5 | 6acc60406 v7 | 2 | 2 | 2 | 256×256 | 2 × 256²(覆盖) |
每代的 VectorIsa 线流是一个 11 字节 varint 块 10 80 01 (lane=128) · 18 08 (sublane=8) · 28 <m> (mxu) · 30 <x> (xlu) · 38 02(iar);标签 0x20(issue_latency_cycle_count,字段 4)从不存在(请参阅下面的 GOTCHA)。所有三个计数均达到运行时 Target:Target::Init (0x1d60fc20) 将 vector_isa()+0xc 读取为一个 QWORD 打包 {mxu_count, xlu_count} → Target+0x4ac/+0x4b0,且 vector_isa()+0x14 = iar_count → Target+0x4a8。 Target+0x4ac (mxu_count) 由 SDC 检查器 MXU 序列注入器 (mov eax,[rax+0x4ac] @ 0x144fca07) 消耗;这不是一片死地。
v6e/v7 下降到 mxu_count = 2(从 v4/v5 的 4)通过 GhostliteTarget C++ 将收缩/非收缩矩阵维度覆盖为 256(相对于基数 128)进行补偿:v6e/v7 使用 2 × 256×256 v4/v5 使用 4 × 128×128 的脉动阵列,产生可比较的每周期峰值 MAC。 256×256 覆盖是 C++ 访问器文字,因此为 HIGH 而不是 CERTAIN — 原始 lane_count 保持为 128。
注意 — 对于 v2/v3/v4,FLOPS 交叉验证同时引脚
mxu_count和 TensorCore 时钟:峰值 BF16 =2 × mxu_count × 128² × freq_MHz·1e6在 1 % 内重现 C++FlopsPerSecond文字(v2 1·700 MHz → 22.9 T vs 22.8 T;v3 2·940 MHz → 61.6 T 与 61.4 T;v4 4·1050 MHz → 137.6 T 与 137 T)。 v5p/v6e/v7 峰值使用 256² 覆盖加上每个数据类型的降低精度梯形图,因此简单的128²公式不再适用。明白了 —
issue_latency_cycle_count(VectorIsa字段 4)在每个嵌入的 blob 中都不存在(原始默认值 0)。重新实现者不得**从chip_parts读取 MXU/VPU 问题延迟;真正的每代问题延迟存在于成本模型Performance网格中,通过CycleTable::GetCyclesForThroughput(每代 vtable 插槽+0x10)进行查询。chip_parts字段存在于架构中,但从未在此版本中填充。
内存层
每个芯片(单张量节点)容量。 VMEM、SMEM、SFLAG、HBM为chip_parts Memory/SharedMemory子消息; CMEM 是 SharedMemory[CMEM] 的上一代产品。 MemBanks 列是 C++ 梯形访问器(每个内存空间的存储体计数)。
| 等级 | v2 JF | v3 DF | v4 PF(标准/精简版) | v5p VF(标准/精简版) | v6e GL | v7 6acc(模具/完整) |
|---|---|---|---|---|---|---|
| HBM(总计) | 16 GiB | 32 GiB | 32 GiB / 8 GiB | 96 GiB / 16 GiB | 31.5 GiB | 95 GiB / 190 GiB |
| HBM字 | 1024 B | 1024 B | 512 B | 32 B / 512 B | 32 B | 32 B |
| HBM时钟 | 1400兆赫 | 1800兆赫 | 2400兆赫 | 3600 / 3200 MHz | 6400兆赫 | 7200兆赫 |
| HBM 黑白/堆栈 | 0.317 TB/s | 0.430 TB/s | 0.982 / 0.492 TB/s | 2.350 / 0.738 TB/s | 1.638 TB/s | 3.686 TB/s |
| VMEM / TC | 16 MiB | 16 MiB | 16 MiB | 64 / 128 MiB | 128 MiB | 64 MiB |
| VMEM字 | 512 B | 512 B | 512 B | 512 B | 512 B | 512 B |
| SMEM(TC) | 16 KiB | 16 KiB | 1 MiB | 1 MiB | 1 MiB | 1 MiB |
| SFLAG (TC) | 1 KiB | 1 KiB | 2 KiB | 2 KiB | 2 KiB | 16 KiB |
| CMEM | — | — | 128 MiB | — | — | — |
| IMEM bundle_count | 65536 | 65536 | 65536 | 65536 | 65536 | 65536 |
| 寄存器 SREG/VREG/PREG/VMREG | 32/32/15/8 | 32/32/15/8 | 32/32/15/8 | 32/64/14/16 | 32/64/14/16 | 32/64/14/16 |
| DMA颗粒 | 1024 B | 1024 B | 512 B | 32 B / 512 B | 32 B | 32 B |
max_single_host_dma | 8 MiB | 16 MiB | 2 GiB | 128 GiB | 64 GiB | 32 GiB |
MemBanks 梯形图(C++ 访问器;每个 MemorySpace 的存储体计数,从 FATAL-vs-return 结构解码):
MemBanks(space) | v2/v3 (JellyfishTarget @ 0x1d48fc80) | v4(PufferfishTarget @ 0x1d493900) | v5p (ViperfishTarget @ 0x1d4999c0) | v6e/v7 (GhostliteTarget @ 0x1d4969c0) |
|---|---|---|---|---|
| VMEM(空间3) | 8 | 16 | 32 | 32 |
| CMEM(空间4) | 致命 | 32 | 致命 | 致命 |
| SMEM(空格5) | 2 | 8 | 8 | 8 |
QUIRK — CMEM 仅在 Pufferfish (v4) 上是一流的。
PufferfishTarget::MemBanks是接受内存空间 4 的单个梯形图 — 它计算idx = space − 3并为空间 3/4/5 索引 3 条目表{16, 32, 8}(0xb5305c8),因此 CMEM (4) 返回 32 个库。其他每一代的MemBanks要么测试space == 3 || space == 5和 FATAL(水母/龙鱼、@0x1d48fc80),要么将空格 4 从其有效范围中排除。这是双重编码的:v4 也是chip_parts携带SharedMemory[CMEM](128 MiB、1050 MHz、2.151 TB/s)的唯一一代,也是唯一具有 CMEM 本地 DMA 带宽行的一代。对于除 v4 之外的每个代,重新实现者在 CMEM 上都必须是 FATAL。注意 — 寄存器文件在 v5p 处变宽,而不是逐渐变宽:v2/v3/v4 TensorCore 携带 SREG 32 / VREG 32 / PREG 15 / VMREG 8; v5p/v6e/v7 携带 SREG 32 / VREG 64 / PREG 14 / VMREG 16 (VREG 加倍,VMREG 加倍,PREG 下降 1)。 VMEM 也不会单调增长 — 单 TensorCore lite/v6e 芯片每核心的 VMEM 数量(v5e/v6e 上为 128 MiB)比双核 v7 (64 MiB) 多,因为 VMEM 是按 TensorCore 计算的,并且 lite 芯片具有更少的核心来共享芯片区域。
成本模型三重奏
每一代都会选择一个 LatencyTable 子类(边缘/延迟模型)、一个 CycleTable 子类(吞吐量模型)和一个 Performance 后端(数字网格)。选择是通过两个不同的工厂机制按 TpuVersion 顺序进行的; 6 个版本折叠到 5 个类别边界。
TpuVer | 代 | LatencyTable 子类 | LT尺寸 | LT 虚拟表 | CycleTable 子类 | Performance 后端 |
|---|---|---|---|---|---|---|
| 0 | 水母v2 | LatencyTableJellyfish | 0x58 | 0x21c202d0 | JfCycleTable | PerformanceJf (isa) |
| 1 | 龙鱼v3 | LatencyTableJellyfish | 0x58 | 0x21c202d0 | JfCycleTable | PerformanceDf (isa) |
| 2 | 河豚 v4 | LatencyTablePufferfish | 0x1e0 | 0x21c20320 | PfCycleTable | PufferfishPerformance |
| 3 | Viperfish v5p | LatencyTableViperfish | 0x1e0 | 0x21c203f0 | VfCycleTable | ViperfishPerformance |
| 4 | Ghostlite v6e | LatencyTableGhostlite | 0x1e0 | 0x21c20698 | GlcCycleTable | GhostlitePerformance |
| 5 | 6acc60406 v7 | (匿名-ns gf LatencyTable) | 0x1e0 | 0x21c20920 | GfcCycleTable | GhostlitePerformance(共享) |
两个工厂:
LatencyTable::Create(TpuVersion)(0x1c89fba0) 是直接版本-索引InlinedVector注册表 (registry@0x225799f8):签名检查version >= 0,边界检查version < registry->size(),SOO 缓冲区选择,条目步长0x20,工厂指针位于[entry+0x18],然后是call。注册表由来自 5 个 TU (latency_table_{jf,pf,vf,gl,gf}.cc) 的静态初始化时的 6 个Register()调用填充 -jf.cc将 v0 和 v1 注册到LatencyTableJellyfish上。CycleTable::Create(Target const&)(0x1c89cc00) 是并行但不同的机制:在Target[+0x398]= 上键入的FunctionRegistry(互斥锁保护的FlatHashMap、0x225799e8)TpuVersion。六个注册,JfCycleTable同时服务 v2 和 v3。
QUIRK — v2-vs-v3 分割在
LatencyTable或CycleTable类中不 — 两个版本都实例化LatencyTableJellyfish(插槽 0 和 1)和JfCycleTable。实际的 JF→DF 成本增量来自Performance::CreateTensorCore(0x1d4927e0),它将DeviceIdentifiers与kJellyfishIdentifiers(0xbdf3c0c) →PerformanceJf,否则kDragonfishIdentifiers(0xbdf3c18) →PerformanceDf。同样,v6e 和 v7 在不同的LatencyTable/CycleTable包装类后面共享GhostlitePerformance— 这正是它们的VectorIsa字节相同的原因 (mxu=2/xlu=2/iar=2) 及其三角估计比赛。重新实现者对每代成本进行建模必须在硅架构接缝上进行划分,而不是在 6 路版本枚举上进行划分。注意 — v7 (
Gfc)LatencyTable是latency_table_gf.cc中的匿名命名空间类型 — 没有命名的 typeinfo 符号,因此其精确的 C++ 类名是不可恢复的(因此为 HIGH,而不是 CERTAIN)。其vtable(0x21c20920)、ctor(0x1c8b9520)、VectorRawHazardCycles= 7(0x1c8b9c80)、GhostlitePerformance委托均已确认;只有源类名未知。
互连 — ICI / PCIe / 本地 DMA 带宽
ICI 和 PCIe 带宽是 C++ Target 访问器文字(每个都返回立即的 IEEE-754 双精度)。本地片上 DMA 带宽矩阵按代号 LocalDmaBandwidth* 覆盖;基本 Target 访问器返回 0(使用默认成本模型)。
| 公制 | v2 JF | v3 DF | v4 PF | v5p VF | v6e GL |
|---|---|---|---|---|---|
IciGigabytesPerSecond | 123.8 | 164.0 | 89.6 | 186.7 | 186.7 |
PcieUnidirectionalBytesPerSecond | 16 GB/s | 16 GB/s | 16 GB/s | 16 GB/s | 32 GB/s |
| FLOPS BF16(每个芯片) | 22.8 T | 61.4 T | 137 T | 197 T | 918 T |
| 超越数/秒(每个 TC) | 717 G | 963 G | 537.75 G | 1.536 T | 1.792 T |
本地 DMA 带宽(GB/s,C++ 文字;选定的行 — 完整矩阵位于深层页面上)。基Target::LocalDmaBandwidth*返回0;每个代号子类都会用直接双精度数覆盖活动单元格。
| 源 → 目标 | v3 DF | v4 PF | v5p VF(标准) | v5e VF-lite | v6e GL |
|---|---|---|---|---|---|
| HBM → VMEM | 423 | 481 | 1198 | 822 | 1285 |
| VMEM → HBM | 423 | 1111 | 1224 | 828 | 1432 |
| HBM → SMEM | — | 34 | 55 | 56 | 55 |
| VMEM → CMEM | — | 1121 | — | — | — |
| CMEM → VMEM | — | 2339 | — | — | — |
| SPMEM → HBM | — | — | 587.4 | (587.4) | 588 |
明白了 — Viperfish 在带宽访问器内有一个 运行时 std/lite 分支。
ViperfishTarget::LocalDmaBandwidthHbmToVmem(0x1d49a380) 加载变体字节,检查variant != 4→ 返回标准值0x4092B80000000000(1198.0),然后将变体字符串 dword 与0x65746C6C("ltil"Little-endian = 的尾部)"lite") 并为 lite die 返回0x4089B00000000000(822.0)。因此,一种 C++ 方法同时服务于 v5p(std,返回 1198)和 v5e(viperfish_lite,返回 822);重新实现者不能将 v5p 和 v5e 视为单独的Target子类 - 它们是具有字符串比较分支的一个类。 Jellyfish (v2) 不会覆盖这些内容,因此所有LocalDmaBandwidth*返回基数 0。
加速器核心 — BarnaCore ↔ SparseCore Pivot
嵌入/重复数据删除加速器在 v5p 处更改类型。 v2/v3/v4搭载BARNA_CORE核心(前SparseCore引擎); v5p/v6e/v7 搭载 SPARSE_CORE 内核。 lite 芯片(pufferfish_lite、viperfish_lite)两者都不发货——它们是仅 TensorCore 的单核芯片。
TpuVer | 代 | Accel核心型 | 计数/芯片(标准) | 测序仪 | TEC VectorIsa 车道×子 |
|---|---|---|---|---|---|
| 0 | 水母v2 | BARNA_CORE | 2 | BC_SEQ + 16× BC_ADDR | 1×8 (BC_ADDR) |
| 1 | 龙鱼v3 | BARNA_CORE | 2 | BC_SEQ + 16× BC_ADDR | 1×8 (BC_ADDR) |
| 2 | 河豚 v4 | BARNA_CORE | 4 | BC_SEQ + 16× BC_ADDR | 1×8 (BC_ADDR) |
| 3 | Viperfish v5p | SPARSE_CORE | 4 | SC_SEQ + 16× SC_TAC + 16× SC_TEC | 8×1 (SC_TEC) |
| 4 | Ghostlite v6e | SPARSE_CORE | 2 | SC_SEQ + 16× SC_TAC + 16× SC_TEC | 8×1 (SC_TEC) |
| 5 | 6acc60406 v7 | SPARSE_CORE | 2(模具)/4(完整) | SC_SEQ + 16× SC_TEC(无 TAC) | 16×1 (SC_TEC) |
运行时 tpu::TpuSequencerType 枚举为 SC_SEQ = 4、SC_TILE_ACCESS_CORE (TAC) = 5、SC_TILE_EXECUTE_CORE (TEC) = 6(在 BarnaCore 端,BC_SEQ = 2、BC_ADDR = 3) — TpuSequencerTypeToString 表编号用于确定每个引擎资源数组的大小。编解码器/ISA 页面使用的 编解码器模板参数 编号相差一位(编解码器形式省略了 INVALID 插槽):{SCS=3, TAC=4, TEC=5}(和 BARNA=1/BARNA_ADDR=2)。仅使用 +1 交叉两个编号;参见 getSequencerType。非 TensorCore 定序器不携带矩阵单元,因此它们的 VectorIsa 仅是通道/子通道 - SC_TEC 向量宽度是 BC_ADDR 地址遍历器几何的转置模拟。
QUIRK — Trillium (v6e /
ghostlite) 搭载 SCS + TAC + TEC,但最新一代放弃了 TAC 定序器:v7 (6acc60406)chip_parts搭载 SC_SEQ + 16× SC_TEC 且无 SC_TILE_ACCESS_CORE_SEQ。 SC_TEC 矢量宽度也从 8 通道 (v5p/v6e) 翻倍到 16 通道 (v7) — 当瓦片访问定序器折叠起来时,瓦片执行宽度增加。枚举 SparseCore 定序器类型的重新实现器不得假定 v5p/v6e {SEQ、TAC、TEC} 三元组适用于 v7。注意 — (缺失数据单元) BarnaCore 详细的子消息几何结构(
BarnaCoreFsmfreg/smem 偏移量、重复数据删除/地址映射大小)不在这里走动;该表报告了每个 BarnaCore 定序器/内存的存在和 TEC/BC 矢量几何形状,但 BarnaCoreCore子消息内部仍未解码。同样,v5p/v6e/v7 降低精度 FLOPS 梯形图 (1×/2×/4×) 的确切MatmulDataFormat枚举 → dtype-name 绑定是从加倍模式推断出来的,而不是每个索引的字节固定。标记为“—”的单元格在该代中确实不存在(例如 v2-v4 的 SparseCore 行,除 v4 之外的每个代的 CMEM 行),并非未知。
版本序号 — 三个独立轴
一代在三个轴上佩戴三个整数序数,这些轴不共享编号。上述矩阵是基于内部tpu::TpuVersion;该表将其绑定到其他两个表,因此页面永远不会用另一个轴的序数来索引一个轴。
| 一代 | tpu::TpuVersion(内部) | TpuVersionProto(电线) | xprof::DeviceType(分析器) |
|---|---|---|---|
| 水母v2 | 0 | 1 | 3 |
| 龙鱼v3 | 1 | 2 | 5 |
| 河豚 v4 | 2 | 3 | 7 |
| Viperfish v5p | 3 | 4 | 10 |
| Ghostlite v6e | 4 | 5 | 13 |
| 6acc60406 v7 | 5 | 6 | 12 |
TpuVersionToString (0x20b3a480) version >= 6 上的 FATAL 并对 6 指针表 off_22011BF0 进行索引,其重定位目标为代号文字 jellyfish … 6acc60406。原始序号始终为 internal + 1(blob 的 field-1 版本)。 DeviceType 是一个 稀疏 分析器轴 (DeviceTypeFromDeviceIdentifiers @ 0xf6993a0),其中包括作为其自己的序数的 lite 变体 (Puffylite = 8,Viperlite = 11) — 它不能从 TpuVersion 进行算术推导。
明白了 —
DeviceType序数超出了TpuVersion顶端的顺序:Ghostlite (v6e) 是DeviceType13 但6acc60406(v7) 是DeviceType12。假设DeviceType随着世代的增加而增加的重新实现者将交换 v6e 和 v7。始终通过此表进行翻译,切勿通过向一个序数添加常量来进行翻译。
交叉引用
主矩阵的每一列都有一个深页,拥有其派生:
- 代号备忘单 — 完整的三轴版本图(编解码器/fish/
TpuVersion/DeviceType/proto/PCI DID),序数表的来源在这里 - 芯片零件
.binarypb— 嵌入式 blob 目录、DefaultsForVersionembed://加载路径、TpuChipPartsProto架构 - 每个代号硬件常量 — 完整的每代
chip_parts解码(HBM/VMEM/SMEM/SFLAG/MXU/寄存器文件)内存列总结 - TPU-拓扑结构 — 通道/子通道缓存和
Target[+0x3b8]几何链 - TPU-版本/代号矩阵 —
TpuVersionToString工作台和序数轴 - 捆绑包型号概述 — 每代捆绑包字节大小(JF 41 B、PF 51 B、VF 64 B、GL、GF) 每个 TensorCore 的
- IAR —
iar_count= 2 推导和VectorIsa→Target+0x4a8存储 - CycleTable 系列 和 性能概述 — 每代
CycleTable/Performance子类调度 - 本地 DMA 带宽 — 完整的代号
LocalDmaBandwidth*矩阵和 Viperfish 变体拆分 - Matmul-Mode 修改器 —
MatmulDataFormat设置降低精度的 FLOPS 阶梯价格 - LLO 操作码表 — 捆绑包/定序器几何编码的每代操作码名册
- 内存空间主表 —
MemorySpace枚举、MemBanks梯子和每层容量关键