StartRemoteDma
此页上的每个地址、偏移量、操作数索引和字符串都是从
libtpu-0.0.40-cp314轮中的libtpu.so中精确读取字节的(内部版本libtpu_lts_20260413_b_RC00,BuildID md589edbbe81c5b328a958fe628a9f2207d)。其他版本有所不同。地址是二进制文件自己的 VMA(text/rodata VMA == 文件偏移量;.data.rel.ro文件偏移量 = VMA −0x200000)。
摘要
SparseCore 卸载的全对所有需要启动远程 DMA:将本地源缓冲区写入对等芯片的缓冲区中,位于对等 SparseCore 上的切片上的某个位置。 libtpu 通过一个驱动程序 — OffloadFactory::StartRemoteDma (0x133EBCC0) — 来完成此操作,该驱动程序是全对所有集体的每目标传输启动器。本页记录了整个 StartRemoteDma launch 单元:驱动程序组装的描述符、将子切片本地核心 id 转换为远程一半消耗的平面全局核心 id 的 SubsliceToFullSliceGlobalCoreId 生成器,以及有关跨芯片指针的头条负面结果 — 远程目标 未 位打包到 DMA 指针中;它使用全局核心 ID 作为操作数。
驱动器发出的传输是密集的 get_remote_memref 分辨率加上 sc_tpu.dma_general_start。 StartRemoteDma 的工作是围绕该发射进行“协调管道”:它 (1) 将每个目标子切片核心 id 映射到平面全局核心 id(SubsliceToFullSliceGlobalCoreId、0x133E7900),(2) 将该全局 id 馈送到 GetRemoteMemBase 作为 remoteCoreId 操作数 — 关闭get_remote_memref(EnqueueDMA 路径的 getRemoteDeviceAndSparseCoreIds 的兄弟)的全部到全部提要,(3) 计算兆核感知目标 核心索引 (ComputeRemoteCoreIndex) 和目标 芯片 id (GlobalCoreIdToPhysicalChipId → SubsliceToFullSlice),以及 (4)降低可选步幅并发出 DmaGeneralStartOp::create 信号。 global-core-id 算法是封闭形式的:ToGlobalCoreId(chip, localCore) = chip × SparseCoresPerLogicalDevice + localCore 及其逆 GlobalCoreIdToPhysicalChipId(coreId) = coreId / SparseCoresPerLogicalDevice。
位打包故事与 SparseCore 指针模型建立的负面故事相同(请参阅 addrspacecast ISel 和 脂肪指针 (AS7/8/9)):DMA 引擎消耗的脱离块远程指针是一个 32 位字偏移,其唯一的变化是其 8 位地址空间标记 — tpu_addrspacecast 降低到保留值MVT::i32 重新标记,注入无核心/芯片位。 TPU DataLayout 保留的 160/128/192 位 AS7/AS8/AS9 胖指针 空间是非完整的,并且不是在 off-tile 铸造站点构建的。因此,对等核心/芯片作为全局核心 ID(操作数 + DMA 目标 ID)传输,与此处记录的完全相同。
重新实现,合约为:
StartRemoteDma是get_remote_memref+dma_general_start上的瘦坐标管道驱动程序。 它不会移动数据或重新触及超出GetRemoteMemBase功能的描述符基础;它计算传输所需的三种“远程核心 id”——全局 id(用于数据库)、megacore 感知的核心索引和芯片 id——并发出一个DmaGeneralStartOp。- 远程核心是一个平面全局核心ID,从来不是指针位字段。 将其组成为
chip × SparseCoresPerLogicalDevice + localCore;用精确的逆除法分解。 off-tiletpu_addrspacecast仅重新标记地址空间(MVT::i32);没有芯片/核心落在指针上。 - **子切片→全切片重新映射是坐标偏移重新线性化。**子切片对整个切片进行寻址:获取芯片 ID,分解为坐标,添加运行时子切片原点坐标,针对全切片芯片边界重新线性化,然后使用子切片本地重新展平为全局核心 ID
localCore。 - 拒绝远程
TileSpmem数据目标,除非存在tile_id。 如果源 memref 或目标 memref 为tile_spmem(内存空间 2),并且需要tile_id.has_value()用于远程,则驱动程序RetCheckFailTileSpmem目的地。
| 驱动程序 | OffloadFactory::StartRemoteDma (0x133EBCC0, ~0x8E0 B, offload_collective_factory.cc) |
| 全球核心 ID 生产者 | OffloadFactory::SubsliceToFullSliceGlobalCoreId(0x133E7900、0xA0 B) |
| 压平 | ToGlobalCoreId (0x133E6880) = chip × SparseCoresPerLogicalDevice + localCore |
| 展开 | GlobalCoreIdToPhysicalChipId (0x133E7BC0) = coreId / SparseCoresPerLogicalDevice |
| 子切片重新映射 | SubsliceToFullSlice (0x133E79A0) — 坐标 + 原点 → 重新线性化 |
| Megacore dst 指数 | ComputeRemoteCoreIndex (0x133E7F80) |
| 数据库 | lowering_util::GetRemoteMemBase (0x13D88660) — 将全局核心 ID 作为 remoteCoreId |
| 发射操作 | sc_tpu.dma_general_start 通过 DmaGeneralStartOp::create (0x145B1880 / 0x145B16E0) |
| 指针位打包 | 在瓷砖外路径上没有 — tpu_addrspacecast → 保值 MVT::i32 重新标记 |
| 信心 | 已确认(反编译锚定),除非行或标注另有说明 |
发布 — OffloadFactory::StartRemoteDma
用途
StartRemoteDma (0x133EBCC0) 是 SparseCore 卸载多对多的每目标远程传输启动器。给定源 memref、目标 memref、每个目标子切片核心 id 以及 sflag/offset/stride 描述符片段的捆绑包,它会在已解析的对等 SparseCore 上组装并发出一个 sc_tpu.dma_general_start,将本地源写入对等的目标缓冲区。它的分解签名是
xla::tpu::sparse_core::collective::OffloadFactory::StartRemoteDma(
mlir::OpBuilder&, mlir::Value src, mlir::Value dst, mlir::Value remoteCoreId,
mlir::Value, SflagAndIndex, SflagAndIndex, mlir::Value, BufferOffset, BufferOffset,
std::optional<DmaStrides>, std::optional<mlir::Value>) const
```text
源自 `platforms/xla/sparse_core/offload_collective_factory.cc`(位置字符串嵌入在主体的 `LogMessageFatal` / `RetCheckFail` 站点)。它是密集 `issueGeneralDma` 远程臂的全对兄弟 - 两者都终止于 `DmaGeneralStartOp`,都解析相同的 `get_remote_memref` 数据库,但 `StartRemoteDma` 从*集体*坐标管道而不是从 `getRemoteDeviceAndSparseCoreIds` 生成其 `remoteCoreId`。
### 算法
反编译主体(`0x133EBCC0`)是一个守卫序言、坐标管道和两个 `DmaGeneralStartOp::create` 调用形状之一(有或没有跨步)。 `Value` 操作数映射到反编译器的 `a*` 参数,如下所示:`src = a16`、`dst = a19`、`remoteCoreId = a7`(保存在 `v132`/`v39` 中)。
```c
function StartRemoteDma(b, src, dst, remoteCoreId, ...): // 0x133EBCC0
// [0] read the "count_dones" / strict-vs-relaxed completion mode attrs
mode = self.flag[+1720] ? "relaxed" : "strict" // 0x133EBDxx
// [1] GUARD: reject remote TileSpmem data targets (memory space 2)
if GetMemorySpace(src.type) == 2: // 0x133EBD75
RetCheckFail("!src.tile_spmem()", line 1210) // → Status, return
if GetMemorySpace(dst.type) == 2: // 0x133EBD96
RetCheckFail("!dst.tile_spmem()", line 1212)
if GetMemorySpace(dst.type) == 2 && !tile_id.present: // 0x133EBDB7
RetCheckFail("tile_id.has_value()", line 1215)
// "tile_id must be provided for DMA to remote TileSpmem."
// [2] local dst memref offset adjust (an AddIOp on a ConstantIndexOp(4))
localMemref = AddIOp(dst_base, ConstantIndexOp(4)) // v33 @0x133EBE..
// [3] subslice core id → flat GLOBAL core id
gcid = SubsliceToFullSliceGlobalCoreId(b, remoteCoreId) // 0x133E7900 @0x133EBE6A → v40
// [4] remote DATA base: feed the GLOBAL core id as GetRemoteMemBase's remoteCoreId
remoteBase = GetRemoteMemBase(dst /*a19*/, loc, localMemref=v33,
remoteCoreId = gcid /*v40*/, ...) // 0x13D88660 @0x133EBEB1
// [5] megacore-aware destination CORE INDEX (routing)
ComputeRemoteCoreIndex(b, /*v134*/, remoteCoreId /*v39*/) // 0x133E7F80 @0x133EBEC7
// [6] destination CHIP id = unflatten then full-slice remap
chipId = GlobalCoreIdToPhysicalChipId(b, remoteCoreId) // 0x133E7BC0 @0x133EBF14 → v45
fullSlice = SubsliceToFullSlice(b, chipId) // 0x133E79A0 @0x133EBF22 → v132
// [7] optional strides → ISA strides, then EMIT
if dma_strides.present[+112] == 1: // @0x133EBF94
isaStrides = ConvertDmaStridesToIsaStrides(b, dma_strides) // 0x133EAFC0 @0x133EBFB0
DmaGeneralStartOp::create(b, ..., remoteBase, ..., fullSlice, ...,
isaStrides...) // 0x145B1880 @0x133EC1DC (with strides)
else:
DmaGeneralStartOp::create(b, ..., remoteBase, ..., fullSlice, ...) // 0x145B16E0 @0x133EC41D
return ok决定性的事实,全部反编译证实:
- 全局核心ID产生一次(步骤3)并以三种方式消耗。 它是
GetRemoteMemBase的remoteCoreId(数据库,步骤4);它是ComputeRemoteCoreIndex的输入(兆核感知路由索引,步骤 5);它是GlobalCoreIdToPhysicalChipId的输入(目标芯片 ID,步骤 6)。描述符所需的三个“远程核心”数量均源自“相同”SubsliceToFullSliceGlobalCoreId结果 - 保持解析的数据库和路由目的地一致。 - 远程数据库来自
GetRemoteMemBase,而不是来自StartRemoteDma本身。 步骤4是get_remote_memref的全对全提要:全局核心IDv40作为GetRemoteMemBase的remoteCoreId传递,成为get_remote_memref操作数 1。基本重标记(描述符指针上的tpu_addrspacecast)由get_remote_memref拥有;StartRemoteDma仅提供核心 ID。 - 驱动程序直接发出 GeneralDma。 与密集路径不同,集体驱动程序不通过
EnqueueDMAOp进行路由;它调用DmaGeneralStartOp::create内联,以目标芯片 ID(fullSlice= 步骤 6)和 megacore 核心索引(步骤 5)作为路由操作数,以remoteBase(步骤 4)作为目标基数。
TileSpmem 拒绝防护装置
序言运行三个GetMemorySpace(...) == 2测试(内存空间2==tile_spmem):
| 检查 | @VA | 线 | 状况 | 消息 |
|---|---|---|---|---|
!src.tile_spmem() | 0x133EBD75 | 1210 | GetMemorySpace(src) == 2 → 失败 | RetCheckFail |
!dst.tile_spmem() | 0x133EBD96 | 1212 | GetMemorySpace(dst) == 2 → 失败 | RetCheckFail |
tile_id.has_value() | 0x133EBDB7 | 1215 | GetMemorySpace(dst) == 2 && !tile_id → 失败 | “必须为远程 TileSpmem 的 DMA 提供tile_id。” |
GOTCHA — 这三项检查并不多余。前两个完全拒绝 tile-local
tile_spmem(空格 2)源或目标 — 如果没有切片选择器,切片 SPMEM 缓冲区不是有效的远程 DMA 端点。仅当 dst 是图块解析的TileSpmem并且可选的tile_id(a24/v.present) 不存在时,才能达到第三个:允许远程TileSpmem写入,但必须显式命名图块。这与get_remote_memref图块路径使用的图块 id 作为操作数规则相同(tpu_tileid作为演员的第二个操作数),作为启动时前提条件出现。
两种发射形状
驱动程序以两个 DmaGeneralStartOp::create 调用之一结束,在可选的 DmaStrides 当前字节(*(dma_strides + 112) == 1、0x133EBF94)上选择:
- strided(
0x145B1880,调用@0x133EC1DC):较长的参数列表,前面是ConvertDmaStridesToIsaStrides(0x133EAFC0),它将DmaStrides三元组降低为 ISA 跨步形式;发射带有额外的步幅ValueRanges。 - 连续(
0x145B16E0,调用@0x133EC41D):较短的参数列表,无跨步操作数。
两种形状都将 remoteBase 作为目标基础和 v132(全片目标芯片 ID)传递到布线槽中。 DmaGeneralStartOp 中的每个操作数角色(其中 Value 是目标 id、dst 索引和步幅)取决于操作的 ODS 布局和调用站点生产者顺序,而不是该站点上每个操作数的 getter - 在下面标记为 HIGH。
注意 — 发出还带有在序言中读取的完成计数模式:
self.flag[+1720]选择字符串"relaxed"与"strict"写入count_dones键控的StringAttr(0x133EBDxx)。这是 DMA 的完成计数规则(完成信号的宽松排序与严格排序),作为属性插入到操作中;它的下游语义位于 GeneralDma 发射器上,而不是此处。
制作人 — SubsliceToFullSliceGlobalCoreId
用途
SubsliceToFullSliceGlobalCoreId(0x133E7900、0xA0 B)是全能集体的remoteCoreId制作人。 子切片上的全对所有必须寻址完整切片上的对等点;集体调度程序提供的每个目标核心 ID StartRemoteDma 是一个子切片本地核心 ID,此函数将其扁平化为远程基础解析器和 DMA 路由期望的 全局 核心 ID。其分解后的签名是OffloadFactory::SubsliceToFullSliceGlobalCoreId(mlir::OpBuilder&, mlir::Value coreId) const。
算法
function SubsliceToFullSliceGlobalCoreId(b, coreId): // 0x133E7900
if self.target[+0x930] != 1: // SupportSubslices flag @0x133E7903
return coreId // no subslice → identity
chipId = GlobalCoreIdToPhysicalChipId(b, coreId) // 0x133E7BC0 @0x133E7927
fullSliceChip = SubsliceToFullSlice(b, chipId) // 0x133E79A0 @0x133E7935
divisor = LogicalDevicesPerChip(TENSOR=0) // 0x1D615B00 @0x133E7942
→ IdxConst(divisor) // 0x133E6BA0 @0x133E7950
localCore = arith.RemUIOp(coreId, divisor) // 0x1CB20800 @0x133E796C
return ToGlobalCoreId(b, fullSliceChip, localCore) // 0x133E6880 @0x133E798C
```text
结构分解→重新映射芯片→与原始本地核心重新扁平化:
```text
coreId ──GlobalCoreIdToPhysicalChipId──► chipId
│
SubsliceToFullSlice (coords + subslice-origin, re-linearize)
│
▼
fullSliceChip
coreId ──RemUI(LogicalDevicesPerChip)──► localCore
│
ToGlobalCoreId(fullSliceChip, localCore) ──► full-slice GLOBAL core id怪异 — 守卫是
self.target[+0x930] != 1(SupportSubslices)。在没有子切片的平台上,该功能是身份 - 传入的核心ID已经是完整切片全局ID,并且整个分解/重新映射/重新展平链被跳过。重新实现不得无条件运行重新映射;无子切片路径逐字返回输入。
封闭式算术
展平/反展平对是封闭形式的,与密集 EnqueueDMA 目标 ID 步长共享 SparseCoresPerLogicalDevice 除数(因此两个远程 DMA 路径在拓扑算法上一致):
function ToGlobalCoreId(chip, localCore): // 0x133E6880
stride = CoresPerChip(SPARSE=2) / LogicalDevicesPerChip(SPARSE=2) // idiv @0x133E68D7
= SparseCoresPerLogicalDevice
if stride == CoresPerChip(SPARSE): // one logical device per chip
return chip // → identity (no flatten)
AlwaysAssert(localCore < LogicalDevicesPerChip(TENSOR=0), // 0x13D7F9C0, line 651
"Core index should be smaller than the number of logical devices per chip.")
return arith.MulIOp(chip, IdxConst(stride)) + localCore // MulIOp 0x1CAF0C40, AddIOp 0x1CAF0B00
function GlobalCoreIdToPhysicalChipId(coreId): // 0x133E7BC0
stride = CoresPerChip(SPARSE=2) / LogicalDevicesPerChip(SPARSE=2)
if stride == CoresPerChip(SPARSE): // one logical device per chip
return coreId // → identity (no divide)
return arith.DivUIOp(coreId, IdxConst(stride)) // 0x1CB06D00 @0x133E7C6B
```text
`GlobalCoreIdToPhysicalChipId` 与 `ToGlobalCoreId` 的芯片步长完全相反。当 `stride == CoresPerChip(SPARSE)` 时,两者都会折叠到同一性 - 即当每个芯片只有一个逻辑设备时,全局核心 ID *就是*芯片 ID,因此既不会发出乘法,也不会发出除法。
> **QUIRK —** 两个除数来自不同的核心类型。 `SubsliceToFullSliceGlobalCoreId` 的 `localCore` 提取将 `coreId` 除以 `LogicalDevicesPerChip(TENSOR=0)`(`RemUIOp` @`0x133E796C`),而芯片展平/取消展平使用 `SparseCoresPerLogicalDevice = CoresPerChip(SPARSE=2)/LogicalDevicesPerChip(SPARSE=2)`。对于 `LogicalDevicesPerChip` 等于 `TENSOR` 和 `SPARSE` 的常见几何形状,这些是一致的。 mod 中的 `TENSOR` (`esi=0`) 除数与码片除法中的 `SPARSE` (`esi=2`) 的比率在算术中直接可见;这种相等性是有意为之还是编码故意的 TENSOR-vs-SPARSE 逻辑设备不对称性不能仅从指令流来解决。
### 子切片坐标重映射
`SubsliceToFullSlice` (`0x133E79A0`) 是 all-to-all 用于到达其自己子片之外的对等点的芯片 ID 转换。它保护相同的 `target[+0x930]` (`SupportSubslices`) 位,查询全切片几何,读取运行时子切片原点,并重新线性化:
```c
function SubsliceToFullSlice(b, subsliceChipId): // 0x133E79A0
assert self.target[+0x930] == 1 // SupportSubslices @0x133E79BA
bounds = TpuTopology::GetFullSliceChipBoundsForSubslice() // 0x20AD2F60 @0x133E79DE
assert bounds.has_value() // "full_slice_chip_bounds.has_value()"
origin = LoadSubsliceOrigin(b) // 0x133E7840 @0x133E7A2A (SubsliceOriginOp)
subCoords = ChipIdToCoordinates(b, subsliceChipId, dims) // 0x133E7640 @0x133E7A50
// FULL-slice chip id = linearize( subCoords + origin against bounds )
return rowMajor(subCoords[d] + origin[d], bounds) // 3×AddIOp + 2×MulIOp + 2×AddIOp
// @0x133E7A77..0x133E7B70LoadSubsliceOrigin (0x133E7840) 实现了 sc_tpu.subslice_origin 操作(SubsliceOriginOp::create、0x14610960)——此子片的原始芯片 ID 的运行时寄存器读取——并将其分解为坐标。 ChipIdToCoordinates (0x133E7640) 是根据每维芯片边界将芯片 id 分解为 (x, y, z) 的标准基数分解(RemUIOp/DivUIOp 链)。因此,重映射会按运行时原点偏移子片本地芯片坐标,并根据全片几何形状(跨子片对等方占用的全片芯片 ID)重新线性化。
超级核心目标索引 — ComputeRemoteCoreIndex
ComputeRemoteCoreIndex (0x133E7F80) 生成 DMA 路由使用的兆核感知目标核心索引(与数据库的全局核心 id 和路由的芯片 id 不同)。它是在超级核心处于活动状态时进行门控的:
function ComputeRemoteCoreIndex(b, ..., coreId): // 0x133E7F80
megacore = TpuChipConfig::Megachip() // 0x20AFCC00 @0x133E7FA9
&& self.target[+0x3B8][+0x94] > 0 // TpuTopology.TpuChipConfig @0x133E7FBD
&& ( (self[+0x628] & 4) || self.target[+0x540] == 1 ) // @0x133E7FC6 / @0x133E7FCF
if megacore:
stride = SparseCoresPerLogicalDevice // idiv @0x133E8011
localCore = arith.RemUIOp(coreId, stride) // @0x133E8071
pick = arith.CmpIOp(localCore, 1) // 0x1CAFE620 @0x133E80AC
return arith.SelectOp(pick, formA, formB) // 0x1CB317A0 @0x133E814D
else: // @0x133E8042
return simpleIndex
```text
当megacore处于活动状态时,每个逻辑设备有两个SparseCore融合; `CmpIOp(localCore, 1)` 上的 `SelectOp` 在两种兆核半索引形式之间进行选择,以便 DMA 瞄准正确的物理一半。如果没有兆核,则返回更简单的索引。 `[target+0x3B8]`(`TpuTopology`,`+0x18` → `TpuChipConfig`)和 `[target+0x540]` / `[self+0x628]&4` 偏移量与 SC 卸载门读取的巨核/SC 卸载字段相同(请参阅 [On-Pod 集体 — 剖面图](overview.md) §5)。这是密集目的地 ID imul 的超级核心兄弟。
---
## 远程指针 — 在非瓦片路径上无位打包
头条负面结果:**DMA 引擎消耗的跨芯片指针不会在其位中对对等核心/芯片进行编码。**远程目标使用全局核心 id(操作数 → 目标 id),并且指针本身仅重新标记地址空间。三个二元证据表明了这一点:
- **off-tile `tpu_addrspacecast` 是一个保值的 `MVT::i32` 重新标记。** `GetRemoteMemRefOpLowering` 使用 1 操作数 `tpu_addrspacecast` 将描述符基数转换到 `"_any"` 空间,并且该转换的 LLVM 后端降低(`TPUTargetLowering::LowerADDRSPACECAST`,`0x13B70480`)发出一个保值SDNode(操作码`0xF3`,结果`MVT::i32`),携带*相同的* 32位输入指针,仅改变其结果类型的地址空间标记。不计算新地址;没有注入核心/芯片字段。 ISel 机制(合法性矩阵、无操作折叠禁用、AA sflag 组)归 [addrspacecast ISel](../sparsecore/addrspacecast-isel.md) 所有。
- **后端没有为转换建模指针位结构。** `computeKnownBitsForTargetNode` (`0x13B7A8E0`) 仅处理节点 `0x216`; addrspacecast 节点 `0xF3` 不存在 - 后端不跟踪它的位打包结构,将其视为不透明值传递,而不是具有打包子字段的地址。
- **AS7/AS8/AS9 胖指针空间被保留,但在转换时未使用。** TPU DataLayout 将 AS7/8/9 定义为 160/128/192 位 **非整数** 结构化指针(索引宽度 32/48/32) — 打包 `{core/chip, address-space, offset}` 指针的自然位置 — 但非平铺转换结果是`MVT::i32`(32位字偏移量,AS2/3/5/6 = `p:32:32`),因此off-tile远程指针**不**使用胖指针编码。胖指针表示、AS-id ↔ `MemorySpace` 表以及为什么路由是操作数而不是指针位位于 [脂肪指针 (AS7/8/9)](../sparsecore/fat-pointers-as789.md) 上。
```text
what the DMA descriptor actually carries (off-tile remote DMA):
remote target = ⟨ base pointer ; offset/sizes/strides ; routing ⟩
│ │ │ │
│ tpu_addrspacecast UNCHANGED DmaGeneralStart
│ → MVT::i32 re-tag (local values) destination id
│ (8-bit AS only, + chip id
│ NO core/chip bits) (from the global
│ core id, this page)
▼
the peer core/chip is the GLOBAL CORE ID — an operand/destination-id,
never a field of the 32-bit pointer word.QUIRK — 达到“远程指针 = pack(chip, core, offset)”模型的重新实现者对于 off-tile 路径来说将是错误的。 DMA 描述符的 base 是翻转了一个地址空间标签的本地基址;偏移量/大小/步幅是本地 memref,未更改(对等方拥有相同布局的 memref,因此相同的偏移量会命中相同的元素);路由是该页面计算的全局核心 ID,作为目的地线程到
DmaGeneralStartOp中。将 id 折叠为指针的唯一路径是 on-tileTileSpmem/TileSmem转换 — 其中tpu_tileid作为转换的第二个 操作数,仍然不是地址位包。磁贴上的磁贴 ID ISel 位于 addrspacecast ISel 上。
功能图
| 功能 | @VA | 角色 |
|---|---|---|
OffloadFactory::StartRemoteDma | 0x133EBCC0 | 每个目标远程 DMA 启动器(本页) |
SubsliceToFullSliceGlobalCoreId | 0x133E7900 | 子片核心 id → 平面全局核心 id |
ToGlobalCoreId | 0x133E6880 | chip × SparseCoresPerLogicalDevice + localCore |
GlobalCoreIdToPhysicalChipId | 0x133E7BC0 | coreId / SparseCoresPerLogicalDevice(逆) |
SubsliceToFullSlice | 0x133E79A0 | 坐标 + 子切片原点 → 全切片芯片 id |
LoadSubsliceOrigin | 0x133E7840 | SubsliceOriginOp(运行时原始芯片 ID)→ 坐标 |
ChipIdToCoordinates | 0x133E7640 | 基数分解芯片id → (x, y, z) |
ComputeRemoteCoreIndex | 0x133E7F80 | 巨核感知目标核心索引 |
IdxConst | 0x133E6BA0 | arith.ConstantIndexOp(带value < kMaxNumberOfElements = < 2³²检查) |
GetRemoteMemBase | 0x13D88660 | 远程数据库(提供全局核心ID) |
ConvertDmaStridesToIsaStrides | 0x133EAFC0 | DmaStrides → ISA 步幅形式 |
DmaGeneralStartOp::create | 0x145B1880 / 0x145B16E0 | 发出 sc_tpu.dma_general_start(跨步/连续) |
注意事项
StartRemoteDma返回Status样式的结果。 成功时主体返回1,RetCheckFail上返回CreateStatusAndConditionallyLog;重新实现必须传播失败(三个 TileSpmem 先决条件)而不是断言。- 可选的
DmaStrides和可选的最终Value(tile id)门两个控制流。 跨度存在字节(+112)选择长/短DmaGeneralStartOp::create; tile-id 当前字节门控第三个 TileSpmem 前提条件。两者都是std::optional,在 ABI 中线程化为present字节 + 有效负载对。 - 目标芯片 ID 也全切片重新映射(步骤 6),而不仅仅是数据库核心 ID。 数据库(通过全局核心 ID)和路由(通过
GlobalCoreIdToPhysicalChipId→SubsliceToFullSlice)都经过相同的子切片→全切片翻译,因此跨子切片即使每个目标 id 到达子切片本地,所有到所有的路由也正确。
相关组件
| 名称 | 关系 |
|---|---|
SubsliceToFullSliceGlobalCoreId (0x133E7900) | 该驱动程序消耗的集体 remoteCoreId 生产者 |
ToGlobalCoreId / GlobalCoreIdToPhysicalChipId | 展平/非展平对(共享 SparseCoresPerLogicalDevice 步幅) |
SubsliceToFullSlice (0x133E79A0) | 子切片坐标偏移芯片重映射 |
ComputeRemoteCoreIndex (0x133E7F80) | 兆核感知目标核心索引 |
GetRemoteMemBase (0x13D88660) | 远程数据库;该驱动程序提供其 remoteCoreId |
DmaGeneralStartOp::create (0x145B1880/0x145B16E0) | 驱动程序发出的 sc_tpu.dma_general_start |
交叉引用
- On-Pod 集体 — 剖面图 — 第 XIII 部分的导航条目; SC 卸载基板、该驱动程序还读取兆核/SC 卸载门字段。
- get_remote_memref — 远程内存引用形成(操作、解析器、基本重新标记);
StartRemoteDma向其提供全局核心 ID 并消耗其基数。EnqueueDMAfeed (getRemoteDeviceAndSparseCoreIds) 是该集合 feed 的同级。 - addrspacecast ISel —
tpu_addrspacecast的 LLVM 后端降低:保值MVT::i32重新标记、合法性矩阵、无折叠/无扁平钩子;为什么off-tile指针不携带核心/芯片位。 - 脂肪指针 (AS7/8/9) — SparseCore 指针表示和保留的 160/128/192 位非整数胖指针空间,off-tile 转换不构造。
- 片内DMA描述符 — 跨芯片启动的片上
dma_general描述符是对等的。 - SC-卸载配置生成器 — SparseCore 卸载集体配置构建器,驱动所有每个目标
StartRemoteDma调用服务。 - AllToAll 表 —
StartRemoteDma之上的集体调度程序消耗的所有到所有/不规则的所有到所有链接表。 - 二进制:
extracted/libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64/libtpu/libtpu.so(构建 ID89edbbe81c5b328a958fe628a9f2207d) - 索引条目: 第 XIII 部分 — On-Pod Collectives & Barriers / SparseCore-offload Collectives — 返回索引