芯片间互连 — 章节地图
地址适用于
libtpu-0.0.40-cp314wheel 中的libtpu.so。其他版本会有差异。二进制文件:extracted/libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64/libtpu/libtpu.so(build-id89edbbe81c5b328a958fe628a9f2207d;.textVMA == 文件偏移)。下面所有符号都存在于完整符号二进制中;demangle 后的名称和地址已与 IDA 反编译结果交叉核对。
摘要
本页是 ICI(Inter-Chip Interconnect,芯片间互连)子系统的地图:它是把 TPU 芯片连接成 pod-slice 内部 3-D 环面结构的物理互连,以及负责启动、发现其形状并在其上传输字节的主机/固件机制。ICI 位于 collective 栈的下一层:collective 决定“这个 core 与那些 core 做 reduce”,routing 决定“走哪条 link”,ICI 则负责承载 flit。每个芯片暴露 四个物理 SerDes 端口(LINK0..LINK3,由 MGT_USER_ICI_LINK[0-3]_STALLS_* MMIO 计数器集合确认);这四个端口通过每芯片路由表映射到最多 六个逻辑环面方向(kIciXPlus, kIciXMinus, kIciYPlus, kIciYMinus, kIciZPlus, kIciZMinus)。2-D slice 使用四个方向(X±、Y±);3-D 部件使用全部六个方向。
该子系统有一个两级控制平面,重新实现时必须把它们区分清楚。slice 级控制器 accel_ssw::deepsea::slice_builder::Master(每个 pod-slice 一个)拥有全局顺序:发现、分配 ID、安装路由表、安装 GTC、在每个芯片上启用 ICI、等待 data-link-up、广播 slice 信息、设置坐标。它通过一系列 ExecuteOnAllWorkers gRPC fan-out 来驱动这些阶段。其下方,芯片本地驱动状态机 asic_sw::driver::deepsea::ici::SliceConfiguration(每个被拥有的芯片一个)执行每个 worker 的命令,并通过 IciControl/Ici 与硬件通信。Cloud 部署会在两者之间插入 tpunetd daemon;消息形状和阶段顺序相同,只有传输方式不同。
本页记录三件事:(1) ICI link 模型:四个 SerDes 端口、六个逻辑方向,以及 PHY 和 data-link bring-up 的固件/主机分工;(2) bring-up → discovery → transfer 流程:16 步 Master::InitSlice 序列、七步拓扑发现图推断,以及 ICI DMA descriptor 和 all-reduce primitive 的接入位置;(3) 每代 link 数量和资源模型速览。每个主题,即 link bring-up、topology discovery、DMA descriptor、all-reduce primitive、failure recovery 和 VC balance,都有自己的同级 ici 页面;collectives、routing、twist 和 megascale 是同级章节。本页链接它们,不重复其字节级推导。
重新实现时,ICI 子系统的契约是:
- link 模型:每芯片 4 个 SerDes 端口,≤6 个逻辑环面方向,PHY training 由固件拥有(主机只设置
enable_ici_serdes_training并轮询每端口port_ready_state),data-link layer 由主机/驱动拥有(IciControl::WaitForLinksUp轮询循环)。 - bring-up 状态机:
Master::InitSlice@0x1fbbaac0运行 16 个有序步骤,其中约 11 个是面向SliceBuilderWorkerService的ExecuteOnAllWorkersgRPC fan-out;其余步骤是本地(加锁)或顺序执行。 - discovery 模型:拓扑是基于固件提供的每端口连通性的纯图推断,没有 discovery 时的主动探测;polarity 从 square seed(2-D)或 cable ID(3-D)分配,然后从芯片 (0,0,0) 通过 BFS 传播笛卡尔坐标。
- transfer 模型:all-reduce 是 colored-ring reduce-scatter + all-gather;reduction op 永远不在链路上传输(每个 link DMA 都只是普通的
DMA_TYPE_REMOTE_WRITE_UNICAST,并携带一次 remote sync-flag bump),reduction 在 TensorCore VPU 上本地执行。
| Slice controller | Master::InitSlice @0x1fbbaac0(accel_ssw::deepsea::slice_builder) |
| 芯片本地驱动 | ici::SliceConfiguration(现代)/ jxc::SliceConfiguration(Jellyfish legacy) |
| 每芯片物理端口数 | 4 个 SerDes(LINK0..LINK3)— 由 MGT stall-counter 集合确认 |
| 逻辑方向 | ≤6(kIciX/Y/Z {Plus,Minus});2-D slice = 4,3-D part = 6 |
| 拓扑发现 | Master::DiscoverTopology @0x1fbbe4e0 → TopologyDiscoverer::Discover @0x1fbff7e0 |
| DL-up 轮询循环 | IciControl::WaitForLinksUp @0xe7b1060(固定 1 ms sleep quantum,mov $0x3D0900,%eax @0xe7b11c2;没有第二档/更长档) |
| All-reduce emitter | AllReduceEmitter::EmitAllReduce @0x13742200;strategy picker BaseStrategyND::SelectNDStrategy @0x137c78e0 |
| 路由模型 | 静态、每芯片、在 3-D(twisted)torus 上按维度顺序路由;无运行时 reroute |
1. ICI link 模型
硬件单元是每芯片一个 4-port SerDes。每个端口运行一条 NRZ/PAM-4 link(Jellyfish JFC/DFC 及更新代为 PAM-4;较旧的 Pufferfish 为 NRZ),并连接到一个相邻芯片,可能是 host 内部(同 tray)或 tray 间(更长的铜缆/光链路,标记为 is_high_latency)。这四个端口承载环面:芯片的 (direction → port) 分配在 bring-up 时建立一次,之后不再移动。
1.1 四个端口,六个方向
4 个物理端口映射到最多 6 个逻辑环面方向。6 方向 Direction enum 是 Orientation(轴:X=1, Y=2, Z=3)和 Polarity(POSITIVE=1, NEGATIVE=2)的组合:
Direction = Orientation × Polarity
kIciXPlus = (X, POSITIVE) coordinate offset (+1, 0, 0)
kIciXMinus = (X, NEGATIVE) (-1, 0, 0)
kIciYPlus = (Y, POSITIVE) ( 0,+1, 0)
kIciYMinus = (Y, NEGATIVE) ( 0,-1, 0)
kIciZPlus = (Z, POSITIVE) ( 0, 0,+1)
kIciZMinus = (Z, NEGATIVE) ( 0, 0,-1)
```text
2-D slice 填充其中四个方向(X±、Y±);3-D part 填充全部六个方向。某个端口是否承载 `Z` 完全取决于实际装配的线缆,固件通过每端口的 `ChipConnectorInfo` register set 暴露该信息。`Direction::Opposite` 把每个值映射到符号相反的对应值(X+ ↔ X- 等),这是 discovery 期间每条双向 link 都会检查的不变量(§3)。每方向坐标偏移**不是**硬编码在 discoverer 中;它通过 `ToroidalTopologyInterface::GetCoordinateOffset` 查询 topology 对象,因此 twisted torus 可以在 wrap 边界注入非零的跨轴 delta(见 [Twisted Torus](../twist/overview.md))。
> **QUIRK —** 6 方向 `Direction` enum 是逻辑模型;硬件只有 4 个端口。假设每芯片有 6 个端口的重新实现是错误的:路由表负责把 4 个物理端口展开到 ≤6 个逻辑方向,而 4-port 部件上的 3-D torus 是通过端口聚合实现的,不是六根离散 cable。
### 1.2 固件/主机分工
ICI bring-up 由两个 owner 分担,边界很重要:
- **PHY layer(固件拥有)。** SerDes calibration、adaptive equalization、lane lock、64b/66b alignment 都运行在芯片的 embedded core 上。主机对 analog PHY **没有软件 hook**。它只通过 `ConfigureIci`/`EnableIciPorts`(`jfc::Ici::EnableIciPorts` @`0xe7accc0`,`dfc::Ici::EnableIciPorts` @`0xe76e980`)写入 `enable_ici_serdes_training`(以及 `ignore_external_ici_ports` 和 `disabled_serdes_index` mask),然后通过单个每端口 3-bit `cm_scratch_user_firmware::link_stack_ready_state::port_ready_state` 字段观察进度。
- **Data-link layer(主机/驱动拥有)。** 一旦固件报告每端口 ready code,驱动就驱动 DL 状态机(`IciControl`、`Ici::ChangeStateLocked`),slice 级 `Master` 负责排序。固件的 8 值 `port_ready_state` 通过 `0xe7b6400` 处的 8-entry table 映射到 7 值软件 `LinkStackReadyState` enum(反编译中确认:`WaitForLinksUp` 主体调用 `proto2::internal::NameOfDenseEnum<&LinkStackReadyState_descriptor, 0, 7>`)。
完整的 PHY-training 细节、7 值 enum 和每端口 DL-state array 在 **[Link Bring-Up](link-bringup.md)** 中。
> **GOTCHA —** 字符串 `"ICI Probe failed. local port: %d name: %s took %d us..."` **不是** discovery-time probe。它是 `LinkChecker` 路径发出的 *post-bring-up* health-check probe(该路径也会发出 `"LinkChecker reports a physical ICI down at %s port %d."`)。Discovery 本身不发送主动 probe,见 §3。
---
## 2. bring-up → discovery → transfer 流程
ICI 从冷 link 到可承载 collective traffic 经过三个动作:bring-up(固件 PHY + 主机 DL)、discovery(对 torus 形状和路由做图推断)以及 transfer(由 collective emitter 驱动 DMA descriptor)。下面的流程是整个章节的主干。
```text
┌─────────────────────── SLICE CONTROLLER (Master::InitSlice @0x1fbbaac0) ───────────────────────┐
[bring-up] │ 1 GetLocalTopology (fanout) per-worker links over gRPC │
│ 2 DiscoverTopology (local) fold locals → global toroidal ── §3 │
│ 3 SetGlobalChipId (fanout) Cartesian-ordered chip-id map │
│ 4 Generate routing tables (local) RoutingTableGeneratorFactory ── ../routing │
│ 5 DetectRoutingTableDeadlock (gated) channel-dependency cycle check (if this+0x90) │
│ 6 SetRoutingTable (fanout) install per-link ICR tables │
│ 7 Generate GTC tree (local) global-time-counter root/leaf │
│ 8 SetGtcConfiguration (fanout) │
│ 9 ControlIciErrorReport (fanout) mask bring-up errors │
│ 10 EnableIciDataLink (fanout) PHY + DL training kick-off │
│ 11 WaitForDataLinkUp (sequential) per-chip DL-up poll ── IciControl::WaitForLinksUp │
│ 12 ClearGlobalGtc / 13 WaitForGtcReset (sequential) GTC resync │
│ 14 SetChipCoordinates (fanout) push (X,Y,Z) per chip │
│ 15 BroadcastSliceInformation / 16 DisableIciInterrupts (sequential) │
└──────────────────────────────────────────────────────────────────────────────────────────────┘
│
[discovery] Master::DiscoverTopology @0x1fbbe4e0 → TopologyDiscoverer::Discover @0x1fbff7e0 (7-step graph inference)
polarity (square seed / cable IDs) → BFS coordinates from (0,0,0) → reverse-counterpart validation
→ ResilientToroidalTopology installed on Master+152
│
[transfer] HLO collective op → collective strategy (../collectives) → route table/schedule (../routing)
→ ICI DMA descriptor (per-family DmaDescriptorState) → 4-SerDes-port flits → remote sync-flag bump步骤 1–16 是从 Master::InitSlice 重建出的 bring-up 序列(反编译显示 11 个 ExecuteOnAllWorkers fan-out site,以及 DiscoverTopology、SetGlobalChipId、SetRoutingTable、SetGtcConfiguration、ControlIciErrorReport、EnableIciDataLink 和 DetectRoutingTableDeadlock 子调用)。完整的每阶段 RPC 表、deadline 和退出条件在 Link Bring-Up 中。Routing-table generation(步骤 4)和 installation(步骤 6)归 Routing 章节所有。
NOTE — discovery(步骤 2)在 slice 级路径上发生于 data-link 启用之前(步骤 10),因为 phase 1 已经在每个芯片自身 PHY/DL-up 时收集了该芯片的固件解析 neighbor info。Phase 1 就是“probe exchange”:固件每端口的“另一端是谁”字段被装入
LocalTopologyproto 发送给 Master,它就是 probe response。slice-discovery 时没有单独的主动 probe。
2.1 每个 ici 页面接入的位置
| Stage | Owner page | Section |
|---|---|---|
固件 PHY + 主机 DL bring-up,16 步 InitSlice 序列 | Link Bring-Up | 本章节 |
Polarity + coordinate inference,LocalTopology wire format | Topology Discovery | 本章节 |
| 每 family DMA descriptor word layout,remote sync-flag encoding | DMA Descriptor | 本章节 |
| Colored-ring reduce-scatter + all-gather,strategy families | All-Reduce Primitive | 本章节 |
SliceFailureType,LinksDownReset,FailDevice cascade | Failure Recovery | 本章节 |
IciResource → ResourceVector slot mapping,VC merge | VC Balance / Allocation | 本章节 |
| Replica groups → per-color ring schedule | Collectives | 同级 |
(src,dst) → link path,route table vs net_router schedule | Routing | 同级 |
| Twisted-torus geometry,coordinate-offset twist | Twisted Torus | 同级 |
| Cross-slice topology stitching | Megascale | 同级 |
3. Topology discovery — 图推断,而不是 probing
一旦每个端口上的 data-link 都 up,Master::DiscoverTopology @0x1fbbe4e0 会把每个 worker 的 LocalTopology(在 phase 1 收集)折叠成全局 toroidal topology。现代路径运行组合式 TopologyDiscoverer(ctor @0x1fbff680,Discover @0x1fbff7e0),其持有五个子对象:IciLinkPolarityAssigner、ChipCoordinatesAssigner、IciDiscoverer、TopologyFaultVerifier、TrayShapeChecker,由 --tpu_slice_builder_topology_discovery_new_module gate 控制;LegacyTopologyDiscoverer @0x213dcfe0 是 fallback,并额外增加 SliceReshaper 步骤,但产生相同的 ResilientToroidalTopology。
Discovery 按以下顺序在固件每端口信息之上增加四类内容:
function TopologyDiscoverer_Discover(locals, target_topology): // 0x1fbff7e0
if already_discovered_: return error // re-discover guard
// [polarity] orientation is symmetric (axis only, no sign on 2-D parts)
if IciLinkPolarityAssigner::IsPolarizationNeeded(tpu_type): // 0x1fc0d7a0 — binary search kTpusWith2dSlices
seed = ChooseSeed() // first chip that forms a 4-link square
BreadthFirstWalk(seed): // propagate +/- signs across bidirectional pairs
AssignOrVerifyPolarity(chip) // opposite signs on the two endpoints of every link
UpdatePolarizedLocalConnectivity(chip) // rewrite Orientation → signed Direction
// [link discovery] build map<Chip, map<Direction, PhysicalIciLink>>
IciDiscoverer::Init(); IciDiscoverer::Discover() // 0x1fc09d40 / 0x1fc0b720
// reject loopback / unconnected ports; for each link verify the remote chip
// carries Direction::Opposite back to us, else: "...does not have a reverse counterpart..."
// verify node count == target_topology.GetTopologySize()
// [coordinates] BFS from origin chip = (0,0,0)
ChipCoordinatesAssigner::BreadthFirstWalk(): // 0x1fc02040
for each Direction d from cur: neighbor_coord = cur_coord + offset_for_direction(d)
// re-visit from a different path → VerifyCoordinateConsistency (modulo torus size)
// mismatch: "Discovered conflicting cartesian coordinates assignment ..."
NormalizeChipPositions() // shift origin to (0,0,0)
// [validation] fault pattern + tray shape
TopologyFaultVerifier::Verify(); TrayShapeChecker::Check()
install ResilientToroidalTopology on Master+152
```text
Polarity 阶段是微妙之处。在 2-D slice 上,固件为每个端口标注的是**轴**,不是**符号**;assigner 会寻找一个 link 构成 2×2 square 的芯片(这是唯一具有一致符号分配的闭环),按约定固定它的四个 polarity,并通过 BFS 传播。在 3-D part 上,cable ID 显式携带符号,因此会跳过 polarity pass。Discovery 之后,slice 拥有每芯片笛卡尔 `(X,Y,Z)`、`ChipLocationToCoordinate` map,以及用于路由表生成的每芯片 `Direction → port` map。完整的 square-seed heuristic、`LocalTopology`/`PortEntry` proto layout、完整 failure catalog 和 megascale coordinate handoff 都在 **[Topology Discovery](topology-discovery.md)** 中。
> **GOTCHA —** 坐标原点不一定是角点。BFS 从用户的 `--xla_jf_ici_origin_chip_location`(或第一个芯片)开始,这个芯片可能位于 slice 中间,因此遍历中会产生负坐标。`NormalizeChipPositions` 随后按分量最小值平移整个 map。假设原点是低角点的重新实现会错误分配 chip ID(chip ID 从归一化坐标派生,X 最快,然后 Y,然后 Z)。
---
## 4. Transfer layer — DMA descriptor 和 all-reduce
在 torus 被发现且路由安装后,collective 开始移动字节。传输单元是 **remote-DMA descriptor**:本地 TensorCore 发起一个 `DMA_TYPE_REMOTE_WRITE_UNICAST`,其 source 是本地 VMEM offset,destination 是相邻 core 上的 VMEM offset,payload 携带一个 **remote sync-flag handle**。当 chunk 到达时,接收侧 NodeFabric Ingress Unit(NIU)会自动递增该 remote sync flag,即线级 `atomic_remote_add_set_done` 机制。Descriptor word layout 随 generation 而异(`JellyfishDmaDescriptorState` @`0x1d4c9f40`,`PufferfishDmaDescriptorState` @`0x1d5ab540`,以及 Ghostlite/Viperfish encoder);granule size 取决于 target(Jellyfish 为 32 B,更新代为 64 B)。完整字节 layout 见 **[DMA Descriptor](dma-descriptor.md)**。
> **QUIRK —** 不存在 **reduce-on-wire**。每个 ICI DMA 都是普通 unicast write;reduction op(`SUM/PRODUCT/MIN/MAX`,以及 PRED/U32 上的 bitwise AND/OR)只对本地 accumulator 可见,本地 accumulator 对自己的本地副本和刚到达的 chunk 运行 VPU `vadd/vmul/vmin/vmax` lambda。Reduction kind 从不传输。寻找 descriptor 中 reduction-op 字段的重新实现者找不到它。
### 4.1 All-reduce primitive 速览
All-reduce 是 **colored-ring reduce-scatter + all-gather**,不是单个算法。`AllReduceEmitter::EmitAllReduce` @`0x13742200` 和 `BaseStrategyND::SelectNDStrategy` @`0x137c78e0` 根据 tensor size、color count、topology、cross-module-ness 和 prefer-flag 选择五个 strategy family 之一。概念分解是共享的:`ring_size − 1` 个 reduce-scatter step(每个 core 顺时针发送一个 shard,从逆时针接收一个 shard 并累加),然后 `ring_size − 1` 个 all-gather step。**3-D torus exploit** 是 `BaseStrategyND::ComputeColorDimensions` @`0x137c3ba0`(signature 确认一个 `bitset<3>` axis-usability mask,以及一个 `long[6][3]` per-color/per-dimension result):在 3-D part 上,它最多并发运行三个正交 ring,每个轴一个,因此这些 ring 不共享 SerDes 端口。
| Strategy family | Algorithm | When chosen |
|---|---|---|
| `BinomialSinglePhaseRingSumEmitter` @`0x13769be0` | binomial tree,log₂(ring) steps | 小型 / latency-bound |
| `UniDirection1DRingStrategy` @`0x137d4a20` | 1-D ring,单方向,2-phase | 通用 1-D torus axis |
| `UniDirectionNDRingStrategy` @`0x137d4700` | N 个并发 per-axis color rings | 2-D/3-D torus decomposition |
| `StrategySubgroupND` @`0x137d4c00` | 先 per-subgroup ring,再 over-rings | hierarchical / cross-module ARS |
| rotated- / async-pincer family | 双向 pincer,重叠 send/recv | 中大型,bandwidth-bound |
支持的 element type 正好五个:`kSupportedTypes` @`.rodata 0x0ae5a56c` = `{F32=11, S32=4, U32=8, BF16=16, PRED=1}`;其他类型会在上游 promote。Quantized-pincer 路径还在线上接受 `{S8, F8E5M2, F8E4M3B11FNUZ}`。Strategy decision tree、每 family 的 pincer overlap、dtype/BF16-accumulation gate、tree-barrier scope 和 VMEM scratch sizing 都在 **[All-Reduce Primitive](all-reduce-primitive.md)** 中。`EmitAllReduce` 反编译交叉确认了 family 集合(引用了 `Pincer`、`UniDirection`、`Binomial` 和 `GetRingLocation`)。
---
## 5. Resource model — links、credits 和 VC balance
ICI flow control **不是**由软件在 data path 上管理。编译器只发出 sync-flag bookkeeping;每 flit credit handling 位于 NIU 和片上 switch fabric 中。主机只能通过固定的 MMIO counter set 观察 link state:每端口(×4)九个 `MGT_USER_ICI_LINK[n]_STALLS_*` 类别(`LST/NOLST × DATA/NODATA × CREDIT/NOCREDIT` 立方体,用于区分 egress-starved、receiver-back-pressured 和 idle)、八个每 client `MGT_USER_ICI_LINK_ARB_DELAY_*` arbitration counter,以及五个 `MGT_USER_ICI_LINK_XMIT_STALL_THRESHOLD_CNT_NF_CLIENT[n]` NodeFabric threshold。这四乘九的 stall 类别是锁定 **4-port** 数量的二进制证据。
编译器*确实*控制的是把 torus dimension 映射到 scheduler resource slot,使 latency-hiding scheduler 能建模双向 ring contention。`GetResourceFromIciResource` @`0x1c894c00` 通过字节精确规则 `slot = (e − 1) + 0xd`(slot `0xd..0x12`)把 `IciResource ∈ [1..6]` 映射到 `ResourceVector` slot,即 3 个 torus dimension × 2 个 ring direction(±);六个值的每轴标签(X = 1/2,Y = 3/4,Z = 5/6,从 `EstimatePhysicalLinksUsed` insert site 推导)在 [SC-Side Twist](../twist/sc-side-twist.md) §3.2。`CalculateBisectionBandwidth` @`0x133ef4c0` 遍历 `vector<IciResource>` 来确定 cross-section 大小。在 Jellyfish-DF 上,路由表会由 `SetChannelMergeBehavior` @`0xe76c680` 增强,该函数配置每端口 VC-merge 语义;可选的 `DetectRoutingTableDeadlock` pass(步骤 5)会遍历 channel-dependency graph 查找环。完整的 `IciResource` enum、degraded-axis remap 和 VC-merge/deadlock 模型在 **[VC Balance / Allocation](vc-balance-allocation.md)** 中。
---
## 6. Failure recovery 速览
Bring-up 和 runtime fault 会流经一个六值 `SliceFailureType` enum(`SLICE_FAILURE_{UNKNOWN=0, INIT_ERROR=1, WORKER_UNAVAILABLE=2, FLAPPING_TASK_ERROR=3, SW_INJECT_ERROR=4, CHIP_DRIVER_ERROR=5}`;`SliceFailureType_Name` 通过 `cmp $0x5;ja` 限定有效值)以及一个 `LinksDownReset` recovery RPC。在驱动侧,不可纠正的 link IRQ(`Ici::HandleIciLinkInterrupt`)升级为 `Ici::SignalDeferredFailure → FailDevice`,并级联 `Driver → TensorNode → BarnaCore → Queue`,最终表现为 `SLICE_FAILURE_CHIP_DRIVER_ERROR`。在 slice 侧,`Master::FailSlice` @`0x1fbc1760` 把 4 值 `MasterState` 向 failing 转换,并调用 `SliceBuilderHelper` handler。Recovery 是 `Master::LinksDownReset` @`0x1fbc4c40` → 每 worker `SliceConfiguration::LinksDownReset`(通过固件把每条非 down link 置 down、重新收集 DL state、清空 enabled-port list)。Bring-up 错误在 PHY training 期间被 mask(`MaskIciErrors`),并在 DL-up 后 unmask。完整的 `SliceFailureType` 表、FailDevice cascade 和 reset state transition 在 **[Failure Recovery](failure-recovery.md)** 中。
---
## 7. 验证说明
> link 模型、bring-up entry、discovery entry、link count 和 all-reduce family 已与 `libtpu.so` v0.0.40 的 IDA 反编译结果交叉核对:
>
> - `Master::InitSlice` @`0x1fbbaac0`:11 个 `ExecuteOnAllWorkers` fan-out site,加上 `DiscoverTopology`、`SetGlobalChipId`、`SetRoutingTable`、`SetGtcConfiguration`、`ControlIciErrorReport`、`EnableIciDataLink`、`DetectRoutingTableDeadlock` 子调用;16 步序列一致。
> - `IciControl::WaitForLinksUp` @`0xe7b1060`:单个固定 sleep quantum `mov $0x3D0900,%eax` @`0xe7b11c2` 送入 `AbslInternalSleepFor`(只有一档,没有 500 ms fallback path),deadline branch `cmp $0x3D0901,%edx` @`0xe7b1198`,每 link 的 `IsLinkUp` + `GetLinkStackReadyState`,以及 `NameOfDenseEnum<&LinkStackReadyState_descriptor, 0, 7>`(8 值 firmware code 0..7 → software enum)— 精确。
> - `Master::DiscoverTopology` @`0x1fbbe4e0` 和 `TopologyDiscoverer::Discover` @`0x1fbff7e0` 存在;组合子对象和 `ResilientToroidalTopology` install 从 discovery chain 重建。
> - 4-SerDes-port 数量:由 `.rodata` 中的 `MGT_USER_ICI_LINK[0-3]_STALLS_*` counter set(4 links × 9 stall categories)确认。
> - `AllReduceEmitter::EmitAllReduce` @`0x13742200`:引用 `Pincer`、`UniDirection`、`Binomial`、`RingLocation`;`BaseStrategyND::ComputeColorDimensions` @`0x137c3ba0` signature 携带 `bitset<3>` 并返回 `long[6][3]`(`PA6_A3_l`);`GetResourceFromIciResource` @`0x1c894c00` 和基于 `vector<IciResource>` 的 `CalculateBisectionBandwidth` @`0x133ef4c0` 存在 — 精确。
>
> **[LOW]** 每端口 `LinkStackReadyState` value name(7 个 enum 字符串)在运行时通过 `NameOfDenseEnum` 发出,不作为 `.rodata` literal 存在;`0xe7b6400` 处的 8→7 firmware-to-software remap table 已按数值恢复,但字符串名称需要 `link_stack.proto` descriptor。最新 GFC/VFC generation 的每芯片 family 物理端口数只有 JXC family 由 MGT counter set 确认为 4;GFC/VFC 被推断为匹配(标记 LOW)。
---
## 相关组件
| Component | Relationship |
|---|---|
| [Collectives](../collectives/overview.md) | 主要消费者 — 把 HLO collective lowered 成该 fabric 上的 ICI ring traffic |
| [Routing](../routing/overview.md) | 位于 collectives 和 ICI 之间;把 `(src,dst)` 转成 DMA descriptor 承载的 per-link path |
| [Twisted Torus](../twist/overview.md) | 提供 discovery 和 routing 查询的 per-direction coordinate offset(带 twist delta) |
| [Megascale](../megascale/overview.md) | 把 per-slice ICI topology 拼接为 cross-rack cluster;消费 ICI 的 per-slice `(X,Y,Z)` bounds |
## 交叉引用
### ICI 章节页面
- [Link Bring-Up](link-bringup.md) — 16 步 `Master::InitSlice` 序列、每阶段 RPC、firmware PHY / host DL split、poll loop 和 deadline
- [Topology Discovery](topology-discovery.md) — square-seed polarity、BFS coordinates、`LocalTopology` wire format、failure catalog、megascale handoff
- [DMA Descriptor](dma-descriptor.md) — 每 family descriptor word layout、remote sync-flag encoding、granule sizing
- [All-Reduce Primitive](all-reduce-primitive.md) — colored-ring reduce-scatter + all-gather、五个 strategy family、dtype/quantization gate、tree barrier
- [Failure Recovery](failure-recovery.md) — `SliceFailureType`、`FailDevice` cascade、`LinksDownReset`、error masking
- [VC Balance / Allocation](vc-balance-allocation.md) — `IciResource → ResourceVector` slot mapping、channel-merge、deadlock detection
### 同级章节
- [Collectives](../collectives/overview.md) · [Routing](../routing/overview.md) · [Twisted Torus](../twist/overview.md) · [Megascale](../megascale/overview.md)
- [返回索引](../index.md)