跳转到内容

Cell BE — 一颗 CPU 里塞 8 个加速核

是什么

Cell Broadband Engine(Cell BE) 是 IBM、Sony、Toshiba 三家在 2005 年联合推出的处理器。它最出名的身份是 PlayStation 3 的大脑

日常类比:传统 CPU 像一个全能选手,啥都干但啥都不极致;Cell 则像一个领班 + 八个专做体力活的工人——领班负责派活,八个工人各自闷头算,干完再把结果交回去。

它在 2005 年算力爆表(230 GFLOPS,是同期 Intel Xeon 的 5 倍),但编程极难——程序员必须手动指挥每个工人去哪取料、放哪、用什么节奏。这套模式失败了,但它的思想活到了今天的 GPU、NPU、TPU 里。

为什么重要

Cell 是一面镜子,它同时讲清楚:

  • 为什么 GPU 现在能赢——因为 GPU 用相同套路(异构、显式访存、SIMD),但生态做对了
  • 为什么”自动并行”是骗局——Cell 编译器没办法自动用满 8 个核,开发者必须手写
  • 为什么 Apple M 系列回归 Unified Memory——Cell 的”显式 DMA”教训太深,业界又走回共享内存
  • 2005 年到 2025 年加速器的所有共同 DNA 都在这颗芯片里能找到

不读 Cell,理解不了今天为什么 NVIDIA 一家独大,也理解不了 Apple 为什么不学 NVIDIA。

核心要点

Cell 的设计可以拆成 三个关键决定

  1. 异构(heterogeneous):一个 PowerPC 通用核(PPE)当领班,跑操作系统、调度、串行逻辑;八个对称加速核(SPE,Synergistic Processing Element)只干向量计算,不跑系统。

  2. 显式本地存储:每个 SPE 没有 Cache,只有 256KB 的本地 SRAM,叫 Local Store。要算什么数据,得程序员显式 DMA 从主存搬进来;算完再 DMA 搬出去。这跟今天 NVIDIA GPU 里的 shared memory 思想完全一样。

  3. 片上环形总线 EIB:8 个 SPE + PPE + 内存控制器全挂在一条 4 通道双向环上,峰值带宽 200+ GB/s,让数据能在芯片内部高速流转。

这三件事加起来,让 Cell 在视频转码、物理仿真、HPC 这种”算得多、规则简单”的负载上极快。

关键组件一览

部件角色类比
PPE通用 PowerPC 核,跑 OS 和调度工地领班
SPE8 个对称向量加速核八个体力工人
Local Store每个 SPE 私有 256KB SRAM工人手边的小工具箱
EIB片上环形互连工地内的传送带
MFC每个 SPE 配一个的 DMA 控制器工人和大仓库之间的搬运工

实践案例

案例 1:PS3 用 Cell 怎么跑游戏

PS3 主机里:

  • PPE 跑游戏主循环、AI、网络、IO
  • 6 个 SPE 给开发者用(剩下 1 个跑系统、1 个良率冗余)
  • 物理引擎、骨骼动画、流体、后处理特效全部丢给 SPE

但游戏开发者抱怨:为了用满 6 个 SPE,开发周期翻倍。同期 Xbox 360 是三核 PowerPC 对称多核,写起来跟普通 PC 一样。结果是跨平台游戏在 PS3 上经常更晚发售、画质更差。

案例 2:Roadrunner 超算的胜利

2008 年 Los Alamos 国家实验室造的 Roadrunner 超算,用了 12960 颗 Cell(加 6480 颗 AMD Opteron 当领班)。

它是人类历史上第一台突破 1 PFlops 的超算。负载是核武器仿真——规则极简单、并行度极高、对编程难度容忍度高,正好命中 Cell 的甜区

案例 3:今天 NVIDIA SM 内的 Cell 影子

写过 CUDA 的话,下面这段眼熟:

__shared__ float tile[16][16]; // SM 内的快速 SRAM
tile[ty][tx] = A[row * N + col]; // 显式从全局内存加载
__syncthreads(); // 等所有线程加载完

这个 __shared__ 内存的角色 = Cell 的 Local Store。不同的是 NVIDIA 提供了 warp / block / grid 的层级抽象 + CUDA 编译器替你管同步,Cell 只给你一颗光秃秃的 256KB SRAM 自己玩。

案例 4:DMA 双缓冲是 Cell 编程的灵魂

由于 Local Store 容量小(256KB)但算力大,Cell 程序员的标准套路是双缓冲 DMA

while (有数据):
buf[0] 在算 ─┐
├─ 同时进行
DMA 取 buf[1] ─┘
swap(buf[0], buf[1])

让 DMA 传输和 SPE 计算同时跑,把 200+ GB/s 的 EIB 带宽吃满。这套思想后来变成 GPU 的 cudaMemcpyAsync + stream,再变成今天 vLLM 的 prefill/decode 流水。

踩过的坑

  1. 把 Local Store 当 Cache 想:Cache 是硬件自动换入换出,Local Store 不是。程序员忘记 DMA 数据进来,SPE 直接拿到垃圾内存继续算。

  2. DMA 对齐:SPE 的 DMA 要求 16 字节对齐,未对齐会触发慢路径或崩溃。新人调一晚上发现是某个 struct 字段错位。

  3. 把 8 个 SPE 当 SMP 多核:以为像 OpenMP 一样写个 #pragma parallel for 就完事——错。SPE 不能跑普通线程,要写专门的 SPU ELF 程序,PPE 用 spe_context_create 一个个启动。

  4. PPE 是瓶颈:PPE 是顺序双发射 PowerPC,比同期 Xeon 弱很多。如果热路径在 PPE 没切到 SPE,8 个加速核全在睡觉

  5. 以为编译器会救你:GCC 的 SPE 后端不会自动并行化、不会自动切分热点。开发者必须手动决定哪些数据切到 Local Store、哪些循环交给 SPE。

适用 vs 不适用场景

适用

  • 数据并行度高、控制流简单的负载(视频编解码、信号处理、物理仿真、HPC)
  • 团队有时间手写 SIMD + DMA 的项目(科研、游戏 AAA 工作室)
  • 内存访问模式可预测、可流水化的算法

不适用

  • 通用桌面 / 服务器负载(数据库、Web、编译器)——指针追逐、随机访存、控制流复杂
  • 小团队、迭代快的产品——开发周期承担不起
  • 需要传统多线程编程模型(pthread / OpenMP)的代码

历史小故事(可跳过)

  • 2001 年:STI(Sony-Toshiba-IBM)联盟成立。Sony 想要给 PS3 准备一颗”算力碾压”的芯片,IBM 出工艺,Toshiba 出消费电子整合。
  • 2005 年 ISSCC:Cell 首次公开。学界和工业界震惊:3.2GHz 主频、230 GFLOPS、80W 功耗——同期 Pentium 4 才 10 GFLOPS。
  • 2006 年 PS3 发售:Cell 首次商用。开发者哀嚎。
  • 2008 年 Roadrunner:Cell 在超算领域达到顶峰,全球第一台 PFlops 机。
  • 2010 年:IBM 悄悄停掉 Cell 后续路线图。NVIDIA CUDA 已经证明:异构计算的赢家是 GPU + 通用编程模型,不是定制核 + 手写 DMA
  • 2013 年:PS4 改回 x86 + Radeon GPU,Cell 退出主流。

整段历史只跨 12 年,但塑造了之后 20 年的加速器设计哲学。

学到什么

  1. 架构再先进,没有好编程模型就活不下来——Cell 的 230 GFLOPS 没救活它,CUDA 的”看起来像 C”救活了 GPU。
  2. 显式访存 + DMA + SIMD 是加速器的不变三件套——从 Cell 到 GPU 到 TPU 全是这个底子。
  3. 异构 vs 同构是性能 vs 可用性的天平——Cell 押异构走极端,输了;ARM big.LITTLE 同 ISA 异构,活下来;Apple M 用统一内存削弱异构感受,赢了。
  4. 超前 10 年的设计常常先死后活——Cell 死了,但它的思想随便挑一个都在今天的 GPU 里。

延伸阅读

关联

反向链接