内存层次概览
本页所有地址均适用于
libtpu-0.0.40-cp314wheel 中的libtpu.so(构建libtpu_lts_20260413_b_RC00,build-id md589edbbe81c5b328a958fe628a9f2207d)。该映像未剥离符号;反混淆后的 C++ 符号名按原文逐字引用。其他版本会有所不同。
摘要
一个 TPU 程序会触及六个可寻址内存区域,而 libtpu.so 用一个 C++ 枚举(xla::jellyfish::MemorySpace)命名其中每一个区域,并用一个分配器类(tpu::BestFitAllocator)服务其中每一个区域,主机堆除外。这个层次从容量充足且较远到稀缺且较近依次是:HBM(片外 DRAM,数十 GiB,kDefault 层级),然后是每个 TensorCore 的四个片上 SRAM 层级:VMEM(向量内存,MXU/VPU 从中读取操作数的 kAlternate 快速暂存层级)、CMEM(常量内存,仅 Pufferfish 的以读为主的操作数池)、SMEM(标量内存,SPU 私有的溢出/参数存储),以及 SFLAG(同步标志内存,用于跨引擎握手的按字粒度原子寄存器文件);最后是 host tcmalloc-class heap,libtpu 并不嵌入它(未链接 jemalloc/tcmalloc);主机分配通过 posix_memalign,并由 tpu::PremappedMemoryManager(DMA 暂存)或 tsl::BFCAllocator(HBM 溢出卸载)封装。
熟悉 LLVM 和 GPU 编程的读者应先保留一个类比,然后立刻把它复杂化。HBM↔VMEM 的关系是 XLA 中类似寄存器分配的对应物:内存空间分配(MSA)是编译期 pass,它把每个 HloValue “着色”为 kDefault(HBM)或 kAlternate(VMEM),而“溢出”就是 HBM↔VMEM DMA。但这个类比在四方面失效。第一,“寄存器”是数十 MiB,而不是 64-bit 槽。第二,运行时实现着色的分配器对每个层级都是同一个 best-fit 类;不存在 HbmAllocator、VmemAllocator、SmemAllocator 或 CmemAllocator 类;每个层级只是一个 tpu::BestFitAllocator 实例,仅由 32 字节的 MemoryAllocator::Config{base_offset, end, alignment, granule} 区分。第三,只有 VMEM(以及 Pufferfish 上的 CMEM)由 MSA 管理;SMEM 和 SFLAG 不参与 kAlternate/kDefault 的拉锯;它们分别由 opcode 语义和固定的编号空间分区放置。第四,运行时分配器几乎从不决策任何事情:MSA 把每个偏移冻结到编译后程序中的 ProgramMemoryMetadata_Allocation proto,运行时分配器只是重放这些偏移。
本页是内存子系统的章节地图。它固定内存空间分类,命名标记它们的枚举,给出每个层级一眼可查的分配器/对齐/管理事实,并指向拥有细节的各层级页面。它不复述 best-fit 分配/释放算法(见 hbm-allocator.md)、各代 VMEM bank/带宽表(见 vmem-allocator.md)、SFLAG 原子协议(见 sflag-protocol.md)或 MSA 放置级联(见 msa-overview.md)。
对于重新实现者,导向契约是:
- 六区域分类:每个空间在物理上是什么,谁读/写它,以及哪个引擎拥有它。
MemorySpace枚举:编译期放置器与 wire/profiler 层共享的单一标签空间(kNone … kAlternate),以及 DMA-driver-resource 路径使用的第二套编号(以及它们为什么不一致)。- 按空间的分配器/对齐矩阵:每层级一个
BestFitAllocator,每层级的Config三元组,1024-B HBM DMA 下限与 16-KiB 编译期 HBM 对齐的差异,以及片上按字粒度的对齐。 - 编译期 → 运行时交接:MSA/
ProgramMemoryAllocator把偏移冻结进 proto;CreateFromProto为每个层级重建一个BestFitAllocator并重放。
| 内存空间枚举 | xla::jellyfish::MemorySpace(17 个值,kNone=0 … kPinnedHbm=16);解码器 MemorySpaceToString @ 0x1d6ffae0,字符串指针表 @ 0x21ce6b08 |
| 受管理 space-id 数组 | ProgramMemoryAllocator::kAllocatedMemorySpaces @ 0xb42ff10(.rodata) |
| 通用运行时分配器 | tpu::BestFitAllocator(200 字节实例,operator new(0xC8);ctor 0x1e817500);每层级一个;typeinfo 0x21d346e8,vtable 0x21d34630 |
| 分配器基类 | tpu::MemoryAllocator(抽象;typeinfo 0x21d34700) |
| 编译期放置器 | xla::jellyfish::ProgramMemoryAllocator::AllocateBytes @ 0x1c629e40(单一入口,按 MemorySpace 分支) |
| MSA(HBM↔VMEM 着色) | xla::memory_space_assignment::MsaAlgorithm::Finish @ 0x1dc5b560 — 见 msa-overview.md |
| 交接 proto | platforms_deepsea::jellyfish::xdb::ProgramMemoryMetadata_Allocation |
| 重建器 | ProgramMemoryAllocator::CreateFromProto @ 0x1c631f20 |
| 端点渲染(DMA) | xla::jellyfish::MemorySpaceToDriverResource @ 0x1d6223e0(有自己的编号 — 见 §2) |
| HBM DMA 对齐下限 | jf_driver::kHbmMinimumDmaAlignment = 1024 B(掩码 & 0x3FF,WritePremappedHbm @ 0xe73db80) |
| 编译期 HBM 对齐 | FLAGS_xla_jf_program_hbm_alignment_in_kib = 16 ⇒ 16 KiB(@ 0x223b4888) |
| 置信度 | CONFIRMED(按字节锚定),除非某行或 callout 另有说明 |
1. 六区域分类
目的
TPU 程序会命名六个可寻址区域。五个在芯片上(每 TensorCore,加上每 BarnaCore / 每 SparseCore 变体);一个是片外 DRAM。主机堆是第七个区域,由驱动(而不是程序)从中分配。下表是一眼可查的完整地图;每一行都由一个专门页面负责。
一览
| 层级 | 物理形态 | 范围 | 分配器 | 对齐 / 粒度 | MSA 管理? | 负责页面 |
|---|---|---|---|---|---|---|
| HBM | 片外 DRAM,数十 GiB | 每芯片,主机可见 | tpu::BestFitAllocator(运行时);ProgramMemoryAllocator(编译) | 1024 B DMA 下限 / 16 KiB 编译期 | 是 — kDefault 层级 | hbm-allocator.md · hbm-dma-alignment.md |
| VMEM | 片上 SRAM,约 16–64 MiB/TensorCore | 每 TensorCore | BestFitAllocator(运行时);MSA + ProgramMemoryAllocator(编译) | VmemAlignmentBoundaryInBytes() — 按代(JF 上为 ChunkBytes;PF/VF/GL 上为 max(Granule, VmemWord)) | 是 — kAlternate 快速层级 | vmem-allocator.md |
| CMEM | 片上 SRAM,以读为主的操作数池 | 每 TensorCore(仅 Pufferfish) | BestFitAllocator(运行时);MSA(xla_tpu_cmem_*) | CmemWordSizeBytes()(PF 上约 16 B) | 仅 Pufferfish 上是;其他位置 MemBanks(kCmem) 为 LogFatal | cmem-pool.md |
| SMEM | 片上 SRAM,标量/按字扁平 | 每 SPU(每核心标量引擎) | BestFitAllocator(运行时);ProgramMemoryAllocator(编译) | SmemWordSizeBytes()(word = alignment = granule) | 否 — 由标量 load/store opcode 语义放置 | smem-scalar-memory.md · smem-register-window.md |
| SFLAG | 片上原子寄存器文件,按字粒度 | 每引擎 bank(TC / SCS / TEC / TAC);global 子空间跨核心 | BestFitAllocator(大小)+ 固定编号空间分区(编译) | SflagWordSizeBytes()(log2 缓存在 Target+0x4c8) | 否 — 由保留的编号空间分区放置 | sflag-protocol.md |
| 主机堆 | 主机 DRAM | 进程范围 | PremappedMemoryManager(DMA 暂存)/ tsl::BFCAllocator(HBM 卸载)— 两者 → posix_memalign | 4 KiB 或 2 MiB 页(PickPageAlignment);16 B(BFC) | n/a(通过 custom call 做 host-offload) | embedded-tcmalloc.md |
注意 — “register window” 对这里的每个片上层级都是误称。SMEM、CMEM 和 SFLAG 都是扁平的字节/字数组;在二进制中搜索
SmemRegisterWindow/SregWindow/ CMEM register file 都没有命中。标量寄存器窗口化存在于 SREG file(由 LSRA-v2 分配),而 SMEM 只是它的溢出后备存储。关于为什么 window 概念不适用,见 smem-register-window.md。
注意事项
有三个事实横跨所有层级,重新实现者在阅读任何单层级页面之前都必须内化它们:
不存在按层级划分的分配器类。
tpu::BestFitAllocator(200 字节实例 — 每个 factory 都先operator new(0xC8)再调用 ctor0x1e817500)是 libtpu 中唯一具体的tpu::MemoryAllocator子类。TpuHal 通过一个AllocatorFactory为每个层级绑定一个实例(0x1e815600 … 0x1e815700处的 5 个 callback$_0..$_4,全都默认使用kBestFit策略)。区分 HBM 分配器和 VMEM 分配器的唯一东西,是构造它们时传入的 32 字节Config三元组。分配器里没有按
TpuVersion分支。 每个按 codename 变化的差异(HBM 字节大小、VMEM 字大小、对齐、粒度)都是数据,携带在嵌入的*chip_parts.binarypb资源中,并在启动时作为Config三元组暴露出来。分配器代码与系列无关。运行时分配器只重放,不决策。 MSA 和
ProgramMemoryAllocator在编译期选择每个偏移,并把它们冻结进ProgramMemoryMetadata_Allocationproto 条目。加载时,CreateFromProto(0x1c631f20)为每个层级实例化一个BestFitAllocator并重放冻结的偏移。free-list / red-black-tree 机制在运行时只用于 MSA 标为运行时分配的动态分配(scoped scratch、async-copy staging)。见 §4。
2. MemorySpace 枚举 {#2-the-memoryspace-enum}
目的
一个 C++ 枚举 xla::jellyfish::MemorySpace 标记编译器和运行时中的每个区域。重新实现者必须精确复现这个枚举,因为它是每个 LLO load/store 上的 operand-space 标签,是 ProgramMemoryAllocator::AllocateBytes 的选择器,也是 kAllocatedMemorySpaces 数组(0xb42ff10)迭代的键。另一套第二个、无关的编号控制内存空间如何渲染进 DMA descriptor 的地址字;两者几乎每个值都不一致,而它们之间的边界正是 §2.3 的主题。
编码 — 编译期 MemorySpace 枚举 {#encoding--the-compile-time-memoryspace-enum}
从 rodata 0x21ce6b08 的 MemorySpaceToString 字符串指针表逐字节恢复;MemorySpaceToString(0x1d6ffae0)是一条指令的查表 mov rax, [0x21ce6b08 + ms*8],所以整数就是表索引,每个槽位的 C 字符串是规范的小写区域名(通过其 R_X86_64_RELATIVE reloc 解析)。区域枚举有 17 个值(0..16)。两个 MSA 别名 kDefault/kAlternate 属于单独的二值枚举 xla::memory_space_assignment::MemorySpace(由 0x1dcda1c0 解码,值 kDefault=0 / kAlternate=1);它们是 MSA 分配的颜色(“充足”=HBM vs. “稀缺”片上层级),不是 xla::jellyfish::MemorySpace 的成员。
MemorySpace | 值 | 字符串 | 物理层级 | 所有者 |
|---|---|---|---|---|
kNone | 0 | <no memory space> | —(无空间) | — |
kHbm | 1 | hbm | HBM(片外) | 每芯片 |
kHib | 2 | hib | HBM↔主机接口缓冲暂存层级 | 每芯片 |
kVmem | 3 | vmem | VMEM | 每 TensorCore |
kCmem | 4 | cmem | CMEM | 每 TensorCore(PF) |
kSmem | 5 | smem | SMEM | 每 SPU |
kSflag | 6 | sflag | SFLAG(芯片同步标志层级) | 每引擎 bank |
kImem | 7 | imem | 指令内存 | 每核心 |
kBarnaCoreBmem | 8 | barna_core_bmem | BarnaCore 缓冲内存 | BarnaCore |
kBarnaCoreSmem | 9 | barna_core_smem | BarnaCore 标量内存 | BarnaCore |
kBarnaCoreSflag | 10 | barna_core_sflag | BarnaCore 同步标志层级 | BarnaCore |
kBarnaCoreImem | 11 | barna_core_imem | BarnaCore 指令内存 | BarnaCore |
kSparseCoreSequencerSflag | 12 | sparse_core_sequencer_sflag | SC sequencer 同步标志区域 | SparseCore |
kHost | 13 | host | 主机 RAM(卸载溢出目标) | host |
kSparseCoreSequencerSmem | 14 | sparse_core_sequencer_smem | SC sequencer 标量内存 | SparseCore |
kSparseCorePrivateStackHbm | 15 | sparse_core_private_stack_hbm | SC private-stack HBM 区域 | SparseCore |
kPinnedHbm | 16 | pinned_hbm | HBM,运行时锁定(peer-DMA 输入;repacker 不可重定位) | 每芯片 |
怪异点 —
0x21ce6b08的字符串指针表长于 17 值区域枚举:槽位17/18/19解析为absolute(0x868144c)、heap_relative(0x8678cad)和stack_relative(0x8678cbb)。这三个是LloAddress重定位模型的 pointer-relativity 标签,与区域名数组共享存储;它们不是内存池。按字符串表长度确定MemorySpace枚举大小,或把absolute/heap_relative/stack_relative当作层级的重新实现都是错误的:区域枚举恰好是 17 个值(0..16)。排序也不是干净的物理层级排序,并且宽于任何单代会使用的空间(CMEM 只在 Pufferfish 上活跃)。驱动层级表应基于具名常量,绝不要基于连续整数。填充每个层级Config的按 codename 字节大小不存在于 C++ 中(它们在chip_parts.binarypb中);枚举是标签,不是大小。完整 enum↔MemorySpaceProto字段号重映射见 memory-space-enum.md。
DMA-driver-resource 编号是另一个整数空间 {#the-dma-driver-resource-numbering-is-a-different-integer-space}
xla::jellyfish::MemorySpaceToDriverResource(MemorySpace)(0x1d6223e0)把 LLO MemorySpace 枚举映射为硬件 driver-resource id,并将其盖印进 DMA descriptor 的地址字。它的 switch(在反编译中逐臂验证)不返回枚举值;它返回一个置换后的非单调 id,并且会在 cmem 和 SparseCore 空间上陷入:
// xla::jellyfish::MemorySpaceToDriverResource(MemorySpace ms) sub_1D6223E0
function MemorySpaceToDriverResource(ms):
switch ms: // ms = the 17-value LLO MemorySpace enum
case 0 (<no space>): return 10
case 1 (hbm): return 2
case 2 (hib): return 3
case 3 (vmem): return 4
case 4 (cmem): FATAL("Unsupported memory space") // not DMA-addressable here
case 5 (smem): return 6
case 6 (sflag): return 0
case 7 (imem): return 5
case 8 (barna_core_bmem): return 7
case 9 (barna_core_smem): return 9
case 10 (barna_core_sflag): return 1
case 11 (barna_core_imem): return 8
case 12..16 (sparse_core_*): FATAL("Unsupported memory space")这个 switch 消费 §2 表中的 MemorySpace 枚举;它的 case 标签(hbm=1, hib=2, vmem=3, cmem=4, smem=5, sflag=6, imem=7, …)与放置器常量相同;但它返回一个不同的整数空间,也就是上表列出的置换后非单调 driver-resource id。返回的 id 对任何层级都不等于 MemorySpace 整数。
陷阱 — 端到端携带
MemorySpace枚举,只在 descriptor 边界通过这个显式 switch 转换为 driver-resource id。复用枚举整数来推导 id 对每个层级都是错误的,并且cmem(4)加上每个 SparseCore 空间(12..16)在这里根本不可 DMA 寻址(LogMessageFatal("Unsupported memory space"))。完整 resource-id 表见 intra-chip-descriptor.md。
3. 按空间的分配器 / 对齐矩阵
目的
每个层级都是一个由 32 字节 MemoryAllocator::Config 构造出的 tpu::BestFitAllocator。按层级的差异只有四个 Config 字段,以及(对 HBM)比硬件 DMA 下限更严格的编译期对齐。本节给出每层级的 Config 三元组和对齐规则;allocate/deallocate 算法本身在各层级完全相同,并且只在 hbm-allocator.md 中记录一次。
Config 结构体(每层级一个)
struct tpu::MemoryAllocator::Config { // 32 B, passed by const&
int64_t base_offset_in_bytes_; // +0 ≥ 0 (0 for every on-chip tier)
int64_t allocatable_range_end_; // +8 > 0 (capacity = end − base)
int64_t alignment_in_bytes_; // +16 > 0, power of two, divides granule
int64_t granule_in_bytes_; // +24 hardware granule (page / word)
};ctor(0x1e817500)通过 LogMessageFatal 检查断言:base_offset_in_bytes_ >= 0、allocatable_range_end_ > 0、alignment_in_bytes_ > 0、alignment_in_bytes_ % granule_in_bytes_ == 0,且 alignment_in_bytes_ 是 2 的幂。这些不变量对每个层级都成立;它们让分配器的向上取整算术((size + align − (size!=0)) & −align,在 Allocate 0x1e817820 开头确认)可以是一条单一 AND。
按层级的 Config 与对齐
| 层级 | base_offset | end(容量) | alignment | granule |
|---|---|---|---|---|
| HBM | 0 | chip_parts.binarypb HBM 字节(− xla_tpu_user_reserved_hbm_bytes) | 16 KiB 编译期(xla_jf_program_hbm_alignment_in_kib=16);1024 B 运行时 DMA 下限 | chip_parts HBM 粒度 |
| VMEM | 0 | Target::VmemSizeBytes()(Target+0x458)或 xla_tpu_override_vmem_size_kib | VmemAlignmentBoundaryInBytes() — ChunkBytes(JF)/ max(Granule, VmemWord)(PF/VF/GL) | VmemWordSizeBytes()(Target+0x50C) |
| CMEM | 0 | Target::CmemSizeBytes()(Target+0x460) | CmemWordSizeBytes() | CmemWordSizeBytes()(Target+0x510,PF 上约 16 B) |
| SMEM | 0 | Target::SmemSizeBytes()(Target+0x470) | SmemWordSizeBytes() | SmemWordSizeBytes()(Target+0x508) |
| SFLAG | 0 | Target::SflagSizeBytes()(Target+0x468) | SflagWordSizeBytes()(Target+0x504) | SflagWordSizeBytes() |
| 主机(premapped) | 每分区 partition_size * i | partition_size | 大小 ≤ 2 MiB 时 4 KiB,否则 2 MiB(PickPageAlignment) | = alignment |
| 主机(BFC offload) | 0 | 256 GiB 上限(0x40'0000'0000,tsl::BFCAllocator ctor size arg) | ≥ 16 B(posix_memalign) | 2 MiB 区域增长 |
陷阱 — HBM 有两个对齐数字,混淆它们会静默破坏 DMA。
kHbmMinimumDmaAlignment= 1024 B 是硬件下限:每个 DMA 发起点都用& 0x3FF掩码检查 size 和 address,并在余数非零时LogMessageFatal(WritePremappedHbm@0xe73db80中的byte_offset % jf_driver::kHbmMinimumDmaAlignment == 0、size % … == 0)。16 KiB 编译期数值(xla_jf_program_hbm_alignment_in_kib)更严格;它在 MSA 放置前把每个程序级 HBM tensor 向上舍入到 16 KiB,以适配 XLA 的 stride/sub-tile addressing 和 slice-prefetch 边界。重新实现者若在编译期把 HBM 分配对齐到 1024 B,会生成 MSA 的 slice 机制无法寻址的布局;若在 DMA 发起时强制 16 KiB 则不会浪费之外造成问题,但过于严格。1024-B 下限是 wire contract;16-KiB 规则是 placement contract。见 hbm-dma-alignment.md。注意 — 片上层级(VMEM/CMEM/SMEM/SFLAG)都设置
alignment == granule == <tier>WordSizeBytes()且base_offset == 0;每个片上层级都从 sub-tile 地址 0 开始,单个分配始终是一段按字对齐的连续区间。只有 HBM 把 alignment 与 granule 分离(在更小的硬件粒度之上使用 16 KiB 对齐),也只有主机 premapped manager 使用非零base_offset(每分区槽位基址)。按 codename 的数字字大小存在于chip_parts.binarypb中,不在 C++ 中;上面的公式是精确的。
主机堆不是 tcmalloc
libtpu 没有嵌入 jemalloc,也没有嵌入 tcmalloc(尽管页面族名称如此)。到达的唯一 OS 级分配原语是 posix_memalign,它被两种方式封装:tpu::PremappedMemoryManager 把一个 posix_memalign 区域划分为 2 的幂分区,每个分区都在 absl::Mutex 下封装一个按分区的 BestFitAllocator,并以 round-robin 用作 DMA 暂存;tsl::BFCAllocator(TF best-fit-with-coalescing 分配器,每实例约 1.2 KiB,21 个 size-class bin)只为 HostOffloadingTpuAllocator(256 GiB 上限)提供后端,接收 MSA 决定溢出到主机 RAM 的 HBM 缓冲区。两者都不是设备端分配器。见 embedded-tcmalloc.md。
4. 编译期 → 运行时交接 {#4-the-compile-time--runtime-hand-off}
目的
MSA 在编译期选择的同一个偏移,就是运行时分配器在加载时返回的偏移。这是把各层级页面串在一起的脊柱:每个层级都流经同一个七阶段交接,只是选择偏移的编译期放置器不同(VMEM/CMEM 用 MSA,SMEM 用 opcode 语义,SFLAG 用编号空间分区)。
阶段
Compile time (XLA core):
HeapSimulator::Run(GlobalDecreasingSizeBestFitHeap<HloValue>, …) 0x1e49dae0
└─ produces per-buffer Chunk{offset, size}
Compile time (XLA TPU layer):
MsaAlgorithm::Finish() 0x1dc5b560 ── HBM↔VMEM(↔CMEM) coloring only
└─ Allocation objects {Pinned / Copy / Prefetch / Scoped / …}
Compile time (jellyfish):
ProgramMemoryAllocator::AllocateBytes(MemorySpace, …) 0x1c629e40 ── one entry, branches on MS
└─ emits ProgramMemoryMetadata_Allocation{memory_space, offset, size, block_type, name}
Codegen:
the compiled XDB/LLO program embeds the proto (offsets symbolic until link)
────── load time ──────
ProgramMemoryAllocator::CreateFromProto(LloModule*, …, proto) 0x1c631f20
└─ per tier: TpuHal::GetAllocatorFactory() (this+0x48) 0x1e8139a0
└─ tpu::BestFitAllocator(Config{base=0, end=<tier>Size, align, granule})
Execution:
each compile-time Allocation → BestFitAllocator::Allocate(size) at the FROZEN offset
Deallocation:
BestFitAllocator::Deallocate(offset) — eager coalescing on every free怪异点 — MSA 只为 HBM↔VMEM(以及 Pufferfish 上的 HBM↔CMEM)轴着色。SMEM 和 SFLAG 流经同一个
ProgramMemoryAllocator→ proto →BestFitAllocator脊柱,但从不进入 MSA 的kAlternate/kDefault决策:SMEM 会在标量 load/store opcode 声明MemorySpace=kSmem的位置提交,SFLAG 则从固定的编号空间分区分配(GetStartReservedSyncFlagNumber0x1d6178e0读取Target+0x530;overlay-reserved 上界GetOverlayReservedSyncFlagNumber0x1d617900读取Target+0x534),而不是字节堆。把 SMEM/SFLAG 路由进 MSA cost model 的重新实现会放错它们;MSA 的层级平衡只是 VMEM/CMEM 关心的事情。见 smem-scalar-memory.md 和 sflag-protocol.md。
相关组件
| 组件 | 关系 |
|---|---|
| msa-overview.md | 编译期 pass,为 HBM(kDefault)与 VMEM/CMEM(kAlternate)着色并插入 async copy |
| intra-chip-descriptor.md | DMA descriptor,其 (mem_id, core_id) 端点通过 MemorySpaceToDriverResource 渲染 MemorySpace 枚举 |
| memory-space-enum.md | 17 值 LLO MemorySpace 枚举在 ISA / operand-tag 层级上的形态 |
交叉引用
- hbm-allocator.md — 通用
tpu::BestFitAllocator算法(best-fit + eager coalescing);HBM 层级以及双栈(编译期ProgramMemoryAllocator+ 运行时BestFitAllocator)模型 - hbm-dma-alignment.md — 1024-B
kHbmMinimumDmaAlignment下限与 16-KiB 编译期程序对齐的对比 - vmem-allocator.md —
kAlternate快速层级;按代 VMEM size/word/bank/bandwidthConfig和 scoped-VMEM 机制 - cmem-pool.md — 仅 Pufferfish 的以读为主操作数池;
xla_tpu_cmem_*MSA 调节项;其他位置MemBanks(kCmem)为 LogFatal - smem-scalar-memory.md — SPU 的标量内存;opcode 驱动放置(非 MSA);保留的顶部/底部块
- smem-register-window.md — 为什么不存在 SMEM register window;SMEM 作为 SREG-file 溢出后备存储(LSRA-v2)
- sflag-protocol.md — 同步标志原子层级;编号空间分区、三个 SC 子空间、fence/ordering 模型
- embedded-tcmalloc.md — 主机堆:无 tcmalloc/jemalloc;
PremappedMemoryManager和tsl::BFCAllocator基于posix_memalign - on-device-compaction.md —
BestFitAllocator::Compact重定位;降低碎片的 repacker - buffer-donation-aliasing.md —
kPinnedHbm以及 repacker 不可重定位的输入/输出别名 - tpu-buffer-layout.md — 逻辑 XLA buffer 如何映射到这些层级中的物理偏移
- msa-overview.md — Phase 7;编译侧消费此分类的组件
- intra-chip-descriptor.md — DMA 边界处
MemorySpace枚举的 wire 视图 - 返回索引 — Part X — On-Chip Memory & DMA