Skip to content

get_remote_memref

此页上的每个地址、偏移量、操作数索引和字符串都是从 libtpu-0.0.40-cp314 轮中的 libtpu.so 中精确读取字节的(内部版本 libtpu_lts_20260413_b_RC00,BuildID md5 89edbbe81c5b328a958fe628a9f2207d)。其他版本有所不同。地址是二进制文件自己的 VMA(text/rodata VMA == 文件偏移量;.data.rel.ro 文件偏移量 = VMA − 0x200000)。

摘要

涉及对等芯片内存的 SparseCore 集合需要一个 memref 来“命名”远程数据,而无需重新计算绝对地址。 libtpu 使用一个 MLIR 操作(sc_tpu.get_remote_memref)构建远程 memref,该操作由一个解析器(lowering_util::GetRemoteMemBase)生成。本页记录了整个 get-remote-memref 单元:op 的签名和验证器、从本地 memref 和对等 core-id 构建它的解析器,以及远程重新标记 op 的 LLVM 降低执行。

标题结果与 SparseCore 指针模型暗示的负面结果相同(请参阅 脂肪指针 (AS7/8/9)):跨芯片远程 memref 是 本地 memref,仅重新标记其基指针的地址空间。 GetRemoteMemBase 读取本地 memref 的 MemorySpace,将其提升为远程可访问"_any" 超集 (MemorySpaceToAny),并重建其他字节相同的 MemRefType — 相同的形状、相同的元素类型、相同的布局,仅 MemorySpaceAttr 发生了变化。然后,操作的 LLVM 降低会解压本地 MemRefDescriptor,在对齐的基指针上运行单个 tpu_addrspacecast,将重新标记的指针写回描述符字段 [0][1],并保持偏移量、大小和步幅不变。对等核心拥有相同布局的 memref,因此相同的偏移量可寻址对等核心上的相同逻辑元素。因此,跨芯片地址是一个 {core-id, address-space, local-offset} 元组,而不是重新计算的平面地址 - 在这三个地址中,只有地址空间整数位于指针内; core-id 作为单独的 SSA 操作数(用于非图块路径的 remoteCoreId 操作数,或用于图块上 TEC 路径的 tpu_tileid)。

该页为三个单元。首先,操作sc_tpu.get_remote_memref:其操作数顺序(localMemrefremoteCoreIdv3、可选v4)、其OpTraits以及验证者的每个操作数类型约束,来自build / create / verifyInvariantsImpl。其次,解析器 - GetRemoteMemBase:本地内存引用 → "_any" 提升,过滤哪些内存可远程寻址,远程 MemRefType 重建,以及 GetRemoteMemRef::create 发出,从完整的 86 行反编译中恢复。第三,远程重新标记GetRemoteMemRefOpLowering::matchAndRewrite:描述符解包、源空间分支(平铺与通用)、"_any" 重新标记(使用 Vmem 跳过)和描述符重新打包。瓷砖上的 addrspacecast ISel 机制位于 addrspacecast ISel 上; 脂肪指针 (AS7/8/9) 上的 AS-id 表;在 StartRemoteDma 上消耗此基础的实际远程 DMA 传输 — 此页面链接它们并且仅拥有操作、解析器和重新标记。

重新实现,合约为:

  • **远程memref是本地memref,仅重新标记基指针。**不要重新计算绝对跨芯片地址。用升级后的"_any" MemorySpaceAttr重建MemRefType;逐字复制形状/元素/布局;在降低时,地址空间转换对齐的基数并将偏移量/大小/步幅保留为其本地值。
  • MemorySpaceToAny 是远程可寻址过滤器。 仅数据存储器(smemtile_spmem/spmemhbmvmemsmem_tile/smem_scs别名)推广;每个控制/暂存空间(sflagdregtimemsimemiovamar*_cbsflag_* 库) LOG(FATAL)。远程数据可达;远程控制标志不会通过此路径重新寻址。
  • 该操作是一个纯 3 或 4 操作数 SSA 操作,具有一个类型化结果。 AtLeastNOperands<3>;操作数 0 是 MemRefType(约束 sc_ops12),操作数 1 和 2 是类似索引的(约束 sc_ops2),操作数 3 是可选的第 4 个操作数。结果是 OneTypedResult<MemRefType> — 远程基地。没有固有的属性。
  • 将对等 core-id 作为 remoteCoreId 操作数,而不是在指针中。 对于 off-tile 通用路径,降低将 no core-id 折叠到指针中;路由使用单独的操作数(以及 DMA 目标 ID 的下游)。对于图块上的 TEC 路径,tpu_tileid 是演员的第二个操作数。
操作名称"sc_tpu.get_remote_memref" @ 0x866A17F(长度 0x18)
OpTraitsZeroRegions, OneResult, OneTypedResult<MemRefType>, ZeroSuccessors, AtLeastNOperands<3u>, OpInvariants
旋转变压器lowering_util::GetRemoteMemBase(0x13D88660lowering_util.cc:5356)
构建0x1459AB40 — op0=localMemref、op1=remoteCoreId、op2=v3、op3=v4(可选),结果类型最后
创建(3操作/4操作)0x145C64E0 / 0x145C6600(4-op 是 GetRemoteMemBase 调用的)
验证InvariantsImpl0x145C66A0 — op0 → sc_ops12 (MemRefType); op1,op2 → sc_ops2(类似索引)
getLocalMemrefMemorySpace0x146B0000 — 操作数 0 的 MemRefType → GetMemorySpace
远程重新标记(降低)GetRemoteMemRefOpLowering::matchAndRewrite (0x1357AE40)
"_any" 过滤器MemorySpaceToAny(0x14B786E0,表0xAF36B84);控制空间致命
演员阵容tpu_addrspacecast::create (0x146D5EA0);当"_any"空间为Vmem时跳过(205)
Peer-id 生产者getRemoteDeviceAndSparseCoreIds<EnqueueDMAOp> (0x13511660)
信心已确认(反编译锚定),除非行或标注另有说明

操作 — sc_tpu.get_remote_memref

用途

sc_tpu.get_remote_memref是跨芯片远程memref的一流SSA载体。其单一类型结果 (OneTypedResult<MemRefType>) 是 GeneralDma 汇编器存储和转发为 DMA 目标/目标信号量基数的远程基数,并且所有到所有集体驱动程序将其交给远程传输。 op仅携带数据库;同步核心由 DMA 目标 ID 单独命名(参见第 3 节和 StartRemoteDma)。

操作数和结果

build (0x1459AB40) 足够小,可以确认操作数对操作数。它将三个强制操作数 Values 写入堆栈数组并按顺序添加它们,仅当非空时添加可选的第四个操作数,然后将结果 Type 添加到操作的结果类型向量的最后:

text
GetRemoteMemRef::build(OpBuilder, OperationState &st, Type resultTy,
                       Value v0, Value v1, Value v2, Value v3 /*optional, may be null*/)

   addOperands(st, &v0, 1)        ; operand 0 = localMemref
   addOperands(st, &v1, 1)        ; operand 1 = remoteCoreId
   addOperands(st, &v2, 1)        ; operand 2 = v3
   if (v3 != null)                ; the 4th operand is added ONLY when present
       addOperands(st, &v3, 1)    ; operand 3 = v4   (optional)
   st.types[st.numResults++] = resultTy   ; result Type appended last (op+64 SmallVector)
```text

**没有** `Properties` 写入 — 该操作不带有任何固有属性。 `getLocalMemrefMemorySpace` (`0x146B0000`) 确认操作数 0 是本地 memref:它读取操作数 0 的 `MemRefType` (`[impl+8] & ~7`) 并返回其 `GetMemorySpace`。

| 操作数 | 角色 | 类型等级 |
|---|---|---|
| 0 | `localMemref` — 读取并提升类型的数据库 | `MemRefType`(约束`sc_ops12`) |
| 1 | `remoteCoreId` — 对等 core-id 组件 | 类似索引(约束 `sc_ops2`) |
| 2 | `v3` — 第二个 id 组件(设备与核心) | 类似索引(约束 `sc_ops2`) |
| 3 | `v4` — 可选的第四个操作数(远程标志/偏移组件) | 仅在非空时添加 |
| 结果 | 远程 `MemRefType` 底座 | `OneTypedResult<MemRefType>` |

> **发现了 —** 芯片内远程 **设备**(芯片)id 和远程 **核心** id 之间操作数 1 (`remoteCoreId`) 和 2 (`v3`) 的*语义*分割为高,未确认。验证器使用*相同*约束(`sc_ops2`)对两者进行类型检查,因此它们是两个可互换的类似索引的ID;设备与核心分配是从 `GetRemoteMemBase` 调用站点编组顺序(§3)中读取的,而不是从任何每个操作数检查字符串中读取的。重新实现必须修复调用站点的顺序,而不是从操作中推断顺序。

### 特征和验证者

该特征集来自 `Model<>` 特征模板实例化:`ZeroRegions`、`OneResult`、`OneTypedResult<MemRefType>`、`ZeroSuccessors`、`AtLeastNOperands<3u>`、`OpInvariants`。 `AtLeastNOperands<3u>` 正是 `build` 生产的 3 个强制 + 1 个可选形状。

`verifyInvariantsImpl` (`0x145C66A0`) 根据 op 的操作数列表进行检查(步幅 32,第一个操作数位于 op-impl+24):

```text
operand 0  (impl+24)  → __mlir_ods_local_type_constraint_sc_ops12   "operand" idx 0   ; MemRefType
operand 1  (impl+56)  → __mlir_ods_local_type_constraint_sc_ops2    "operand" idx 1   ; index-like
operand 2  (impl+88)  → __mlir_ods_local_type_constraint_sc_ops2    "operand" idx 2   ; index-like
result   0            → __mlir_ods_local_type_constraint_sc_ops12   "result"  idx 0   ; MemRefType

因此,验证者强制执行 op 语义所需的不对称性:操作数 0 和结果是 MemRefTypes(本地基址输入,远程基址输出);两个 id 操作数是类似索引的。 create 重载(0x145C64E0 3-op / 0x145C6600 4-op)是薄包装器,它在 0x866A17F 处的操作名称上构建 OperationState,并按位置转发到 build,然后是 OpBuilder::create


旋转变压器 — lowering_util::GetRemoteMemBase

用途

GetRemoteMemBase 是跨芯片远程基解析器:给定本地 memref Value、对等 core-id、第二个 id 组件和可选的第四个,它生成 sc_tpu.get_remote_memref 操作,其结果是远程基。其解压缩后的签名为 xla::tpu::sparse_core::lowering_util::GetRemoteMemBase(mlir::OpBuilder, LocationGenerator, mlir::Value, mlir::Value, mlir::Value, std::optional<mlir::Value>),位于 0x13D88660,源自 platforms/xla/sparse_core/lowering_util.cc:5356(位置字符串嵌入在正文中)。

它的作用是什么

反编译体是一个四步管道。它计算绝对地址:

text
GetRemoteMemBase(builder, locGen, v1=localMemref, v2=remoteCoreId, v3, opt v4):

  [1]  localType = v1.getType()                       ; [v1.impl + 8] & ~7  → MemRefType
       srcSpace  = GetMemorySpace(localType)           ; 0x1459C7E0
       anySpace  = MemorySpaceToAny(srcSpace)          ; 0x14B786E0  — the remote-addressability filter

  [2]  remoteType = MemRefType::get(                   ; 0x1D897680
                      localType.getShape(),            ; 0x1D8921E0   ← copied verbatim
                      localType.getElementType(),      ; 0x1D892200   ← copied verbatim
                      localType.getLayout(),           ; 0x1D892220   ← copied verbatim
                      MemorySpaceAttr::get(ctx, anySpace))   ; 0x1458FF20  ← ONLY the space changes

  [3]  loc = locGen.visit()                            ; std::variant Visitor dispatch; lowering_util.cc:5356
                                                        ; variant index == 0xff → __throw_bad_variant_access

  [4]  optV4 = (presentByte & 1) ? v4 : null
       return GetRemoteMemRef::create(builder, loc, remoteType,
                                      v1 /*localMemref*/, v2 /*remoteCoreId*/, v3, optV4) - 16
```text

步骤 1-2 是整个“远程性”机制:远程 `MemRefType` 与本地 `MemRefType` 的不同*仅*在于其 `MemorySpaceAttr`,设置为本地空间的 `"_any"` 提升。跨芯片地址是本地 `{shape, elem, layout, offset}` 加上远程地址空间加上 `remoteCoreId` 操作数 - 一个元组,而不是重新计算的平面地址。返回上的 `- 16` 将生成的 `Op*` 转换为其 `OneTypedResult<MemRefType>` `Value`。

### `MemorySpaceToAny` — 远程寻址过滤器

`MemorySpaceToAny` (`0x14B786E0`) 是一个跳转表(rodata `0xAF36B84`,索引 `MemorySpace − 1`,跨度 `0x15`),其失败 `LOG(FATAL)`。它只容纳数据存储器;每个控制/划痕空间陷阱。这是决定远程 DMA 可以瞄准的目标的门:

| 本地 `MemorySpace` | 晋升为 | 可以远程访问吗? |
|---|---|---|
| 1 `smem` | 9 `smem_any` | 是 |
| 2 `tile_spmem` | 15 `spmem_any` | 是 |
| 3 `spmem` | 15 `spmem_any` | 是 |
| 4 `hbm` | 10 `hbm_any` | 是 |
| 6 `vmem` | 6 `vmem`(自身;已经是全局的) | 是 |
| 16 `smem_tile` | 9 `smem_any` | 是 |
| 21 `smem_scs` | 9 `smem_any` | 是 |
| 5 `sflag`, 7 `dreg`, 8(间隙), 11 `timem`, 12 `simem`, 13 `iova`, 14 `sflag_tile`, 15 `spmem_any`, 17 `mar`, 18 `tile_spmem_cb`, 19 `smem_cb`, 20 `sflag_scs` | **致命** | no |

> **注意 —** 结果:远程 GeneralDma 可以针对对等核心的 HBM / VMEM / SMEM / SPMEM *数据*,但双边同步的 *远程信号量* **不** 通过 `GetRemoteMemBase` — `sflag` 致命。对等同步标志由 DMA 目标 ID 和 `dest_sync_flags` 时隙字段命名。 `GetRemoteMemBase`解析数据库;远程同步核心由目标 ID 拓扑算法命名(第 3 节)。 `MemorySpace` 枚举值和这些值提升到的 AS-id 带列在 [脂肪指针 (AS7/8/9)](../sparsecore/fat-pointers-as789.md) 上。

### 呼叫者

`GetRemoteMemBase` 有四个调用站点,全部位于跨芯片远程 DMA 堆栈中:

| 呼叫者 | @VA | 它通过了什么 |
|---|---|---|
| `issueGeneralDma` | `0x1350B4A1` | GeneralDma 汇编器的远程臂 (§3) |
| `OffloadFactory::StartRemoteDma` | `0x133EBEB1` | `rdx` = `SubsliceToFullSliceGlobalCoreId` 结果(扁平化全局核心 ID)—参见 [StartRemoteDma](start-remote-dma.md) |
| `InitiateAsynchronousAllToAllDynamic` | `0x13D8C38E` | 动态全对全集体驱动程序 |
| `InitiateAsynchronousAllToAllDense` | `0x13DB2178` | 密集全对全集体驱动 |

所有到所有的集体驱动程序是主要消费者——生产者/消费者握手的 SparseCore 卸载远程一半。

---

## 远程重新标记 — `GetRemoteMemRefOpLowering`

### 用途

`sc_tpu.get_remote_memref` 是高级操作;物理重新标记发生在其 LLVM 降低 `GetRemoteMemRefOpLowering::matchAndRewrite`(`0x1357AE40`,在 `ExpandTiledMemRefs` / ConvertToLLVM 过程中运行)。这是 `{core-id, address-space, local-offset}` 元组成为实际 LLVM 指针的地方:降低解包本地 `MemRefDescriptor`,将基指针地址空间转换到 `"_any"`(或平铺对等)空间,将其写回,然后重新打包。

### 下降体

反编译的 `matchAndRewrite` 是对本地描述符的单次传递:

```text
[a]  localType = operand0.getType()                    ; getODSOperandIndexAndLength(0) → impl[+8]&~7
     srcSpace  = MemorySpaceToAddressSpace(            ; 0x14B78780 — the LLVM addr-space integer (v19)
                   GetMemorySpace(localType))          ;   e.g. TileSpmem=201, TileSmem=219, Vmem=205

[b]  asid = typeConverter.getMemRefAddressSpace(localType)
     if (!present)  →  notifyMatchFailure("Failed to get memref address space")  →  return failure

[c]  unpack(localDescriptor)                            ; MemRefDescriptor::unpack 0x171BD620
     base = descriptor.field[1]   (aligned ptr)         ; → v87

[d]  BRANCH on srcSpace:
       srcSpace == 219 (TileSmem)  → CastTileSmemPointerToSmem (0x135B86E0)   ; reads operand 3 as tile-id source
       srcSpace == 201 (TileSpmem) → CastTileSpmemPointerToSpmem (0x135B8400) ;   "
         (both NORMALISE the tile pointer: inject tpu_tileid, re-tag to the non-tile peer
          Smem/Spmem space, update srcSpace by-ref, set the flag v86=1, then fall through)

[e]  GENERIC path (LABEL_19):
       anySpace = GetAnyTypeFromAddressSpace(srcSpace)  ; 0x1357B400  — the "_any" canonicalisation
       remoteType = MemRefType::get(localType.shape, .elem, .layout,
                       MemorySpaceAttr::get(ctx, AddressSpaceToMemorySpace(anySpace)))
       anyPtrTy = LLVMPointerType::get(ctx, anySpace)   ; 0x1746EB40
       if (anySpace != 205 /*Vmem*/)                    ;  Vmem is already global → cast SKIPPED
           base = tpu_addrspacecast::create(builder, loc, anyPtrTy, base) - 16   ; 0x146D5EA0

[f]  descriptor.field[0] = descriptor.field[1] = base   ; allocated + aligned ptr; OFFSET/SIZES/STRIDES untouched
     pack(descriptor) → newValue                        ; MemRefDescriptor::pack 0x171BD460
     replaceOp(op, newValue)                            ; 0x1C951540

决定性的事实,全部反编译证实:

  • 仅基指针发生变化。 降低将转换结果写入描述符字段 [0][1](已分配 + 对齐指针)并重新打包本地描述符的其余部分逐字 - 偏移量、大小、步长保持其本地值。对等方拥有相同布局的 memref,因此相同的偏移量/步幅寻址相同的逻辑元素。
  • 通用重新标记是带有一个操作数的 tpu_addrspacecast(基本指针)。 "_any" 目标空间来自 GetAnyTypeFromAddressSpace。强制转换是唯一的地址空间更改。
  • Vmem (205) 跳过转换。 if (AnyTypeFromAddressSpace != 205) 门控 tpu_addrspacecast::create — Vmem 已经是全局切换空间,因此不需要重新标记。
  • 瓦片路径将 core-id 作为操作数注入,而不是指针位。 对于瓦片上 TileSpmem (201) / TileSmem (219) 源,降低调用瓦片转换助手,该助手读取父函数的 sc.sequencer 属性并(在 TEC“执行”上下文中)构建tpu_tileid 并发出 2 操作数 tpu_addrspacecast_{spmem,smem},其中tile-id 作为第二个操作数。动态形状防护(hasRank + 形状行走) emitOpError 如果在动态形状上使用图块→非图块路径,则“使用 TileS(p)mem -> S(p)mem 转换时不支持动态形状”。

QUIRK — 片外通用远程指针没有 核心 ID。 matchAndRewrite仅重新标记8位地址空间;对等核心/芯片路由使用单独的 remoteCoreId 操作数(以及 DMA 目标 ID 插槽的下游)。只有 on-tile 路径将 id 折叠到强制转换中 — tpu_tileid 第二个操作数。硬件“_any”指针是否在二进制文件公开的 LLVM-IR 表面下方额外编码高地址位中的核心/芯片字段;在 IR 级别,路由纯粹是操作数。 addrspacecast ISel(每个转换成为哪个内在函数以及它在 SelectionDAG 中的匹配方式)位于 addrspacecast ISel 上。

跨芯片地址组成

将这三个单元放在一起,DMA 引擎消耗的物理远程指针是一个三部分元组,并且降低只触及其中的一部分:

text
        remote memref  =  ⟨ address-space ; local-offset/sizes/strides ; core-id ⟩

   address-space  : the LLVM pointer's address-space integer (re-tagged by matchAndRewrite to the
                    "_any"/peer ID — SpmemAny 0xDA / HBMAny 0xD5 / SflagAny 0xD3 / SmemAny 0xD4 /
                    Vmem 0xCD self / or the tile-peer Spmem 0xCA / Smem on the tile path)

   local-offset   : the UNCHANGED descriptor offset + sizes + strides — NOT recomputed; the peer
                    holds an identical-layout memref

   core-id        : NOT folded into the off-tile pointer — it rides the separate remoteCoreId operand
                    (→ DMA destination-id); on the tile path it IS the tpu_tileid 2nd cast operand
```text

---

## §3 — 对等 core-id:共享 `{device, core}` 源

`remoteCoreId` 操作数 `GetRemoteMemBase` 消耗和 GeneralDma `destination_id`(5 位跨核路由槽)均源自**相同** `{device, core}` 计算 — `getRemoteDeviceAndSparseCoreIds<EnqueueDMAOp>` (`0x13511660`)。这种绑定使解析的数据库和路由同步核心保持一致。

`getRemoteDeviceAndSparseCoreIds` 索引转换 EnqueueDMAOp 的两个 id `Value` (`arith::IndexCastOp`),读取 `EnqueueDMAOp::getTargetCoreType`,对于 **SPARSE** 目标(核心类型 2),将核心 id 除以每个 SparseCore TEC 计数,然后返回`{device, core}` 对:

```text
getRemoteDeviceAndSparseCoreIds<EnqueueDMAOp>(builder, deviceId, coreId):
   deviceId = arith::IndexCastOp::create(... deviceId)     ; 0x13511722
   coreId   = arith::IndexCastOp::create(... coreId)       ; 0x135117C3
   switch (EnqueueDMAOp::getTargetCoreType()):              ; 0x14AF8B20
       case 0 (TENSOR):  r13 = 2
       case 1:           r13 = 4
       case 2 (SPARSE):  tec  = *(int*)(*(QWORD*)(target + 0x948) + 0x90)   ; per-SC TEC count
                         coreId = DivUIOp(coreId, ConstantIndexOp(tec))     ; the SPARSE sub-core divide
                         r13 = 4
   coreId = AddIOp(coreId, ConstantIndexOp(r13))            ; r13 added back as a core-type offset
   return FailureOr<DeviceAndCoreIds>{ deviceId, coreId }

[target+0x948]+0x90 字段是每个 SparseCore TEC 序列器计数(v5p/v6e/v7x 上为 16),此处的 DivUIOp 是目标 id SPARSE 步长 (SparseCoresPerLogicalDevice × TEC_count) 的精确逆。在调用现场,issueGeneralDma的远程臂(0x1350B4A1)将两个DeviceAndCoreIds字段交给GetRemoteMemBase作为v2(remoteCoreId)和v3,成为get_remote_memref操作数1& 2.

舞台fn (@VA)行动
0. 设备/核心 id 操作数getRemoteDeviceAndSparseCoreIds 0x13511660arith::IndexCastOp 每个 id
1.目标核心类型EnqueueDMAOp::getTargetCoreType 0x14AF8B200 张量 / 1 / 2 稀疏(memref MemorySpace → CoreType)
2. SPARSE子核划分[target+0x948]+0x90(TEC 计数)DivUIOp(coreId, TEC_count)
3.构建DeviceAndCoreIds(返回FailureOr<>){deviceId, coreId}
4a。 → DMA destination_idissueGeneralDma相同的 ids → 拓扑除数 → 5 位槽
4b。 → get_remote_memrefissueGeneralDma 遥控臂 0x1350B4A1GetRemoteMemBase 0x13D88660相同的 ids → op1=remoteCoreId, op2=v3

4a和4b都消耗第3阶段{device, core}; SPARSE TEC 计数除数 [target+0x948]+0x90 与阶段 2 中的字段与目标 ID SPARSE 步长相同。数据库在这里解决;路由同步核心由目的地 ID 命名——一个 {device, core} 计算的两个消费者。目的地 id 拓扑算法和路由它的 GeneralDma 汇编器位于 StartRemoteDma 和 GeneralDma 发射器上。

GOTCHA — get_remote_memref 的可选第四个操作数 (v4) 由远程 DMA 路径保留 nullissueGeneralDma 传递 rcx = 0 / r8d = 0(当前字节已清除)。它的角色——远程标志/偏移第二个组件——是高电平,只能从 build 中存在的可选操作数和集体驱动程序更丰富的调用形状中观察到,而不是 CHECK 固定。


相关组件

名称关系
GetRemoteMemBase (0x13D88660){localMemref, remoteCoreId, …} 构建操作的解析器
MemorySpaceToAny (0x14B786E0)远程可寻址过滤器(数据存储器提升;控制空间致命)
GetRemoteMemRefOpLowering::matchAndRewrite (0x1357AE40)LLVM 降低,重新标记基指针
GetAnyTypeFromAddressSpace (0x1357B400)具体 AS-id → "_any" 超集(通用重新标记目标)
tpu_addrspacecast::create (0x146D5EA0)执行通用重新标记的 1 操作数转换
getRemoteDeviceAndSparseCoreIds (0x13511660)remoteCoreId 的共享 {device, core} 生产者和 DMA 目标 ID

交叉引用

  • On-Pod 集体 — 剖面图 — 第 XIII 部分的导航条目;该远程内存引用单元所在的 SparseCore 卸载基板。
  • StartRemoteDma — 全部生产者 + SubsliceToFullSliceGlobalCoreId,以及消耗此处解析的远程基地的 GeneralDma 传输。
  • SC-卸载配置生成器 — 驱动远程 DMA 集体驱动程序的 SparseCore 卸载集体配置构建器。
  • 脂肪指针 (AS7/8/9) — SparseCore 指针表示和 "_any" 促销登陆的 AS-id ↔ MemorySpace 表;为什么路由是操作数,而不是指针位。
  • addrspacecast ISeltpu_addrspacecast 系列如何在 SelectionDAG(瓷砖上铸造 ISel 机制)中进行选择。
  • 二进制: extracted/libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64/libtpu/libtpu.so(构建 ID 89edbbe81c5b328a958fe628a9f2207d)
  • 索引条目: 第 XIII 部分 — On-Pod Collectives & Barriers / SparseCore-offload Collectives — 返回索引