Skip to content

内存层次概览

本页所有地址均适用于 libtpu-0.0.40-cp314 wheel 中的 libtpu.so(构建 libtpu_lts_20260413_b_RC00,build-id md5 89edbbe81c5b328a958fe628a9f2207d)。该映像剥离符号;反混淆后的 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 类;不存在 HbmAllocatorVmemAllocatorSmemAllocatorCmemAllocator 类;每个层级只是一个 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
交接 protoplatforms_deepsea::jellyfish::xdb::ProgramMemoryMetadata_Allocation
重建器ProgramMemoryAllocator::CreateFromProto @ 0x1c631f20
端点渲染(DMA)xla::jellyfish::MemorySpaceToDriverResource @ 0x1d6223e0(有自己的编号 — 见 §2
HBM DMA 对齐下限jf_driver::kHbmMinimumDmaAlignment = 1024 B(掩码 & 0x3FFWritePremappedHbm @ 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每 TensorCoreBestFitAllocator(运行时);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)LogFatalcmem-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_memalign4 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

注意事项

有三个事实横跨所有层级,重新实现者在阅读任何单层级页面之前都必须内化它们:

  1. 不存在按层级划分的分配器类。 tpu::BestFitAllocator(200 字节实例 — 每个 factory 都先 operator new(0xC8) 再调用 ctor 0x1e817500)是 libtpu 中唯一具体的 tpu::MemoryAllocator 子类。TpuHal 通过一个 AllocatorFactory 为每个层级绑定一个实例(0x1e815600 … 0x1e815700 处的 5 个 callback $_0..$_4,全都默认使用 kBestFit 策略)。区分 HBM 分配器和 VMEM 分配器的唯一东西,是构造它们时传入的 32 字节 Config 三元组。

  2. 分配器里没有按 TpuVersion 分支。 每个按 codename 变化的差异(HBM 字节大小、VMEM 字大小、对齐、粒度)都是数据,携带在嵌入的 *chip_parts.binarypb 资源中,并在启动时作为 Config 三元组暴露出来。分配器代码与系列无关。

  3. 运行时分配器只重放,不决策。 MSA 和 ProgramMemoryAllocator 在编译期选择每个偏移,并把它们冻结进 ProgramMemoryMetadata_Allocation proto 条目。加载时,CreateFromProto0x1c631f20)为每个层级实例化一个 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 0x21ce6b08MemorySpaceToString 字符串指针表逐字节恢复;MemorySpaceToString0x1d6ffae0)是一条指令的查表 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字符串物理层级所有者
kNone0<no memory space>—(无空间)
kHbm1hbmHBM(片外)每芯片
kHib2hibHBM↔主机接口缓冲暂存层级每芯片
kVmem3vmemVMEM每 TensorCore
kCmem4cmemCMEM每 TensorCore(PF)
kSmem5smemSMEM每 SPU
kSflag6sflagSFLAG(芯片同步标志层级)每引擎 bank
kImem7imem指令内存每核心
kBarnaCoreBmem8barna_core_bmemBarnaCore 缓冲内存BarnaCore
kBarnaCoreSmem9barna_core_smemBarnaCore 标量内存BarnaCore
kBarnaCoreSflag10barna_core_sflagBarnaCore 同步标志层级BarnaCore
kBarnaCoreImem11barna_core_imemBarnaCore 指令内存BarnaCore
kSparseCoreSequencerSflag12sparse_core_sequencer_sflagSC sequencer 同步标志区域SparseCore
kHost13host主机 RAM(卸载溢出目标)host
kSparseCoreSequencerSmem14sparse_core_sequencer_smemSC sequencer 标量内存SparseCore
kSparseCorePrivateStackHbm15sparse_core_private_stack_hbmSC private-stack HBM 区域SparseCore
kPinnedHbm16pinned_hbmHBM,运行时锁定(peer-DMA 输入;repacker 不可重定位)每芯片

怪异点 — 0x21ce6b08 的字符串指针表长于 17 值区域枚举:槽位 17/18/19 解析为 absolute0x868144c)、heap_relative0x8678cad)和 stack_relative0x8678cbb)。这三个是 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 空间上陷入

c
// 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 结构体(每层级一个)

c
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_ >= 0allocatable_range_end_ > 0alignment_in_bytes_ > 0alignment_in_bytes_ % granule_in_bytes_ == 0,且 alignment_in_bytes_ 是 2 的幂。这些不变量对每个层级都成立;它们让分配器的向上取整算术((size + align − (size!=0)) & −align,在 Allocate 0x1e817820 开头确认)可以是一条单一 AND。

按层级的 Config 与对齐

层级base_offsetend(容量)alignmentgranule
HBM0chip_parts.binarypb HBM 字节(− xla_tpu_user_reserved_hbm_bytes16 KiB 编译期(xla_jf_program_hbm_alignment_in_kib=16);1024 B 运行时 DMA 下限chip_parts HBM 粒度
VMEM0Target::VmemSizeBytes()Target+0x458)或 xla_tpu_override_vmem_size_kibVmemAlignmentBoundaryInBytes()ChunkBytes(JF)/ max(Granule, VmemWord)(PF/VF/GL)VmemWordSizeBytes()Target+0x50C
CMEM0Target::CmemSizeBytes()Target+0x460CmemWordSizeBytes()CmemWordSizeBytes()Target+0x510,PF 上约 16 B)
SMEM0Target::SmemSizeBytes()Target+0x470SmemWordSizeBytes()SmemWordSizeBytes()Target+0x508
SFLAG0Target::SflagSizeBytes()Target+0x468SflagWordSizeBytes()Target+0x504SflagWordSizeBytes()
主机(premapped)每分区 partition_size * ipartition_size大小 ≤ 2 MiB 时 4 KiB,否则 2 MiB(PickPageAlignment= alignment
主机(BFC offload)0256 GiB 上限(0x40'0000'0000tsl::BFCAllocator ctor size arg)≥ 16 B(posix_memalign2 MiB 区域增长

陷阱 — HBM 有两个对齐数字,混淆它们会静默破坏 DMA。kHbmMinimumDmaAlignment = 1024 B 是硬件下限:每个 DMA 发起点都用 & 0x3FF 掩码检查 size 和 address,并在余数非零时 LogMessageFatalWritePremappedHbm @ 0xe73db80 中的 byte_offset % jf_driver::kHbmMinimumDmaAlignment == 0size % … == 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 用编号空间分区)。

阶段

text
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 则从固定的编号空间分区分配(GetStartReservedSyncFlagNumber 0x1d6178e0 读取 Target+0x530;overlay-reserved 上界 GetOverlayReservedSyncFlagNumber 0x1d617900 读取 Target+0x534),而不是字节堆。把 SMEM/SFLAG 路由进 MSA cost model 的重新实现会放错它们;MSA 的层级平衡只是 VMEM/CMEM 关心的事情。见 smem-scalar-memory.mdsflag-protocol.md


相关组件

组件关系
msa-overview.md编译期 pass,为 HBM(kDefault)与 VMEM/CMEM(kAlternate)着色并插入 async copy
intra-chip-descriptor.mdDMA descriptor,其 (mem_id, core_id) 端点通过 MemorySpaceToDriverResource 渲染 MemorySpace 枚举
memory-space-enum.md17 值 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.mdkAlternate 快速层级;按代 VMEM size/word/bank/bandwidth Config 和 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;PremappedMemoryManagertsl::BFCAllocator 基于 posix_memalign
  • on-device-compaction.mdBestFitAllocator::Compact 重定位;降低碎片的 repacker
  • buffer-donation-aliasing.mdkPinnedHbm 以及 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