全局芯片 / 核心寻址
舰队元数据中不会传输“全局芯片 id”。芯片或核心在整个舰队范围内的命名方式,是将 slice 索引与 slice 内逻辑设备 id 组合起来。扁平的全局标识符只存在于编译器/ISA 层,并由该组合计算得出。
转换链
text
flat fleet device_id
│ MultiSliceTopologyAndLocation::ToSliceAndLogicalDeviceId(
│ device_id, TpuCoreType)
▼
(slice_id, logical_device_id)
│ MultiSliceTpuCoreLocation::Create(MSTL&, device_id, TpuCoreType)
▼
MultiSliceTpuCoreLocation ──► TpuCoreLocationProto{core_type, logical_device_id}
+ owning slice
│ (compiler / ISA layer)
│ LloRegionBuilder::ToGlobalCoreId / FromGlobalCoreId
▼
flat global_core_id / global_chip_id (used inside emitted LLO / ISA)
```text
## 访问器
`MultiSliceTopologyAndLocation` 类暴露了这些寻址方法(全部解析为已链接的 C++ 符号):
| 方法 | 方向 | 用途 |
|--------|-----------|---------|
| `ToSliceAndLogicalDeviceId(int device_id, tpu::TpuCoreType)` | flat → (slice, device) | 将舰队设备 id 拆分为其 slice 和 slice 本地设备 |
| `GetSliceLocalDeviceId(int)` | flat → device | 舰队设备的 slice 本地 id |
| `NumHosts()` | — | 所有 slice 的主机总数 |
| `NumSlices()` | — | slice 数量 |
每个核心的舰队句柄是 `MultiSliceTpuCoreLocation` 类,通过以下方式创建:
```c
MultiSliceTpuCoreLocation::Create(
const MultiSliceTopologyAndLocation& mstl,
int device_id,
tpu::TpuCoreType core_type)它将设备所属的 slice 与 TpuCoreLocationProto 关联起来:
protobuf
message TpuCoreLocationProto { // xla.megascale.runtime
tpu.TpuCoreTypeProto core_type = 1; // TENSOR / BARNA / SPARSE
int32 logical_device_id = 2; // device id within its slice
}
enum tpu.TpuCoreTypeProto {
TPU_CORE_TYPE_INVALID=0; TPU_CORE_TYPE_TENSOR_CORE=1;
TPU_CORE_TYPE_BARNA_CORE=2; TPU_CORE_TYPE_SPARSE_CORE=3;
}
```text
因此,舰队范围内的核心地址就是三元组 `(slice_id, logical_device_id, core_type)`。
## 设备分配解析
XLA 的 `DeviceAssignment`(replica × computation → device)通过以下方式映射到舰队的 (slice, device) 空间:
- `GetMultiSliceDeviceAssignment(const MultiSliceTopologyAndLocation&,
DeviceAssignmentProto, optional<int>)` — 舰队范围的分配,
- `GetLocalDeviceAssignmentForSlice(const MultiSliceTopologyAndLocation&,
DeviceAssignment[, int])` — 分配中 slice 本地的部分,
- `GetDeviceIdFromDeviceAssignment(const DeviceAssignment&, long, long)` —
给定 (replica, computation) 索引处的单个设备 id。
这些方法将 XLA 层的抽象设备索引绑定到具体的舰队位置。
## 扁平的 global_core_id
*扁平的* `global_core_id` / `global_chip_id` 确实存在,但只存在于编译器和发出的 ISA 内部,绝不会出现在 bootstrap 线路上。它由 LLO emitter 根据 (slice, device) 对生成:
- `LloRegionBuilder::GlobalCoreId()` / `ToGlobalCoreId(...)` /
`FromGlobalCoreId(...)`,
- `xla::tpu::sparse_core::FromGlobalCoreId(...)`,
- `xla::tpu::sparse_core::collective::OffloadFactory::GlobalCoreIdToPhysicalChipId(...)`,
- `xla::tpu::sparse_core::collective::OffloadFactory::SubsliceToFullSliceGlobalCoreId(...)`.
这是内核自身用于路由 SparseCore collectives 和 host send/recv 的寻址方式;它会根据舰队元数据在本地重新计算,因此无需传输。
## 为什么不存储全局 id
将全局 id 保持为*计算结果*而不是*字段*,在 schema 中可以看到两个好处:
1. 舰队元数据保持小巧且与顺序无关,线路上传输的只有 slice 索引和主机对。
2. 扁平化规则可以因芯片世代而异(SparseCore vs TensorCore,sub-slice vs full-slice),而无需改变线路 schema;`core_type` 参数会在转换点选择规则。
## 交叉引用
- [舰队元数据 Schema — 概览](overview.md) — 集群枢纽:舰队 → slice → 主机 → 芯片 → 核心层级中每一层由哪个页面负责。
- [舰队拓扑模型](topology-model.md) — 这条转换链索引到的舰队 → slice → 主机 → 芯片 → 核心层级。
- [ICI vs DCN 表示](ici-vs-dcn.md) — (slice, device, core) 三元组连接的两个坐标系统。