# E.5 案例研究：Sony PlayStation 2 的 Emotion Engine
<!-- source: p0958 -->

桌面计算机和服务器依靠存储层次结构，降低相对静态数据的平均访问时间；但有些嵌入式应用中的数据往往是连续的数据流。在这类应用中，空间局部性仍然存在，时间局部性却有限得多。

为了从桌面系统之外的角度考察存储性能，本节介绍 Sony PlayStation 2 核心的微处理器。我们将看到，电子游戏持续不断的图形和音频数据流，使它采用了不同的存储设计方法：利用许多专用、独立的内存来提供高带宽。

<!-- source: p0959 -->

图 E.11 给出了 Sony PlayStation 2（PS2）的框图。作为游戏机，它具有视频、声音和 DVD 播放器接口并不奇怪。令人意外的是，它还配有 USB 和 IEEE 1394 两种标准计算机 I/O 总线、便携式 PC 常见的 PCMCIA 插槽，以及调制解调器。这些附加功能表明，Sony 对 PS2 的设想并不限于传统游戏。I/O 处理器（IOP）看起来只是管理 I/O 设备和游戏机，实际上它还包含一个 34 MHz MIPS 处理器，用作运行早期 Sony PlayStation 游戏的仿真计算机。

<!-- source: p0960 -->

它还连接到标准 PC 声卡，为游戏提供声音。

<!-- source: p0959 -->

![Sony PlayStation 2 框图](/figures/app-e/fig-e-11.png)
{#fig-E.11 .wide .expand num="E.11"}

**图 E.11 Sony PlayStation 2 的框图。** 10 个 DMA 通道协调芯片上各个小型内存之间的数据传送；处理完成的数据最终都送往图形接口，再由 Graphics Synthesizer 渲染。Graphics Synthesizer 利用片上 DRAM 容纳完整的帧缓冲区，并配合图形处理器，根据 Emotion Engine 提供的显示命令执行所需的渲染。嵌入式 DRAM 支持像素处理器与显示缓冲区之间的 1024 位传送。

超标量 CPU 是双发射的 64 位 MIPS III，带有两路组相联的 16 KB 指令缓存、两路组相联的 8 KB 数据缓存，以及 16 KB 暂存存储器（scratchpad memory）。它还扩展了用于多媒体应用的 128 位 SIMD 指令，见 E.2 节。向量单元 0 主要作为 CPU 的类似 DSP 的协处理器（见 E.2 节），可在 128 位寄存器上执行 SIMD 运算，其中每个数据字的宽度可为 8 位至 32 位。它有 4 KB 指令内存和 4 KB 数据内存。向量单元 1 的功能与 VPU0 类似，但通常独立于 CPU 运行，并含有 16 KB 指令内存和 16 KB 数据内存。

这三个单元都能通过 128 位系统总线通信；此外，CPU 与 VPU0 之间有一条 128 位专用通路，VPU1 与图形接口之间也有一条 128 位专用通路。虽然 VPU0 和 VPU1 的微体系结构相同，内存大小及其直接连接单元的差异，决定了它们在游戏中的不同职责。采用 0.25 微米线宽时，Emotion Engine 芯片使用 1350 万个晶体管，面积为 225 mm²；Graphics Synthesizer 的面积为 279 mm²。作为比较，采用 0.25 微米工艺的 Alpha 21264 微处理器面积约为 160 mm²，使用 1500 万个晶体管。（本图依据〈Sony’s Emotionally Charged Chip〉中的图 1，*Microprocessor Report*，13:5。）

图中 Emotion Engine 内包括 300 MHz、支持 128 位 SIMD 的超标量 CPU 核、VPU0、VPU1、图形接口、内存控制器、10 通道 DMA、IPU（MPEG 译码器）和 I/O 接口，共享 128 位/150 MHz 总线。主存为 32 MB DRDRAM。Graphics Synthesizer 包括 16 个并行像素处理器（150 MHz）及 4 MB 多端口嵌入式 DRAM 视频内存；输出格式列为 NTSC、PAL、DTV、VESA。其他图内标识包括本地总线、48 通道声音芯片、I/O 电路和兼容 PlayStation 的 34 MHz MIPS CPU，接口与连接宽度、频率均保留在图中。

<!-- source: p0960 -->

因此，这一嵌入式应用的存储系统面临的一个挑战，是充当大量 I/O 设备的数据源或目的地。PS2 设计者采用两个通道上的两颗 PC800（400 MHz）DRDRAM 芯片应对这一挑战，提供 32 MB 存储容量和 3.2 GB/s 峰值内存带宽。

图中其余主要部分，基本上就是两颗大芯片：Graphics Synthesizer 和 Emotion Engine。

Graphics Synthesizer 从 Emotion Engine 接收渲染命令，这些命令通常称为*显示列表*（display list）。它们由一系列 32 位命令组成，告诉渲染器使用什么形状、放在哪里，以及填充什么颜色和纹理。

这颗芯片还拥有存储系统中带宽最高的部分。Graphics Synthesizer 采用嵌入式 DRAM，在片内容纳整个视频缓冲区，并提供 2048 位宽的接口，使像素填充不会成为瓶颈。这种嵌入式 DRAM 大幅降低了对 DRDRAM 带宽的需求，体现了嵌入式应用中的一种常见技术：为各个功能配置专用的独立内存，以较低成本提高整个系统的内存带宽。

剩下的那颗大芯片是 Emotion Engine。它接收 IOP 的输入，并生成电子游戏的显示列表，以实现实时三维视频变换。Emotion Engine 的设计受到一个重要观察的启发：一般而言，在赛车游戏中，前景对象不断变化，而背景对象对事件的反应变化较少，尽管背景可能占屏幕的大部分。这个观察促成了职责划分。

CPU 将 VPU0 作为紧密耦合的协处理器使用：每条 VPU0 指令都是标准 MIPS 协处理器指令，地址由 MIPS CPU 产生。VPU0 被称为向量处理器，但它与一些桌面处理器中用于多媒体的 128 位 SIMD 扩展相似，见 E.2 节。

相比之下，VPU1 自行提取指令和数据，与 CPU/VPU0 并行工作，更像传统的向量单元。在这种划分下，更灵活的 CPU/VPU0 处理前景动作，VPU1 处理背景。两者都把生成的显示列表送入图形接口，再传往 Graphics Synthesizer。

因此，Emotion Engine 的程序员可以从三套处理资源中选择，来实现自己的程序：包含浮点单元的传统 64 位 MIPS 体系结构、带多媒体指令扩展的 MIPS 体系结构（VPU0），以及独立的向量处理器（VPU1）。为了加速 MPEG 译码，还有一个协处理器——图像处理单元（Image Processing Unit，IPU），它可以独立于另外两套资源运行。

<!-- source: p0961 -->

采用这种功能划分之后，问题就是如何连接这些单元，如何让数据在单元之间流动，以及如何提供所有单元所需的内存带宽。前面已经提到，Emotion Engine 的设计者选择了许多专用内存。CPU 除了 16 KB 指令缓存和 8 KB 数据缓存，还配有 16 KB 暂存存储器（SPRAM）。VPU0 有 4 KB 指令内存和 4 KB 数据内存；VPU1 有 16 KB 指令内存和 16 KB 数据内存。注意，后面这四个是*内存*，并不是其他位置某个更大内存的缓存。每个内存的访问延迟都只有 1 个时钟周期。VPU1 的内存比 VPU0 大，因为它生成显示列表的主要部分，而且基本独立工作。

程序员把所有这些内存组织成两组双缓冲区，一组接收输入的 DMA 数据，一组存放输出的 DMA 数据。随后，程序员使用不同处理器，将输入缓冲区中的数据变换到输出缓冲区。为了让数据在单元间持续流动，程序员接着设置 10 个 DMA 通道，并注意满足实现逼真动画所需的每秒 15 帧实时截止期限。

图 E.12 表明，这种组织支持两种主要运行模式。*串行模式*中，CPU/VPU0 先对送给 VPU1 的内容进行预处理，以暂存存储器为缓冲区，再由 VPU1 为图形接口生成显示列表。*并行模式*中，CPU/VPU0 和 VPU1 都生成显示列表。显示列表和 Graphics Synthesizer 具有多个上下文标识符，用来区分并行生成的显示列表，最终产生协调一致的图像。

Emotion Engine 的所有单元都由一条公共的 150 MHz、128 位宽总线连接。为提供更大的带宽，还有两条专用总线：CPU 与 VPU0 之间的 128 位通路，以及 VPU1 与图形接口之间的 128 位通路。程序员在设置 DMA 通道时，也要选择使用哪条总线。

![Emotion Engine 的串行和并行工作模式](/figures/app-e/fig-e-12.png)
{#fig-E.12 .wide .expand num="E.12"}

**图 E.12 使用 Emotion Engine 组织的两种模式。** 原图注所说的第一种模式把工作分给两个单元，再由图形接口适当地合并显示列表；第二种模式把 CPU/VPU0 用作过滤器，决定将哪些内容送给 VPU1，再由后者生成全部显示列表。串行还是并行的数据流，由程序员选择。SPRAM 表示暂存存储器。图中 Main memory 为主存，Rendering engine 为渲染引擎。

> **译注：** 图中的排列顺序为上方串行连接（Serial connection）、下方并行连接（Parallel connection）；原图注“第一种”“第二种”的叙述顺序恰好相反，即先描述并行、后描述串行。

<!-- source: p0962 -->

从总体上看，如果把这一问题交给面向服务器的设计者，设计结果可能是一条公共总线、许多本地缓存，以及保持数据一致的缓存一致性机制。而 PlayStation 2 遵循嵌入式设计传统，至少使用了九个不同的内存模块。为了让数据实时地从内存流向显示器，PS2 采用专用内存、专用总线和 DMA 通道。一致性由程序员负责；考虑到数据从主存到图形接口的连续流动以及实时要求，这种由程序员控制的一致性很适合该应用。
