在这款游戏机的核心部分,我们发现了一个名为情感引擎(Emotion Engine,"EE")的强大封装,这个芯片是东芝和索尼的一个联合项目,运行频率约为294.91MHz。

Emotion Engine,在该游戏机的首个主板改版中可见
该芯片组包含众多组件,主CPU就是其中之一。 其余部件则供CPU使用,以加快某些任务的执行速度。 为了便于分析,我们将EE分成三个部分:
- 领队: 控制整个芯片的主要组件。
- 可用内存:使处理器可进行有意义运算的关键部件。
- 协处理器: 这些处理器可加速特定计算。
领队
简而言之,主CPU采用MIPS R5900,这是专为这款游戏机设计的MIPS内核。 你可能还记得,索尼在初代PlayStation上就开始使用MIPS芯片(我们可以找到来自LSI的第二个MIPS芯片R3000A)。 对于下一代产品,我们已经有了一个MIPS "R5900"......但这个名字对我们意味着什么呢?
为了了解新数字背后隐藏的信息,让我们回顾一下那个时代的历史。
超越成功
MIPS R4000是一个广受欢迎的CPU系列,被众多系统所采用,其中包括一个强劲的竞争对手。 由于它的成功,MIPS为大众带来了一系列曾经买不起的先进技术(64位计算、8级流水线等)。
1995年,随着**R10000的发布,MIPS实现了又一次飞跃。 现在,在SGI(硅谷图形)的资助下,MIPS生产了一种新的处理器,将R4000的并行能力提升了"数英里远",首次推出了这些技术:- 推测执行: 在计算条件分支之前,CPU会预测其结果。 预测结果基于存储在内部512条目的表中的先前结果。 一旦计算出条件,如果预测结果正确,CPU就节省了宝贵的时间。 否则,多余的计算将被丢弃。
- 4个超标量流水线: 在流水线设计的基础上,CPU 现在会在流水线的起点获取多达四条指令,并将它们分配到不同的单元,使CPU可以同时执行这些指令。 这样,CPU就实现了更高程度的并行性。
- 乱序执行: CPU还会重新排列指令顺序,尽量填满其单元(只要不增加冒险)。
- 配备128位总线的二级高速缓存(L2 cache),可一次将更多数据输入中央处理器,这是在前面改进的基础上提出的要求。
然而,这种创新是以复杂的设计为代价的,最终产品的价格并不便宜。 SGI只将其捆绑在高端设备中,任何将其引入家用游戏机的尝试都是不可能的。
面向大众的高端产品
SGI/MIPS已经意识到R1000 在商业上的局限性,因此聘请Quantum Effect Devices(QED) 为中低端市场开发经济实惠的R10000版本。 作为一家由MIPS前员工创办的公司,QED的业务是为经济型市场设计MIPS内核的变体。
最终,QED推出了名为R5000的新内核,这是一个经过大幅阉割的R10000内核:
- 乱序执行恢复为顺序执行。
- 取消了推测执行。
- 超标量性仅限于两条指令(2-issue),不再并行化整数指令。 不过,浮点指令仍可与其他指令配对执行。
- 由于之前的阉割,L2 Cache被阉割为64位总线。
因此,它成为了为经济型设备(如SGI的低端工作站)提供动力的理想CPU。 无论如何,请注意,削减后的流水线仍然可以执行并发浮点运算,似乎QED打算将其作为矢量/3D应用的一个有吸引力的产品。 你很快就会发现,另一家公司也很快注意到了这一点。
顺便提一下,在技术池的另一边,也有类似的进步,但方向正好相反:ARM与DEC联手将ARM芯片推向高端市场。
索尼的特别订单
东芝获得MIPS许可证已有一段时间,对生产MIPS变体和封装并不陌生。 索尼和东芝一度联手为索尼即将推出的游戏机生产专用CPU。 这给东芝带来了巨大的好处:CPU通常需要满足来自不同利益相关者的各种要求,这样就限制了专用化的机会。 现在,CPU只有一个用途:跑3D游戏。 因此,这为各种创新提供了足够的空间。
尽管如此,东芝最终还是采用了经济实惠的R5000设计,并对其进行了调整,以加速矢量运算。 新内核被命名为R5900,并首次推出了以下"3D"增强功能:
- MIPS III ISA的变体。 这包括以前在任天堂64上看到的原始64位ISA,但扩展了有趣的操作码。 索尼从MIPS IV中添加了一些指令(预取和条件移动),以及他们自己的SIMD扩展指令,称为多媒体指令,用于加速矢量计算(类似于SH-4,但只有整数指令)。
- 多媒体指令仍为32位宽,但一次最多可操作三个128位向量。 它们提供的操作包括矢量算术、取最小/最大和多种标量组合,以形成新的矢量。
- 32个128位通用寄存器: 东芝品牌的又一重大改进。 抛开典型的32位存储空间不谈,我们现在已经跨入了128位领域。 尽管如此,大多数操作都很难使用所有可用空间(MIPS字长仍为64位)。 这时,前面提到的多媒体扩展功能就会发挥作用,因为它的指令集将充分利用扩展寄存器文件。
- 使用新指令时,每个寄存器可以存储由多种标量(从两个64位整数到16个8位整数)组成的向量。
- 为防止性能下降,这些寄存器通过128位总线访问,而CPU的其他部分则使用内部64位数据总线。
- 两个64位ALU。 每一个都可以独立运算64位整数,但也可以组合成128位ALU。 后者是闪耀的多媒体操作码背后的大脑。
除此以外,我们还发现了开发人员可能欢迎的其他改进:
- 6级流水线: 与前代产品相比,增加了一个阶段。
- 双路超标量执行: 由于采用了两个ALU,现在最多可以并行执行两个64位整数运算。
- 这恢复了MIPS R10000失去的另一个优势。
- 24 KB一级高速缓存(L1 cache): 其中16 KB用于指令,8 KB用于数据。
- 电路还实现了预取功能,在指令和数据被请求之前对其进行缓存。 这是通过额外的逻辑来实现的,该逻辑可识别内存中哪些位置更常被请求。
- 16 KB的Scratchpad RAM,也称为"快速RAM"。
- 内存管理单元: 内存访问与系统其他部分的接口。
此外,内核还配有一个专用浮点运算单元(称为"COP1"),用于加速32位浮点数(在C语言中也称为float)的运算。 这是一个特殊的区块,因为它不遵循IEEE 754标准,最明显的是它没有无穷大(infinity)(而是计算为0)。 除此之外,它还有32个32位寄存器。
可圈可点的内存取舍
Emotion Engine旁装有两颗各16 MB的内存芯片,总内存共计 32 MB。 使用的内存类型是RDRAM(似曾相识!(译注:原文为déjà vu,容易让人想起一首已成为meme的eurobeat)),通过16位总线访问。

Emotion Engine的内存设计。 你可以猜到拥堵会出现在哪里
乍看之下,Emotion Engine的内部总线只有128位宽,并无亮眼之处。 不过,RAM芯片采用了双通道架构,即使用两条独立的16位总线(每个芯片一条总线)连接两个芯片,以提高数据吞吐量。 这一布局理论上可达到3.2 GB/秒的带宽。所以大可放心,这款主机不存在内存延迟问题!
在EE的一角,有一个功能强大的DMA控制器或者叫"DMAC",用于在主内存和Scratchpad之间或主内存和EE内部任何组件之间传输数据。
数据传输以128位为一批,但有趣的地方就在这里: 每八个批次,主总线会暂时解锁。 这就为并行执行其他DMA传输(最多十次)或让CPU使用主总线留出了一个小窗口期。 这种工作方式被称为切片模式,是该DMA单元的多种可用模式之一。 请注意,虽然切片模式可以减少主总线上的停滞,但其代价是降低整个DMA传输的速度。
汲取历史教训
不管我们愿不愿意,随着EE内部数据流量的增加,这种设计最终将承受统一内存架构(Unified memory architecture,"UMA")带来的后果。 这就是:多个独立组件试图同时访问主内存,从而造成拥塞。 为了解决这些问题,索尼通过以下方法缓解了对内存的持续需求:
- 用大量高速缓存裹着处理器。 因此,只有在绝对必要的情况下,才需要访问主存储器。
- 本文中提到的99%的缓存/Scratchpad的设立都是出于这个原因。
- 添加128字节回写缓冲区(Write Back Buffer): 与"写入收集管道"(Write Gather Pipe)非常相似,但它不会等到25%满了再写,而是会先检查总线的状态(即拥挤还是空闲)。
这对于能从缓存中获益的应用程序来说,听起来非常方便,但对于那些根本不应该使用缓存的任务(如操作显示列表),又该怎么办呢? 幸运的是,CPU提供了一种不同的内存访问模式,称为"未缓存"(UnCached),它只使用回写缓冲区。 因此,它不会浪费周期来修正缓存(缓存未命中的产物)。
此外,还提供未缓存加速模式。 这种模式增加了一个缓冲区,以加快读取内存中连续地址的速度。
其他有趣的部分
在同一个EE封装中,还有一个名为图像处理单元(Image Processing Unit,"IPU")的处理器,这次是为图像解压缩而设计的。 作为MDEC的继任者,IPU在游戏需要解码MPEG2影像而不占用主CPU时非常有用。
长话短说,游戏向IPU发送压缩图像流(希望使用DMA),然后以GPU可以显示的格式解码。 PS2的操作系统也依赖IPU提供DVD播放功能。
最后,IPU还能运行压缩的高分辨率纹理,从而节省CPU使用量并减少大量传输。