get_remote_memref
此页上的每个地址、偏移量、操作数索引和字符串都是从
libtpu-0.0.40-cp314轮中的libtpu.so中精确读取字节的(内部版本libtpu_lts_20260413_b_RC00,BuildID md589edbbe81c5b328a958fe628a9f2207d)。其他版本有所不同。地址是二进制文件自己的 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:其操作数顺序(localMemref、remoteCoreId、v3、可选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是远程可寻址过滤器。 仅数据存储器(smem、tile_spmem/spmem、hbm、vmem和smem_tile/smem_scs别名)推广;每个控制/暂存空间(sflag、dreg、timem、simem、iova、mar、*_cb和sflag_*库)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) |
| OpTraits | ZeroRegions, OneResult, OneTypedResult<MemRefType>, ZeroSuccessors, AtLeastNOperands<3u>, OpInvariants |
| 旋转变压器 | lowering_util::GetRemoteMemBase(0x13D88660、lowering_util.cc:5356) |
| 构建 | 0x1459AB40 — op0=localMemref、op1=remoteCoreId、op2=v3、op3=v4(可选),结果类型最后 |
| 创建(3操作/4操作) | 0x145C64E0 / 0x145C6600(4-op 是 GetRemoteMemBase 调用的) |
| 验证InvariantsImpl | 0x145C66A0 — op0 → sc_ops12 (MemRefType); op1,op2 → sc_ops2(类似索引) |
| getLocalMemrefMemorySpace | 0x146B0000 — 操作数 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 添加到操作的结果类型向量的最后:
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(位置字符串嵌入在正文中)。
它的作用是什么
反编译体是一个四步管道。它不计算绝对地址:
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 级别,路由纯粹是操作数。addrspacecastISel(每个转换成为哪个内在函数以及它在 SelectionDAG 中的匹配方式)位于 addrspacecast ISel 上。
跨芯片地址组成
将这三个单元放在一起,DMA 引擎消耗的物理远程指针是一个三部分元组,并且降低只触及其中的一部分:
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 0x13511660 | arith::IndexCastOp 每个 id |
| 1.目标核心类型 | EnqueueDMAOp::getTargetCoreType 0x14AF8B20 | 0 张量 / 1 / 2 稀疏(memref MemorySpace → CoreType) |
| 2. SPARSE子核划分 | [target+0x948]+0x90(TEC 计数) | DivUIOp(coreId, TEC_count) |
3.构建DeviceAndCoreIds | (返回FailureOr<>) | {deviceId, coreId} |
4a。 → DMA destination_id | issueGeneralDma | 相同的 ids → 拓扑除数 → 5 位槽 |
4b。 → get_remote_memref | issueGeneralDma 遥控臂 0x1350B4A1 → GetRemoteMemBase 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 路径保留 null:issueGeneralDma传递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 ISel —
tpu_addrspacecast系列如何在 SelectionDAG(瓷砖上铸造 ISel 机制)中进行选择。 - 二进制:
extracted/libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64/libtpu/libtpu.so(构建 ID89edbbe81c5b328a958fe628a9f2207d) - 索引条目: 第 XIII 部分 — On-Pod Collectives & Barriers / SparseCore-offload Collectives — 返回索引