# 7.6 Graphcore IPU Bow：面向训练的数据中心加速器
<!-- source: p0633 -->

图 7.18 列出了 Graphcore 智能处理单元（Intelligence Processing Unit，IPU）的主要特征，图 7.21 则是其裸片照片。IPU 是单芯片上的大规模并行处理器，第二代 IPU Bow 包含 1472 个 IPU 核心，每核每个时钟周期可完成 64 次 16 位浮点运算。与 GPU 一样，IPU 使用冗余核心提高这颗 832 mm² 大型芯片的良率，每 24 个核心中有一个冗余核心。IPU 使用 Graphcore 自行设计的 32 位标量指令。与 CPU 和 GPU 一样，它包含硬件多线程支持，每核直接支持 6 个线程。因此，和 GPU 编程一样，IPU 也鼓励程序员使用大量线程，保证有足够工作维持较高的利用率。

芯片中央的交换单元（Exchange Unit）负责各个 tile 之间的通信。与 TPU v4 和 A100 一样，IPU 提供片上链路，使多颗 IPU 可以互连成更大的系统。虽然理论上限是 64,000 颗 IPU，但提交 MLPerf 基准测试结果的最大系统包含 256 颗芯片（见 7.10 节）。每颗芯片上的交换单元与 IPU 链路配合，让程序员可以无缝地向任意芯片上的任意 tile 发送消息。全到全通信的测量结果表明，无论芯片内部还是芯片之间，其有效带宽都很高。

<!-- source: p0634 -->

![Graphcore IPU MK2 裸片照片：大量 tile 排列在中央交换单元两侧，边缘设有 IPU 链路](/figures/ch07/fig-7-21.png)
{#fig-7.21 num="7.21" caption="Graphcore IPU MK2 裸片照片" .wide .expand}

芯片采用 7 nm 工艺，裸片面积为 832 mm²。原图注写道，它包含 1492 个 tile，每个 tile 都有一个 IPU 核心和 624 KiB SRAM，总计每颗裸片 897 MiB。[^tile-count] 交换单元负责 tile 之间的全部通信。每颗裸片有 3 条 IPU 链路，可构建大规模系统；截至原书所述时期，经过基准测试的最大系统有 256 颗芯片。tile 中的存储器约占裸片面积的一半，tile 逻辑约占四分之一，交换单元约占十分之一，其余为 uncore。原图署名来源为《Sparsity-Aware and Re-configurable NPU》。图中 Tile、Exchange、Link 分别表示计算块、交换单元和链路。

为了简化设计和编程，IPU 的并行计算采用**Bulk Synchronous Parallel（BSP）模型**。BSP 把并行计算划分为一系列较大的步骤，以降低问题的复杂度。每一步先进行计算，再进行通信，最后执行屏障同步；因此，所有线程都必须完成同步，程序才能进入下一步。

IPU 最不同寻常的特征，是它的存储系统。每个 IPU Bow tile 有 624 KiB SRAM，1472 个核心合计每颗芯片拥有高达 897 MiB SRAM。这是第一代 IPU 的 3 倍，接近 TPU v4 片上 SRAM 的 6 倍，也是 A100 L2 缓存的 22 倍。另一个同样大胆的选择是：IPU 不连接 DRAM。

<!-- source: p0635 -->

如果应用需要的存储容量超过 IPU 所能容纳的范围，就必须经过网关，访问与主机 ARM CPU 相连的 DDR4 DRAM。IPU 体系结构设计者押注的是：片上 SRAM 足以满足大多数 DNN 的需要（原文参见 7.11 节）。[^ipu-crossref]

## 小结：IPU Bow 如何遵循设计准则

IPU Bow 对 7.2 节准则的遵循情况如下。

1. **使用专用存储器，尽量缩短数据移动的距离。** IPU Bow 每核配置 624 KiB 存储器，尽量把数据留在本地。原书此处把每芯片总容量写为 897 GiB。[^ipu-capacity] 唯一的 DRAM 位于 CPU 主机上，其带宽远低于前面几种 DSA 的 DRAM。
2. **把取消先进微体系结构优化所节省的资源，投入更多运算单元或更大的存储器。** IPU Bow 有 94,208 个 16 位 ALU，同样远远超过同时代 CPU。
3. **采用与应用领域匹配的最简单并行形式。** IPU 依赖多处理、多线程和一维 SIMD。
4. **把数据大小与类型缩减到该领域所需的最简形式。** 与其他 DSA 不同，IPU Bow 只支持 fp16 和 fp32。
5. **采用领域专用编程语言，把代码移植到 DSA。** 与 TPU 和 GPU 一样，IPU 使用 JAX、PyTorch 和 TensorFlow 编程框架。

[^tile-count]: 译注：原图注写作 1492，而本节正文和图 7.18 均写作 1472。按 \(1472\times624\text{ KiB}\) 计算，约为 897 MiB，与图中总容量相符。
[^ipu-crossref]: 译注：关于片上 SRAM 容量限制的具体讨论实际位于 7.10 节“谬误与陷阱”，原文此处指向 7.11 节。
[^ipu-capacity]: 译注：此处 GiB 与前文的 MiB 不一致；\(1472\times624\text{ KiB}=897\text{ MiB}\)，因此原文此处的 GiB 应为单位误写。
