ICI 跨芯片 DMA 描述符
本页中的所有地址均适用于
libtpu-0.0.40-cp314wheel 中的libtpu.so(buildlibtpu_lts_20260413_b_RC00,build-id md589edbbe81c5b328a958fe628a9f2207d)。该镜像未 strip;demangled C++ symbol names 按原文引用。.textVMA 等于文件偏移(.textbase0xe63c000)。其他版本会不同。所有字段位置都通过 objdump 反汇编 + IDA 对各代*DmaDescriptorStatebuilder、jxc::DmaDescriptorregister class,以及各代EncodeRemoteSyncFlagAddress*encoder 的反编译恢复。
摘要
当 TensorCore sequencer 发出一个远端 endpoint 位于另一颗芯片上的 DMA 时,它不会填充 片内 DMA 描述符 中记录的片内 OciDescriptorCommonIssuedFromTcs record。它转而 staging 一个 ICI 线级描述符:由各代 *DmaDescriptorState builder 在 SMEM 中逐个 32-bit word 构造的 word array,然后交给 enqueue instruction,由片上 DMA engine 和 NodeFabric Ingress Unit(NIU)消费,将字节推送穿过 Inter-Chip Interconnect。该描述符携带片内 record 从不具备的三类信息:标识哪颗芯片的远端 chip id(或 X/Y core 坐标)、带 bit 40 memory-space resource tag 的远端 VMEM/HBM 目的地址,以及接收芯片 NIU 在最后一个字节到达时自动递增的远端目的 sync-flag 地址,即跨芯片完成信号。
二进制中恰好有两种物理描述符布局,由 asic_sw::driver::deepsea::DmaCommand 内部的 std::variant 连接:V1(jxc::DmaDescriptor,Jellyfish/Dragonfish)为 8 × 32-bit words = 32 bytes,含一个 stride level 和一个 destination sync flag;V2(DmaDescriptorV2,Pufferfish/Viperfish/Ghostlite)为 ≥96 bytes,原生支持 4-level scatter/gather 和两个 destination sync flags。两者都在 SMEM 中 staging:编译器通过 WriteDescriptorWord 写 word,并通过 UpdateDescriptorWord(index, mask, value) 将每个 DMA 的 runtime fields 合并到静态 control-bit template 上。
本页负责 ICI 跨芯片描述符字段布局、远端地址组合(data address + chip-id endpoint + sync-flag address)、片内与跨芯片差异,以及描述符委托出去的 SerDes 级 framing。它不重新记录:片内描述符字段集(片内 DMA 描述符);trace_id_header DMA-id pairing key(OCI Command DMA-ID);或 routing-engine NodeFabric descriptor(NodeFabric 路由描述符)。重新实现契约为:
- Staging 模型 —
WriteDescriptorWord(index, val)存储到SmemAddrScaled(base@+0x18, index);UpdateDescriptorWord(index, mask, value)将 runtime bits 合并到静态 template default 上。 - V1 word map — word 6 = 以 granules 为单位的 size(低 10 bits,
≤1024byte cap),word 7 = 打包的(dst_sflag<<0xa)|src_sflag(低 12 bits,sflag number≤59),address words 在 bit 0x10/0x13 携带远端 core X/Y,并在 bit 40 携带 resource tag。 - 远端地址组合 — 三个独立编码:data address(
EncodeDmaAddressForGranule,HBM bit-31 marker,resource id<<0x28)、chip endpoint((phys_chip_id & 0xfff) << 0xe | LocalEndpoint),以及 destination sync-flag address(各代EncodeRemoteSyncFlagAddress*)。 - 各代差异 — V1 vs V2 word 数量、12-bit vs 14-bit sflag fields、单一 vs 4-level stride、单一 vs 双 destination sync flag。
| V1 builder (JfDf) | xla::jellyfish::JellyfishDmaDescriptorState ctor @ 0x1d4ca0a0 |
| V2 builder (PF/VF/GL) | xla::pufferfish::PufferfishDmaDescriptorState; CreateForViperfish @ 0x1d5ad860 |
| 基础 staging | DmaDescriptorState::WriteDescriptorWord(long,LloValue*,b) @ 0x1d4c73a0; ReadDescriptorWord @ 0x1d4c72e0 |
| V1 硬件类 | asic_sw::driver::deepsea::jxc::DmaDescriptor — 8 words / 32 B(GetWord(int) @ 0x1d62d760,idx 0..7) |
| V2 硬件类 | asic_fw::deepsea::registers::DmaDescriptorV2 — ≥96 B,4-level stride(set_*_stride @ 0x1febaf20/0x1febb060) |
| 远端 sflag encoders | JfDf @ 0x1d5aa620,Pufferfish @ 0x1d5ae1a0,Viperfish @ 0x1d5af9c0,Ghostlite @ 0x1d5affc0 |
| Data-address encode | LloRegionBuilder::EncodeDmaAddressForGranule @ 0x1d5402c0(HBM bit-31 marker) |
| Endpoint render | xla::jellyfish::MemorySpaceToDriverResource(MemorySpace) @ 0x1d6223e0 |
| 证据等级 | V1 word map + 各代 sflag encoders 达到重新实现级;V2 partial(≥96 B,stride/sflag setter offsets) |
1. 片内 vs 跨芯片:芯片边界处的变化
目的
最常见的重新实现错误是假设只有一种 DMA 描述符格式。这里有两个互不相关的 record 家族,取决于远端 endpoint 是否在同一颗芯片上。已经掌握 片内 DMA 描述符 的读者只需要了解 delta;本节就是该 delta。
两个 record 家族
片内描述符(OciDescriptorCommonIssuedFromTcs)是一个 17-field profiler/wire record,其两个 endpoint 都通过 (mem_id, core_id) pair 解析到本地 tier。它从不命名另一颗芯片。ICI 描述符是由 *DmaDescriptorState 构建并 lower 到硬件 register class(jxc::DmaDescriptor 或 DmaDescriptorV2)的 staged SMEM word array;其目的 endpoint 解析到远端芯片。
| 方面 | 片内(OciDescriptorCommonIssuedFromTcs) | ICI 跨芯片(jxc::DmaDescriptor / V2) |
|---|---|---|
| 命名方式 | (mem_id, core_id) 本地 tier pair | 远端 chip id(12-bit)或 core X/Y |
| 目的地 | 本地 HBM/VMEM/SMEM/… tier | 远端芯片 VMEM/HBM + sflag address |
| 构建位置 | LLO Dma*StartOp 填充 proto fields | *DmaDescriptorState staging SMEM words |
| 完成方式 | 本地 dst_sync_flag_* bump | 接收端 NIU 对已编码 remote sflag 自动递增 |
dma_type 值 | profiler DMA_TYPE_LOCAL=0 | DMA_TYPE_REMOTE_*(unicast/write-unicast/multicast) |
| Stride levels | (rolled/strided body emitters) | V1:1 level(+ unroll);V2:4 levels |
| Sync flags | proto 中的 dst_sync_flag_{0,1} | V1:1 dst(word 7);V2:2 dst(mem-offset setters) |
注意 — 两个家族共享相同的 data-address encoder。
MemorySpaceToDriverResource@0x1d6223e0(resource-id map 详见 片内 DMA 描述符 页面 §3)和EncodeDmaAddressForGranule@0x1d5402c0(resource tag<<0x28,HBM external-address marker0x80000000位于 bit 31)同时服务于片内 endpoint render 和 ICI source/local-dest address word。ICI 描述符额外添加的是 chip-id endpoint 和 远端 sync-flag address,即跨芯片传输独有的两个编码,见 §4。
选择器
builder 是否会写入 remote endpoint 由 DmaDescriptorState::IsRemote() @ 0x1d4c72c0 gate,它读取 *(byte*)(this+0xe)。(src MS, dst MS, remoteness, requested DmaType) tuple 由各 TpuVersion 的 BuildDmaOverrides registry @ 0x1d546780 解析;它返回 control-word override,并选择由哪个各代 encoder 填充描述符。DMA_TYPE_LOCAL 明确不是 ICI 描述符,它是片内情形。
2. Staging 模型:在 SMEM 中构建的 Word Array
目的
不同于片内 proto,编译器并不会把 packed struct 交给 register。它会在 scratch memory(SMEM)中将描述符 staging 为 word array,一次一个 32-bit word,然后发出读取 staged words 的 DMA-enqueue instruction。每个各代 builder 都只是两个基础 primitive 之上的薄层。
两个 primitive
// xla::jellyfish::DmaDescriptorState::WriteDescriptorWord(long index, LloValue* val, b)
// sub_1D4C73A0
function WriteDescriptorWord(index, val, b):
base = *(LloValue**)(this + 0x18) // SMEM base of staged word-array
addr = b.SmemAddrScaled(base, b.SimmU32(index), target.SmemWordSizeBytes())
b.Sst(addr, val) // scalar store of one word
// ReadDescriptorWord(long index, b) sub_1D4C72E0 — Sld from the same SmemAddrScaled(base@+0x18, index)read-modify-write helper 让 invariant control bits(由 hardware-class ctor 设置)能够与每个 DMA 的 runtime fields 共存:
// xla::jellyfish::JellyfishDmaDescriptorState::UpdateDescriptorWord(long index, u32 mask, LloValue* value, b)
// sub_1D4CA880
function UpdateDescriptorWord(index, mask, value, b):
static_word = jxc::DmaDescriptor::GetWord(index) // template default for this word
merged = b.Sor(b.Simm(static_word & mask), value)
WriteDescriptorWord(index, merged) // through vtable+0x60mask 选择静态 template default 的哪些 bits 保留;value 会 OR 到其余部分。jxc::DmaDescriptor ctor @ 0x1d62bc20 将 32 bytes 清零(vmovups [rdi],ymm0),然后通过 BitCopy 在 bit offsets 0x40、0x50、0xa0、0xb0 处写入四个 16-bit default sub-fields(每个 = 1),所以 V1 描述符是一个通过 8-word GetWord API 暴露的 256-bit packed bit-field。
注意 — 每个 field writer 最终都会通过 field-group write virtual(
vtable+0x60,group selector 在esi中)调用WriteDescriptorWord(index, …)。writer 要么通过UpdateDescriptorWord(index, mask, value)更新 sub-field,要么通过 virtual 写入整个 field group;staging-region bound 会被 CHECK(descriptor_state_word_offset < region.word_count())。
3. V1 描述符 Word Map(Jellyfish / Dragonfish) {#3-the-v1-descriptor-word-map-jellyfish--dragonfish}
目的
V1 是唯一一个 word-by-word 布局已完全恢复的描述符。它为 8 words = 32 bytes(GetWord(int) @ 0x1d62d760 bounds-checks (unsigned)idx > 7 → fatal,已在反编译中确认),在 SMEM 中 staging,并合并到 template default 上。
布局
| 字段 | Word / bits | Writer(addr) |
|---|---|---|
| (template control defaults) | bit-fields @ bit 0x40 / 0x50 / 0xa0 / 0xb0 = 1 | jxc::DmaDescriptor ctor @ 0x1d62bc20 |
| Destination address | field-group 0(vtable+0x60,esi=0) | WriteDestinationAddress @ 0x1d4caa20 |
| Remote dest core X/Y | field-group 1,(x<<0x13)|(y<<0x10),保留低 16 | WriteRemoteDestinationCoreLocation @ 0x1d4cae80 |
| Source address | field-group 3(vtable+0x60,esi=3) | WriteSourceAddress @ 0x1d4ca960 |
| Size in granules | word 6,mask 0xfffffc00(低 10 bits) | WriteSize @ 0x1d4ca7c0 |
| Sync flags(src+dst) | word 7,mask 0xfffff000,(dst<<0xa)|src(低 12 bits) | WriteSyncFlags @ 0x1d4cb040 |
| Stride(单 level) | per-level | WriteStrideForLevel @ 0x1d4caae0 |
| Outfeed queue / multicast | JF 上 CHECK-fail(仅 V2) | WriteOutfeedQueueId @ 0x213c6da0 |
WriteSyncFlags 的 IDA 反编译逐字节确认了该 packing:
// JellyfishDmaDescriptorState::WriteSyncFlags(src_sflag, dst_sflag, …, b) sub_1D4CB040
// MS gates first: if this+0xa==1 -> src sflag MS must be kBarnaCoreSflag else kSflag;
// if this+0xf==1 -> dst sflag MS must be kBarnaCoreSflag else kSflag
v11 = SshllU32(dst_sflag, 0xa) // dst << 10
v12 = SorU32(src_sflag, v11) // (dst<<0xa) | src
UpdateDescriptorWord(this, 7, 0xFFFFF000, v12, …) // word 7, low 12 bitsSize 和 sync-flag 边界
WriteSize @ 0x1d4ca7c0 会 CHECK size operand 的 mem-unit 是否等于 target.GranuleMemUnit(),并把它打包到 word 6 的低 10 bits,即通用的 granule_bytes <= 1024 cap(以每 granule unit 一个字节计的 10-bit field;byte count 为 size_in_granules × granule_bytes,granule 取决于 target:Jellyfish 上为 32 B,新一代上为 64 B)。WriteSyncFlags 的 12-bit field 将 remote-DMA sync-flag number 限定为 jxc::MaxSyncFlagNumberForRemoteDma = 59(0x1d62da80)。
陷阱 — size word 保存的是 granules,而不是 bytes。把 byte count 写入 word 6 的重新实现者,会让任何超过 1 KB 的传输溢出 10-bit field。转换由
WriteSize中的GranuleMemUnitCHECK 强制执行;byte count 从不出现在 V1 描述符中。同一个 word-6 low-10-bit cap 也是超过它的 strided remote DMAs 会被展开成多个 flat descriptors(UnrollStridedRemoteDma@0x1d4c7b20,由ShouldUnrollStridedRemoteDma@0x1d4c7ac0gate),而不是在一个 word 中表示的原因。
远端 core location
WriteRemoteDestinationCoreLocation @ 0x1d4cae80 只在 IsRemote() 时发射。它要求 X 和 Y operands 是 U32 register-produced values,组合 (coreX << 0x13) | (coreY << 0x10),然后合并进 destination address word 并保留低 16 bits(AND 0xffff)。这是使用坐标寻址(而非 chip-id)时 V1 命名邻居 core 的方式。
4. 远端地址组合 {#4-remote-address-composition}
目的
跨芯片传输需要三个独立地址,每个都来自不同 encoder。把它们混为一谈是重新实现的核心风险,因此这里分别枚举。
(1) Data address — resource tag + HBM marker
source 和 local-destination data addresses 由 LloRegionBuilder::EncodeDmaAddressForGranule @ 0x1d5402c0 产生。对于 HBM / external-resource operand(mem_space == 1),它会将地址与 0x80000000(bit 31) OR,作为 external-address marker,然后按 granule 缩放。memory-space resource tag 由 builder ctor 放在 bit 40:
SetSourceAddress(MemorySpaceToDriverResource(ms) << 0x28) // resource id at bit 40MemorySpaceToDriverResource @ 0x1d6223e0 是 片内 DMA 描述符 §3 中详述的同一个 17-arm switch;resource ids 不是 MemorySpace enum 的 identity(hbm→2、hib→3、vmem→4、smem→6、sflag→0、imem→5;cmem 是硬 FATAL)。重新实现者必须使用显式表。
(2) Chip endpoint — 谁接收
在 V2 中,destination chip 由 PufferfishDmaDescriptorState::WriteRemoteEndpoints @ 0x1d5abbe0 命名:
// WriteRemoteEndpoints — composes the remote-endpoint word
physChipId = MapLogicalToPhysicalChipId(ChipId)
word = ((physChipId & 0xfff) << 0xe) // 12-bit physical chip id at bit 14
| LocalEndpoint(ms@this+0x130, 16, 18, b) // mem-space + within-chip offset sub-field
| <sub-fields at bit 0x18 (24) and 0x1a (26)>反编译确认了 LocalEndpoint(*(this+304), 16, 18, …) 和一个 SimmU32(0x18, …) sub-field。chip-id delta(dest vs self,SeqS32)由 WriteEndpoints @ 0x1d5ac0a0 计算;它在调用 WriteRemoteEndpoints 前,会通过 Sselect 在两种编码模式(direct vs routed)之间选择。因此邻居的远端 VMEM 地址是 {phys_chip_id (12b), local_endpoint = (mem_space, within-chip word offset)};routing engine 解析路径,描述符只命名目的芯片,而不命名 hops(NodeFabric 路由描述符)。
(3) 远端 sync-flag address — 完成目标
这是跨芯片 DMA 独有且各代变化最大的编码。destination sync flag 由远端芯片上的 VMEM 地址命名,该地址由从 GetRemoteSyncFlagEncoderRegistry 取出的各 TpuVersion encoder 计算。dispatcher LloRegionBuilder::EncodeRemoteSyncFlagAddress @ 0x1d54da40 验证 operand 位于 sflag memory space("remote_sync_flag->memory_space() == MemorySpace::kSflag"),将 logical→physical chip id,并调用已注册 encoder。
(A) Jellyfish / Dragonfish — EncodeRemoteSyncFlagAddressJfDf @ 0x1d5aa620,基于坐标。反编译精确确认了 OR 组合:
addr = sflag_value
| (chipX << 0x14) // bit 20 — X coordinate (SimmU32 0x14, SshllU32)
| (chipY << 0x15) // bit 21 — Y coordinate (SimmU32 0x15, SshllU32)
| 0x40000 // bit 18 — fixed remote marker
| (DefaultSyncFlagSegmentId() << 12) // = 0x40 << 12 — segment id at bits 12..17
| 0x80000 // bit 19 — set-done / atomic-target marker (conditional)
// annotated "remote sync flag address"; DefaultSyncFlagSegmentId() = 0x40 @ 0x1d62da60(B) Pufferfish — pufferfish::dma_utils::EncodeRemoteSyncFlagAddress @ 0x1d5ae1a0,core-relative:mask sflag field & 0xfff(12-bit),左移 << 0x12(bit 18),OR 0x20000(bit 17 remote marker)和 CoreIndex() << 0x10(bit 16),并在最终 OR 之前对 core value 应用 Sshrl(…,2) segment fold(右移 2)。
(C) Viperfish — viperfish::dma_utils::EncodeRemoteSyncFlagAddress @ 0x1d5af9c0,形状与 Pufferfish 相同,但 sflag field 更宽,为 14-bit。反编译确认 sflag & 0x3fff(SimmU32 0x3FFF,SandU32)<< 0x11(bit 17)| 0x20000(bit 17 marker),保留低 2 bits(& 3)并使用 CoreIndex << 0x10。Ghostlite 复用该 V2 路径;ghostlite::…EncodeRemoteSyncFlagAddressGhostlite @ 0x1d5b01e0 是一个 11-byte delegator。
| Gen | sflag field width | sflag shift | remote marker | core encoding |
|---|---|---|---|---|
| Jellyfish / Dragonfish | (coordinate) | X<<0x14,Y<<0x15 | 0x40000(b18)+ 0x80000(b19) | core X/Y coordinate |
| Pufferfish | 12-bit | << 0x12(b18) | 0x20000(b17) | CoreIndex() << 0x10 |
| Viperfish | 14-bit(0x3fff) | << 0x11(b17) | 0x20000(b17) | CoreIndex() << 0x10 |
| Ghostlite / 6acc60406 | 14-bit | (delegates to Viperfish path) | 0x20000 | CoreIndex |
陷阱 — 远端 sync-flag address 不是 destination data address,也不是 chip-id endpoint。它是一个单独编码的 VMEM 地址,接收方 NIU 会 dereference 它来找到要 bump 的 flag。Jellyfish encoder 基于坐标(X/Y 位于 bits 20/21);V2 encoders 基于
CoreIndex,芯片已由WriteRemoteEndpoints解析。把 data-address encoder 复用于 sflag 的重新实现者会生成看起来有效但错误的完成目标,传输会落地,但 wait 永远不会释放。
5. SerDes 级 Framing
目的
描述符命名目的芯片;它不携带 per-hop path 或任何 link-level framing。描述符之下的一切,包括 flit framing、virtual-channel arbitration、credit flow control、per-link routing,都委托给 NodeFabric / NIU 硬件和链路 bring-up 时安装的 routing table。
描述符委托的内容
- Routing / path。 描述符只命名目的芯片(chip-id endpoint,§4.2,或 core X/Y,§3)。片上 routing engine 会通过 bring-up 时安装的 per-link routing table 解析 1..N hops(ICI 链路启动,拓扑发现);fast path 会盖入预计算 routing-table index,slow path 通过
net_router发射 per-hop descriptors。穿过 routing engine 的 NodeFabric-side descriptor 是 NodeFabric 路由描述符。 - Credit / flow control — 描述符中没有。 没有 credit count、window 或 back-pressure field。per-flit credit handling 完全存在于 NIU credit FSM 和片上 switch arbiter 中;编译器根据 per-core VMEM 预算 chunk size,而不是根据 link credit。Host visibility 仅通过 per-link telemetry counter set 提供。
- Ordering。 strict-ordering bit 是 template 中的 per-DMA control default;各代
SupportsRemoteDmaRelaxedOrderingcapability(JellyfishTarget@0x1d491360,ViperfishTarget@0x1d49bc40,GhostliteTarget@0x1d4988a0)gate 是否允许 relaxed ordering(GhostliteTarget::RelaxedOrderingDmaOnly = false@0x1d4988e0)。
线上的完成握手
跨芯片完成是描述符与接收芯片的一项线级交互。两个互补机制如下:
- Piggyback completion。 每个
DMA_TYPE_REMOTE_WRITE_UNICAST携带一个 destination sync-flag address(§4.3 的各代编码)。当最后一个字节落入远端 VMEM 时,接收方 NIU 会自动递增该 sflag,即atomic_remote_write_set_done/atomic_remote_add_set_done硬件路径(_inverted变体支持 poll-on-zero)。V2 描述符通过set_dst_sync_flag_mem_offset(idx 0..1, u32 ≤0x80000)@0x1febae20支持两个 destination sync flags,即 dual-channel completion。 - Explicit set-done。
net_util::BumpRemoteSyncFlag@0x1c696de0发出 zero-payload remote write(HBM-immediate-null source),唯一效果是 bump remote sflag,用于 barrier release 和 async send-completion ordering。
注意 — 描述符中的 sync-flag number(V1 word 7)和 sync-flag address(§4.3)不同。Word 7 打包本地 src + dst sflag numbers
(dst<<0xa)|src;各代 encoder 生成接收方 NIU 自动递增的远端 VMEM address。PufferfishWriteSyncFlags@0x1d5acb80还会将0x2000(bit 13)valid marker OR 进每个 sflag value,并通过 field-group 1 写 src、通过 field-group 2 写 dst(检查this+0x131==2以支持第二个 dst sflag)。
6. 各代摘要
描述符家族分为 V1(一个硬件类)和 V2(一个硬件类,三代),由 DmaCommand variant 统一。
| Gen / family | HW class | Words / size | Sflag field | Remote-addr encoder | Stride | Dual dst sflag |
|---|---|---|---|---|---|---|
| Jellyfish / Dragonfish | jxc::DmaDescriptor(V1) | 8 × 32-bit = 32 B | word 7 low 12 bits(≤59) | JfDf @ 0x1d5aa620(coord) | 1 level(+ unroll) | no |
| Pufferfish | DmaDescriptorV2 | ≥96 B(~24 words) | 12-bit,valid bit 13 | dma_utils @ 0x1d5ae1a0(CoreIndex) | 4 levels | yes |
| Viperfish | DmaDescriptorV2 | ≥96 B | 14-bit sflag | dma_utils @ 0x1d5af9c0 | 4 levels | yes |
| Ghostlite / 6acc60406 | DmaDescriptorV2 | ≥96 B(header/fields slot split) | 14-bit | Ghostlite @ 0x1d5b01e0(delegator) | 4 levels | yes |
两个硬件类通过 asic_sw::driver::deepsea::DmaCommand 内部的 std::variant<std::monostate, DmaDescriptor, DmaDescriptorV2> 连接(3-arm __variant_detail::__dispatcher<0|1|2>)。DmaDescriptorV2 的 4-level scatter/gather 是 set_src_stride(level 0..3, u32) @ 0x1febaf20 / set_dst_stride @ 0x1febb060 / set_steps_per_stride @ 0x1febb1a0;每个 level index 都会针对 3 做 range-check,每个 stride 都以 << 6(granule-shifted)存储。Pufferfish 通过 CreateForViperfish @ 0x1d5ad860 复用于 Viperfish,差异仅在从 version-keyed registries 拉取的各代 encoders。
陷阱(V2 PARTIAL)— 精确的 V2 byte size 是
≥96 B,根据set_dst_stride触及 offsets+0x30/+0x40/+0x48/+0x58,以及kDefaultDescriptorstatic 在+0x08/+0x28处的2× vmovaps ymm0initializers 推断。精确的 word-by-word V2 field map(chip-id word index、4 stride-level word group、2 dst-sflag words、multicast/outfeed word)尚未完全恢复;只有 V1 的 8-word map 已字节完整。面向 V2 的重新实现者拥有 setters 的 byte offsets 和结构形状,但必须重新解码剩余 inlinedDmaDescriptorV2BitCopy setters 才能得到完整布局。
7. DMA_TYPE 传输类代码
描述符的 transfer class 由 BuildDmaOverrides(srcMS, dstMS, isRemote, DmaType, …) @ 0x1d546780 选择,这是一个按 TpuVersion 分发的 registry。恢复出的 .rodata 名称如下:
DMA_TYPE string | 含义 | ICI? |
|---|---|---|
DMA_TYPE_LOCAL | 片内(VMEM↔VMEM/HBM) | no — 见 片内 DMA 描述符 |
DMA_TYPE_LOCAL_OR_HOST | 本地或 chip↔host | no |
DMA_TYPE_CHIP_TO_HOST | chip → host DRAM(infeed/outfeed) | no — host path |
DMA_TYPE_REMOTE_UNICAST | 跨芯片 point-to-point | yes |
DMA_TYPE_REMOTE_WRITE_UNICAST | 跨芯片 write(AR reduce-scatter / all-gather) | yes |
DMA_TYPE_REMOTE_MULTICAST | 跨芯片 fan-out 到 multicast group | yes |
怪癖 — runtime/LLO
xla::jellyfish::DmaTypeenum(3 个值,从DMA_TYPE_CHIP_TO_HOST=0开始)和 profiler descriptorDmaTypeValuesenum(DMA_TYPE_LOCAL=0,…)是两个互不相关的枚举,见 片内 DMA 描述符 §6。对于本页负责的 ICI 描述符,相关 runtime type 是DMA_TYPE_REMOTE_WRITE_UNICAST:all-reduce 总是对每个 shard 发射一个(reduction 本身是本地 VPU 操作,从不在线上发生)。随后描述符自己的 profilerdma_typefield 读回为DMA_TYPE_REMOTEUNICAST。
交叉引用
- 片内 DMA 描述符 — 本地 counterpart:
OciDescriptorCommonIssuedFromTcs、(mem_id, core_id)tier resolution、MemorySpaceToDriverResource,以及与本页共享的两个DmaTypeenums - OCI Command DMA-ID — 每个描述符携带的
trace_id_headerDMA-id pairing key(begin/end trace pairing) - NodeFabric 路由描述符 — 解析 ICI 描述符所命名 destination-chip path 的片上 routing-engine descriptor