Skip to content

ICI 跨芯片 DMA 描述符

本页中的所有地址均适用于 libtpu-0.0.40-cp314 wheel 中的 libtpu.so(build libtpu_lts_20260413_b_RC00,build-id md5 89edbbe81c5b328a958fe628a9f2207d)。该镜像 strip;demangled C++ symbol names 按原文引用。.text VMA 等于文件偏移(.text base 0xe63c000)。其他版本会不同。所有字段位置都通过 objdump 反汇编 + IDA 对各代 *DmaDescriptorState builder、jxc::DmaDescriptor register 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 连接:V1jxc::DmaDescriptor,Jellyfish/Dragonfish)为 8 × 32-bit words = 32 bytes,含一个 stride level 和一个 destination sync flag;V2DmaDescriptorV2,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,≤1024 byte 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
基础 stagingDmaDescriptorState::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 encodersJfDf @ 0x1d5aa620,Pufferfish @ 0x1d5ae1a0,Viperfish @ 0x1d5af9c0,Ghostlite @ 0x1d5affc0
Data-address encodeLloRegionBuilder::EncodeDmaAddressForGranule @ 0x1d5402c0(HBM bit-31 marker)
Endpoint renderxla::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::DmaDescriptorDmaDescriptorV2)的 staged SMEM word array;其目的 endpoint 解析到远端芯片

方面片内(OciDescriptorCommonIssuedFromTcsICI 跨芯片(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_typeprofiler DMA_TYPE_LOCAL=0DMA_TYPE_REMOTE_*(unicast/write-unicast/multicast)
Stride levels(rolled/strided body emitters)V1:1 level(+ unroll);V2:4 levels
Sync flagsproto 中的 dst_sync_flag_{0,1}V1:1 dst(word 7);V2:2 dst(mem-offset setters)

注意 — 两个家族共享相同的 data-address encoderMemorySpaceToDriverResource @ 0x1d6223e0(resource-id map 详见 片内 DMA 描述符 页面 §3)和 EncodeDmaAddressForGranule @ 0x1d5402c0(resource tag <<0x28,HBM external-address marker 0x80000000 位于 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 由各 TpuVersionBuildDmaOverrides 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

c
// 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 共存:

c
// 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+0x60

mask 选择静态 template default 的哪些 bits 保留;value 会 OR 到其余部分。jxc::DmaDescriptor ctor @ 0x1d62bc20 将 32 bytes 清零(vmovups [rdi],ymm0),然后通过 BitCopybit 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 / bitsWriter(addr)
(template control defaults)bit-fields @ bit 0x40 / 0x50 / 0xa0 / 0xb0 = 1jxc::DmaDescriptor ctor @ 0x1d62bc20
Destination addressfield-group 0(vtable+0x60esi=0WriteDestinationAddress @ 0x1d4caa20
Remote dest core X/Yfield-group 1,(x<<0x13)|(y<<0x10),保留低 16WriteRemoteDestinationCoreLocation @ 0x1d4cae80
Source addressfield-group 3(vtable+0x60esi=3WriteSourceAddress @ 0x1d4ca960
Size in granulesword 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-levelWriteStrideForLevel @ 0x1d4caae0
Outfeed queue / multicastJF 上 CHECK-fail(仅 V2)WriteOutfeedQueueId @ 0x213c6da0

WriteSyncFlags 的 IDA 反编译逐字节确认了该 packing:

c
// 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 bits

Size 和 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 = 590x1d62da80)。

陷阱 — size word 保存的是 granules,而不是 bytes。把 byte count 写入 word 6 的重新实现者,会让任何超过 1 KB 的传输溢出 10-bit field。转换由 WriteSize 中的 GranuleMemUnit CHECK 强制执行;byte count 从不出现在 V1 描述符中。同一个 word-6 low-10-bit cap 也是超过它的 strided remote DMAs 会被展开成多个 flat descriptors(UnrollStridedRemoteDma @ 0x1d4c7b20,由 ShouldUnrollStridedRemoteDma @ 0x1d4c7ac0 gate),而不是在一个 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

c
SetSourceAddress(MemorySpaceToDriverResource(ms) << 0x28)   // resource id at bit 40

MemorySpaceToDriverResource @ 0x1d6223e0片内 DMA 描述符 §3 中详述的同一个 17-arm switch;resource ids 不是 MemorySpace enum 的 identity(hbm→2hib→3vmem→4smem→6sflag→0imem→5cmem 是硬 FATAL)。重新实现者必须使用显式表。

(2) Chip endpoint — 谁接收

在 V2 中,destination chipPufferfishDmaDescriptorState::WriteRemoteEndpoints @ 0x1d5abbe0 命名:

c
// 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 / DragonfishEncodeRemoteSyncFlagAddressJfDf @ 0x1d5aa620,基于坐标。反编译精确确认了 OR 组合:

c
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) Pufferfishpufferfish::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) Viperfishviperfish::dma_utils::EncodeRemoteSyncFlagAddress @ 0x1d5af9c0,形状与 Pufferfish 相同,但 sflag field 更宽,为 14-bit。反编译确认 sflag & 0x3fffSimmU32 0x3FFFSandU32<< 0x11(bit 17)| 0x20000(bit 17 marker),保留低 2 bits(& 3)并使用 CoreIndex << 0x10。Ghostlite 复用该 V2 路径;ghostlite::…EncodeRemoteSyncFlagAddressGhostlite @ 0x1d5b01e0 是一个 11-byte delegator。

Gensflag field widthsflag shiftremote markercore encoding
Jellyfish / Dragonfish(coordinate)X<<0x14,Y<<0x150x40000(b18)+ 0x80000(b19)core X/Y coordinate
Pufferfish12-bit<< 0x12(b18)0x20000(b17)CoreIndex() << 0x10
Viperfish14-bit0x3fff<< 0x11(b17)0x20000(b17)CoreIndex() << 0x10
Ghostlite / 6acc6040614-bit(delegates to Viperfish path)0x20000CoreIndex

陷阱 — 远端 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;各代 SupportsRemoteDmaRelaxedOrdering capability(JellyfishTarget @ 0x1d491360ViperfishTarget @ 0x1d49bc40GhostliteTarget @ 0x1d4988a0)gate 是否允许 relaxed ordering(GhostliteTarget::RelaxedOrderingDmaOnly = false @ 0x1d4988e0)。

线上的完成握手

跨芯片完成是描述符与接收芯片的一项线级交互。两个互补机制如下:

  1. 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。
  2. 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。Pufferfish WriteSyncFlags @ 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 / familyHW classWords / sizeSflag fieldRemote-addr encoderStrideDual dst sflag
Jellyfish / Dragonfishjxc::DmaDescriptor(V1)8 × 32-bit = 32 Bword 7 low 12 bits(≤59JfDf @ 0x1d5aa620(coord)1 level(+ unroll)no
PufferfishDmaDescriptorV2≥96 B(~24 words)12-bit,valid bit 13dma_utils @ 0x1d5ae1a0CoreIndex4 levelsyes
ViperfishDmaDescriptorV2≥96 B14-bit sflagdma_utils @ 0x1d5af9c04 levelsyes
Ghostlite / 6acc60406DmaDescriptorV2≥96 B(header/fields slot split)14-bitGhostlite @ 0x1d5b01e0(delegator)4 levelsyes

两个硬件类通过 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,以及 kDefaultDescriptor static 在 +0x08/+0x28 处的 2× vmovaps ymm0 initializers 推断。精确的 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 和结构形状,但必须重新解码剩余 inlined DmaDescriptorV2 BitCopy 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↔hostno
DMA_TYPE_CHIP_TO_HOSTchip → host DRAM(infeed/outfeed)no — host path
DMA_TYPE_REMOTE_UNICAST跨芯片 point-to-pointyes
DMA_TYPE_REMOTE_WRITE_UNICAST跨芯片 write(AR reduce-scatter / all-gather)yes
DMA_TYPE_REMOTE_MULTICAST跨芯片 fan-out 到 multicast groupyes

怪癖 — runtime/LLO xla::jellyfish::DmaType enum(3 个值,从 DMA_TYPE_CHIP_TO_HOST=0 开始)和 profiler descriptor DmaTypeValues enum(DMA_TYPE_LOCAL=0,…)是两个互不相关的枚举,见 片内 DMA 描述符 §6。对于本页负责的 ICI 描述符,相关 runtime type 是 DMA_TYPE_REMOTE_WRITE_UNICAST:all-reduce 总是对每个 shard 发射一个(reduction 本身是本地 VPU 操作,从不在线上发生)。随后描述符自己的 profiler dma_type field 读回为 DMA_TYPE_REMOTEUNICAST


交叉引用

  • 片内 DMA 描述符本地 counterpart:OciDescriptorCommonIssuedFromTcs(mem_id, core_id) tier resolution、MemorySpaceToDriverResource,以及与本页共享的两个 DmaType enums
  • OCI Command DMA-ID — 每个描述符携带的 trace_id_header DMA-id pairing key(begin/end trace pairing)
  • NodeFabric 路由描述符 — 解析 ICI 描述符所命名 destination-chip path 的片上 routing-engine descriptor