« PlayStation 3 硬件架构 (index)

PlayStation 3 硬件架构

Chapter 3: 中央处理器 (CPU)


目录

  1. 简介
    1. 背景
    2. 新的设计哲学
    3. 新的多核纪元
  2. Cell 速览
    1. 整体结构
    2. 我们如何进行研究
  3. Cell的内部:心脏
  4. Cell的内部:领导者
    1. PPE 的结构
    2. PowerPC 处理单元
      1. 熟悉的架构
      2. 独特功能
    3. PPU的基础元件
      1. 指令
      2. 内存管理
      3. 算术
    4. 包装PPE
  5. Cell之外:主内存
  6. Cell内部:助手们
    1. 协同处理器元件的组成
      1. 内存流控制器
      2. 协同处理器单元
    2. SPU的结构
      1. 奇数流水线
      2. 偶数流水线
  7. Cell内部:编程风格
    1. 以PPE为中心的方法
    2. 以SPE为中心的方法
  8. 结论

欢迎来到这台主机上最知名也是最创新的部件。

简介

PS3 的 CPU 极其复杂,同时也是一项非常迷人的工程杰作,它将复杂的需求和不寻常的解决方案结合在一起,在那个变革与实验的时代显得尤为突出。 所以,在我们步入 PS3 CPU 的内部之前,让我们先了解一些历史背景。 这样一来,我们就能从上到下地解构这颗芯片,不仅让你了解它的工作原理,还能明白主要设计决策背后的原因。

背景

Image
PS1的CPU(1994)。 由索尼和LSI设计,使用MIPS技术

Image
PS2的EE(Emotion Engine)(2001)。 由东芝设计,再一次使用MIPS技术

初代 MIPS 架构的 PlayStation推出近十年后,我们来到了21世纪初,而此时 SGI/MIPS 的情况并不乐观。 任天堂在那时刚刚抛弃他们,转而选择IBM作为新的供应商,使用了一款低端的 PowerPC 核心;新入局的微软则选择了 Intel和他们的 x86 帝国。

索尼一直在改造现有的廉价 MIPS 核心,在降低成本的同时实现可接受的3D性能,这一流程同时涉及到 LSI(负责了 PS1 的 CPU)和东芝(负责了 PS2 的 Emotion Engine)这样的公司。 这个方法一直延续到 2004 年 PlayStation Portable 的发布。 那么,他们打算为 PlayStation 3 构造出什么样的新式 MIPS 混合体呢?

事实上,PlayStation 3 的开发早于 PlayStation Portable 。 在 2000 年,PS2 发布几个月之后,Sony 就和 IBM 与东芝的成立了名为 "STI" 的联盟,其唯一的目标就是研发下一代超级计算机的芯片 。 如果这听上去还不够奢侈,这枚芯片将会被用在 PS2 的继任者上。 最终,IBM 在2004年揭晓了这枚 Cell Broadband Engine(也被称为 "Cell BE" 或者直接就叫 "Cell")。

新的设计哲学

Image
CBE(Cell Broadband Engine,Cell宽带引擎)芯片 可惜我的相机拍不好。太亮了

为了理解 Cell 的_激进之处_,我们必须先深入了解当时(90 年代晚期 - 00 年代早期)困扰业界的几个问题。

消费者每年都在要求更快的速度, 一直如此。 但是,最新的解决方案(拉长流水线并提升主频)现在遇到了瓶颈。 Intel 的 NetBurst 架构进化到了极限,他们承诺的继任者也不见踪影。 同时,IBM 的 PowerPC 970/G5 也不能达成他们的 "3 GHz" 或是低功耗 CPU的承诺,也因此 Apple 没有发布搭载 IBM 最新一代的 CPU 的笔记本。 总而言之,看起来工程师们遇到了一个新的升级危机

因此,焦点转向了分布式计算。 换句话来说,提升单个机器性能遇到的困境,是不是能够通过让多个小机器分担来解决呢? 这个方案并不新鲜,细数我们分析过的所有主机,它们都包含了不止一个处理器。 然而,"多核心的单处理器"的出现为不限于主机的 CPU 设计指明了新的方向。

而 Cell,则正好是这波新研发浪潮的一部分。 这枚新 CPU 结合了一个对向量处理有特殊照顾的多核设计。 如果读者还记得的话,向量计算非常适合模拟运算(如物理、光照等),并且之前已经以几何变换引擎(Geometry Transformation Engine)向量单元(Vector Units)的形式出现过。但很快你就会明白,Cell 的设计相较于两者有多大的进步。

新的多核纪元

Image
异构设计示例。
迄今为止,这是许多功能强大的游戏机的事实上的架构

Image
同构设计示例。
每个内核都可以执行与之前相同的任务,但不必局限于这些任务

仔细想想,就会发现 PS1 的 CPU 和 Emotion Engine 已经是多核处理器了。 那为何 Cell 搞的如此大张旗鼓呢? 其实,之前两代芯片是由单个通用核心加上多个特定应用核心(例如音频处理器、图像解压缩器等)组成,它们混合了多种不同架构,其中通用核心负责指挥其他核心的工作。

这种 CPU 设计被称为异构计算,它一直是构建专门用于特定应用集(就比如游戏)的机器的事实标准。 与之相对应的同构计算在 PC 市场上更有优势,因为 PC 市场上的 CPU 需要支持各种相同的优先级的任务。 因此采用同构设计的CPU会包含多个同一类型的核心。

回到主题,Cell 整合了两种模式:它有两种类型的核心,一个通用"领导"和八个向量"助理"。 这些向量核心可以担任多种角色,解决需要使用异构计算处理的任务,且由于 Cell 的向量处理器并不局限于单一任务,这些核心提供了同构计算的灵活度。 总的来说,这种设计并不完美,而且会继承某些妥协点,但下文会让读者看到 Cell 如何解决不同的问题。

Cell 速览

解释完所有历史和理论之后,我认为我们已经准备好去回头看到这节的主人公。 这是 Cell ......

Image
Cell宽带引擎(Cell Broadband Engine)(PS3的变体)
IBM为超算和科研模拟设计。 划线的"SPE"表示禁用(不可用)。 左边的另一个"SPE"保留给操作系统使用。

......到这节的末尾时,读者将了解到每个组件的用途。

整体结构

Cell 运行在_超高的_ 3.2 GHz ,且由很多组件构成。 为了文章分析清晰起见,我们将它分为三个主要区域:

后续的内容会深入解析这些概念,所以读者并不需要记住这些名字。 本节的主要目的是让读者对 Cell 有一个大致的印象并熟悉一下所有我们将要讨论的组件。

我们如何进行研究

我们来梳理一下先前的架构,以防读者过载。 我们会以如下的顺序对每个组件进行研究:

  1. 用来连接各个组件的元件互联总线(EIB)。
  2. PowerPC处理元件(PPE)和它的核心PowerPC处理单元(PowerPC Processing Unit,简称PPU)。
  3. 主机可用的通用内存
  4. 协同处理元件(SPE)和它的核心协同处理元件(Synergistic Processing Unit,简称SPU)。
  5. 在 Cell 上高效编程的编程模型

闲话少说,让我们开始实际分析。

Cell的内部:心脏

Cell 自发布以来一直被称为片上网络(NoC)而不是传统的片上系统(SoC) ,这主要归结于 Cell 的非正统数据总线:元件互联总线(EIB)。 截至目前我们已经看到了CPU组件对内存的需求有多高一个系统对瓶颈能有多敏感。 为了解决这个麻烦问题,IBM这次换用了新的设计......并用类似于_道路驾驶_的术语撰写了文档。

Image
元件互连总线 (Element Interconnect Bus,EIB) 的简化图。
"坡道"(节点)之间的每个箭头代表两条单向总线,因此每个节点通过四个通道与下一个节点相连。

EIB 有 12 个被称为坡道(Ramp)的节点,每个节点都连接着一个 Cell 组件。 这些坡道通过四组总线内联,其中两组数据方向为顺时针,另外两组则是逆时针。 每一组总线(或者叫车道)有128位宽。 不同于单总线的拓扑结构(类似于 Emotion Engine 及其前身),坡道采用令牌环拓扑结构互联,这种结构中的数据包在到达目的地前需要通过路径上的所有邻居,没有直接路径。 因为 EIB 提供了四个通道,所以它有四条可能的路径(环路)。

读者可能会有疑问,相较于单总线结构,数据在令牌环拓扑结构中需要走更长的距离,那使用它的理由何在? 这主要原因是单总线非常容易受到阻塞的影响。 因此 EIB 的工程师决定采用这种结构来应对大量并发流量,后续内容会详细介绍令牌环的作用。

数据以128位数据包的形式进行传输。 在数据包没有重叠的情况下,每个环可以承载三组并发传输。 EIB 以命令信用(command credits)模式工作,具体来说,每当一个组件需要发起传输时,它就会给 EIB 里用于管理环内流量的数据仲裁器(Data Arbiter)发送一个请求。 当请求被批准的那一刻,数据包进入环中并接收一个"令牌(token)",数据仲裁器将其用作元数据来监督传输。 另外,部分组件,比如用于访问主内存的 MIC(Memory Interface Controller)会拥有比其他组件更高的优先级。 最后,数据仲裁器绝不会将路径长于半个环的数据包置入环内。

每个坡道都会参与传输,它们通过读取数据包目的地址来获知是否要将这个包的数据提供给自己连接的组件,还是要将它转发到下一个坡道。 在每个时钟周期内,坡道可以同时接收和发送128位(16 字节)的数据包。 所以,考虑到共有四个通道且 EIB工作在 1.6 GHz 上 (Cell 频率的一半),它的理论最大传输速率为 16 字节 x 2 次传输/时钟周期 x 4 通道 x 1.6 GHz = 204.8GB/s,当然,这个值高估了实际速度,因为还有很多额外的因素会影响到性能,例如从出发地到目的地的路径、总线的状态等等。 另外 IBM 和其他作者发表了很多论文,用实际的实验来推算更准确的传输速度。

现在,读者已经了解 Cell 是如何连接各个组件的,是时候好好看看这枚芯片的第一个组件了......

Cell的内部:领导者

我们来看看 Cell 的"主要部分"。 这是芯片上负责命令剩余部分的组件。 它的名字是 PowerPC 处理元件(PPE),你可以把视作 Emotion Engine 上的 MIPS R5900。

PPE 的结构

还记得之前我是如何将 Cell 拆分成不同区域的吗? 我们同样可以对 PPE 这么干。 IBM 使用"元件"(element)这个词来形容这个独立的机器,但在内部,我们需要使用"单元"(unit)这个词来区别开和 Cell 其他部分做通信的接口芯片区域。

Image
PowerPC处理元件 (PPE) 简化图。

在这个前提下,PPE _竟然_由两个部分构成:

如你所见,PPE (Cell 的其他部分也一样)的设计是相当模块化的,遵循了 RISC 设计的理念,你很快就会看到,这种模块化甚至在 PPU 内部也得到了应用。

PowerPC 处理单元

现在我们深入到 PPU 的内部。 但先回顾一下,我们已经深入 Cell 内部,然后是 PPE 的内部,现在到了 PPU 的内部。 我们将像分析其他 CPU 那样分析 PPU。

熟悉的架构

首先,PPU 部分不是全新的,而是现有 PowerPC 技术的重新利用。 但是不同于前几代主机上 IBM 直接拿现有处理器做小幅升级来满足新需求的做法,PPE 没有基于现有的 CPU 设计。 相反,IBM 根据 2.02 版的 PowerPC 规范 (更名为"Power 指令集"前的最后一个 PowerPC 规范版本)构建了一个新的 CPU。 总之,尽管它的机器码和其他 PowerPC 芯片一样,但当时市面上并没有与 PPU 一样的设计。

那么,为什么 IBM 选择了 PowerPC 来开发高性能芯片呢? 在当时,PowerPC 是一个经过 Macintosh 用户测试和迭代了约10年的成熟平台 ,它能够满足索尼所有的需求,且适应不同的环境。 同时,使用常用架构可以复用现有的编译器和代码库,这对于一台新主机来说是巨大的起步优势。

值得一提的是,IBM 其实是第一枚 PowerPC 芯片的共同开发者之一,另外两个是 Motorola 和 Apple(也就是AIM 联盟)。 但是在00年代初期的时候,所谓的联盟已经分崩离析,当时 Motorola/Freescale 开发了与 IBM 所不同的 PowerPC 系列。

独特功能

PPU 和 PowerPC 970(Apple 称之为_ G5_) 有一些历史渊源,两者都是 POWER4 的后代,POWER4 作为 PowerPC 前身主要用于工作站和超级计算机。 稍后的模块化执行单元会更明显地展示这点。 它相较于 GameCube 上的 750 系列 CPU有着根本性的变化,后者主要归功于 Motorola ,IBM 只是做了小幅改动。

回到主题,PPU 是一个完整的64位处理器。 这意味着:

最后,PPU 实现了 2.02 版 PowerPC 指令集,包括可选的浮点平方根操作码 。 它还扩展了一组名为向量/单指令多数据流多媒体扩展(Vector/SIMD Multimedia Extension,简称 VMX)的SIMD指令。 但 PPU 同样缺少了一些原版规范的内容,比如小端模式以及少数几个操作码,实际上,Cell只支持大端模式。

PPU的基础元件

透过"微观视图",我们能观察到PPU这个单元由不同的模块或子单元组成,它们执行独立的操作(从内存中加载值、执行算术运算等)。 PPU的能力由各个模块的能力来决定:

指令

Image
指令单元(IU)的简化图

头一个模块被称为指令单元(IU),顾名思义,它从L2缓存中提取指令,并向其他单元发出信号以执行所需的操作。 正如同时代的i686指令集,一部分指令集会被微码(指令单元为此用途集成了一小片ROM)做进一步解释。 最后,指令单元还包含了32KB的L1指令缓存

指令经过一个12级流水线发射,不过在实际中,总流水线数会根据指令类型存在比较大的变化。 例如,分支预测单元将会跳过绝大部分。 如果将指令单元和邻近的单元组合起来,总的流水线级数接近24级(对,这是个很大的数字,但请记住Cell跑在3.2GHz)。

比较有意思的是,指令单元是双发射的:在一些情况下,指令单元可以同时发射最多两个指令,这将大大提升吞吐量。 不过在实际中,双发射需要比较多的条件才能触发,所以程序员/编译器将负责优化程序以便他们的指令队列可以利用到这个功能。 顺带一提,双发射在以前的CPU上已经被实现了,当然,它在不同CPU供应商那儿的定义不一样,这里我使用了IBM的定义。

此外最重要的是,指令单元是多线程的,意思是它可以同时执行两个不同的指令队列(叫做"线程")。 在幕后,IU 只是在每个周期交替使用两个线程,给人一种多线程的感觉。 这项技术之前被称为"同步多线程(SMT)",或后来Intel创造的名词_超线程_。 不过,IBM的多线程技术还是减轻了它带来的诸如流水线冒泡的不良影响,因为CPU不会因为一条指令的阻塞而被迫停顿。 为了实现多线程,IBM的工程师复制了指令单元的内部资源,其中包括通用寄存器(之前我说过有32个可用的寄存器,那只是单个线程的。 实际上,它一共有64个!),不过在PowerPC规范之外的资源(诸如L1和L2缓存;还有接口),仍然是共享的。 因此,后者仍然是单线程的。

总的来说,将双发射和双线程整合在一起,PPU可以在单个周期内执行多达4个指令。 即便这只是一个"最佳场景",但它确实提供了优化的机会,用户最终会在游戏帧率上注意到!

内存管理

Image
存-取单元(LSU)和它的邻居的简化图

以下模块赋予PPU执行存-取指令和内存管理的能力。

首先,访存单元(Load and Store Unit,简称LSU)执行"读取"和"存储"这两个由32KB L1缓存支持的操作码。 因此,这个单元有权直接访问内存和寄存器。

此外,LSU与内存管理单元(MMU)耦合,这在当今硬件中很常见。 长话短说,MMU通过一个结合了内存保护虚拟地址映射表处理地址翻译。 为了改善后者,该MMU特别配备了一个段单元,它使用称为"段"的范围对内存地址进行分组。 现在,为了防止在此过程中出现性能下降,还包括一个转译后备缓冲区(TLB)(缓存转换后的地址)和一个段后备缓冲区(SLB)(缓存段)。

算术

Image
运算单元简化图

PPU还有两个单元需要说明,它们是计算游戏所需的数学运算单元。

第一个是传统的定点整数单元(Fixed-Point Integer Unit,FXU)。 它执行整数运算,如除法、乘法、位旋转(与位移类似,但丢弃的位会返回到另一端)和前导置零(例如,对顶点坐标进行归一化时非常有用)。 它的流水线长达11级。

从图中可以看出,FXU、LSU和MMU被归为一个单元,称为执行单元(Execution Unit,XU),这是因为它们共享同一个寄存器文件。

第二个单元更有意思,它是矢量/标量单元(Vector/Scalar Unit,VSU),用于执行浮点数和矢量操作。 它由一个64 位FPU(遵循IEEE 754标准)和一个矢量/SIMD多媒体扩展单元(Vector/SIMD Multimedia Extension unit,VXU)组成,后者执行一组名为_VMX_的SIMD指令。 VMX 可将 128 位向量从 16 个 8 位值转换为 4 个 32 位值 。 你可能以前听说过这种扩展,因为 "VMX" 是 IBM 对摩托罗拉所谓 "AltiVec" 或苹果所谓 "Velocity Engine" 的称呼(商标万岁)。 相反,Cell的竞争性SIMD功能是在另一种处理器上实现的,所以现在还不要放松警惕!

包装PPE

您刚刚看到了PPE的工作原理和构成,但它对开发人员意味着什么呢?

毕竟,PowerPC处理元件只是一个通用处理器,但问题是:它并不是单独工作的。 还记得宽主总线(EIB)吗? IBM设计PPE的目的是让工程师将它与其他处理器结合起来,以加速特定的应用(如 HPC、3D图形、安全、科学模拟、网络、视频处理等),由于本文是关于 PlayStation3的,你会发现Cell的其他部分都是以计算机图形和物理为中心的,因此,本文的其他部分也反映了这一目的。

Cell之外:主内存

现在让我们暂时跳出Cell,因为如果没有适当的工作空间(内存)来让它工作,PPE再好也没有用。

因此,索尼在主板上安装了256 MB XDR DRAM... ...但是,_这又意味着什么呢?_要回答这个问题,我们需要了解内存块的工作原理以及它们与Cell的连接方式。

Image
Cell旁边是四个64 MB XDR DRAM芯片。

首先,所配备的内存类型被称为极限数据速率(Extreme Data Rate,XDR)。 你可能会认为XDR DRAM是任天堂64PlayStation 2中的_倒霉的_RDRAM的后继者。 但先别急着下结论!

Rambus和其他公司一样,也会对自己的发明进行改进。 他们的第三次修订版(XDR)现在可以八倍速率运行(是对手 DDR DRAM 的四倍)。 延迟不再是个问题,如果我们看一下制造商的数据表,XDR的延迟在28ns到36ns之间,几乎比第一代RDRAM芯片快10倍

PlayStation 3的第一版主板包含四个64 MB芯片,成对使用。 XDR通过两条32位总线与Cell相连,每对内存芯片上有一条总线。 因此,每当PPU写入一个字(64位数据)时,就会在两个XDR芯片之间进行分配。 后者的时钟频率为400 MHz。

Image
Cell 的内存架构图

Cell通过内存接口控制器(Memory Interface Controller,MIC)与XDR芯片连接,MIC是Cell 的另一个组件(与PPE类似)。 此外,MIC还能对内存传输进行缓冲,以提高带宽,但它有一个很大的限制:大字节对齐。 从本质上讲,MIC传输的最小数据大小为128字节,这对于顺序读取或写入非常有效。 但如果数据小于128字节,或者需要交替写入和读取,性能就会受到影响。

这么说,MIC到底是瓶颈还是加速器? 你必须正确看待这个问题,带宽优化在数据饥渴型系统中至关重要。 在过去,我们已经见过写入收集管道回写缓冲区等解决方案,因此MIC只是针对一个反复出现的问题提出的新建议。 索尼宣称其传输速率为25.6 GB/s,但实际上,最终的传输速率取决于太多因素(你已经看到在Cell内将数据从一个地方移动到另一个地方是多么复杂)。

主内存就到此为止,但其他地方还有更多内存:硬盘。 PS3还允许游戏使用内部硬盘中的2 GB作为工作区(与初代Xbox提供的功能类似)。

Cell内部:助手们

我们已经看到,索尼公司总是在提供通用处理器(本例中为PPE)的同时提供加速器,以达到可接受的游戏性能(PS2为VPU和IPU;PS1为GTE和MDEC)。 这是游戏机硬件的常见做法,因为通用型可以执行各种任务,但并不专精于任何方面。 游戏机只需要一个子集的技能(例如物理、图形和音频),因此协处理器能使它们完成任务。

[PPE]是为了降低功耗而精简的版本。 因此,它并不具备奔腾4所具备的马力(......)。 如果你把今天在英特尔或AMD(不管你的处理器是什么)上运行的代码拿到Cell上重新编译,它今天就能运行——也许你得改一两个库,但今天就能在这里运行,没问题。 但速度会慢60%甚至50%,所以人们会说:"OMG! 这个Cell处理器太废物了!" 但那是因为你只用了那一块部分(PPE)

——IBM TJ沃森研究中心 Cell解决方案部经理 Michael Perrone博士

PS3 的 Cell 中包含的加速器是协同处理器元件(Synergistic Processor Element,SPE)。 Cell包括8个SPE,但其中一个在游戏机启动时被禁用。 这是因为芯片制造需要极高的精度(Cell最初使用的是90nm制造工艺),而机器并不完美。 因此,Cell并没有丢弃缺陷率小于10%的电路,而是加入了一个备用SPE。 这样,如果其中一个出现缺陷,整个芯片就不会被丢弃。 现在,备用SPE将始终处于停用状态,无论它是否正常(索尼不可能在市场上有两种不同的PS3)。

协同处理器元件的组成

继续往下看,协同处理器元件(SPE)是Cell内部的一台独立小计算机,由PPE指挥。 还记得我之前解释过的关于采用同构计算元件的问题吗? 这些协处理器具有一定的通用性,并不局限于单一应用,因此只要开发人员能正确编程,它们就能协助完成各种任务。

Image
协同处理器元件(SPE)简图,Cell内有八个这样的元件(其中一个已禁用)。

就像我们在PPE上所做的那样,我们来看看SPE。 由于篇幅较短,如果您想了解更多有关 SPE 的信息,请查看文章末尾的"资料来源"部分。 既然如此,让我们开始吧......

SPE是一种与PPE结构类似的处理器,由两部分组成:

内存流控制器

内存流控制器(Memory Flow Controller,MFC)是将内核与Cell其他部分互连起来的模块,相当于PPE中的PowerPC处理器存储子系统(PowerPC Processor Storage Subsystem,PPSS)。 MFC的主要任务是在SPU的本地内存和Cell的主内存之间移动数据,并保持SPU与其相邻内存同步。

为了履行职责,MFC内嵌了一个DMA控制器,用于处理EIB与SPU本地存储器之间的通信。 此外,MFC还包含另一个名为协同总线接口(SBI)的组件,它位于EIB总线和DMA控制器之间。 虽然这是一个非常复杂的电路,但它基本上可以解释从外部接收到的命令和数据,并向SPE的内部单元发出信号。 作为Cell的 "前门",SBI有两种工作模式:总线主控模式(SPE可从外部请求数据)或总线从属模式(SPE可从外部接收指令)。

一个奇怪的事实是,考虑到EIB数据包的限制(最长128位),MFC的直接内存访问块每个周期最多只能移动16 KB的数据,否则,EIB会在执行过程中抛出"总线错误"异常。

协同处理器单元

协同处理器单元(Synergistic Processor Unit,SPU)是SPE中核心处理器所在的部分,相当于我们所说的PPE中的"PPU"。

与PPU不同,SPU与Cell的其他部分是隔离的。 因此,PPU和其他SPU之间没有共享内存。 相反,SPU包含用作工作空间的本地内存。 不过,本地内存的内容可以通过MFC来回移动。

就功能而言,SPU比PPU受到更多限制。 例如,SPU不包括任何内存管理功能(地址转换和内存保护),甚至不包括最先进的功能(即动态分支预测)。 尽管如此,它在矢量处理方面却表现出色。

在对该单元进行编程时,开发人员使用PPU调用PlayStation 3操作系统提供的例程,这些例程将专门为SPU编写的可执行文件上传到所选的SPU,并向其发出开始执行的信号。 之后,PPU会保留SPU线程的引用,以实现同步。

SPU的结构

与其他CPU一样,协同处理器单元(SPU)也使用指令集架构(ISA)进行编程。 SPU和PPU都采用RISC方法,但SPU的ISA与PPU不同(PPU采用PowerPC ISA),它是专有的,主要由SIMD类型的指令集组成。 因此,SPU具有128个128位通用寄存器,可容纳由32/16位定点或浮点数值组成的向量。 另一方面,为了保护内存,SPU 指令的长度更短,只有32 位。 第一部分包含操作码,其余部分最多可以引用三个操作数进行并行计算。

这与之前在PS2上首次亮相的矢量浮点运算单元非常相似,但从那时起已经发生了很大变化。 例如,SPU不需要开发人员学习新的专用汇编语言——IBM和索尼提供的工具包可以使用C++、C或汇编语言对SPU进行编程。

在设计方面,这款处理器并不使用同一个单元来执行所有指令,而是将指令的执行分为两个区块或"执行流水线",一个称为奇数流水线,另一个称为偶数流水线。 这两条流水线执行不同类型的指令,使SPU在可能的情况下每个周期发出两条指令。 另一方面,SPU绝不会同时发布相互依赖的指令,从而减少可能出现的数据冒险

现在让我们来看看这两条流水线:

奇数流水线

Image
奇数流水线简图

奇数流水线执行除算术指令外的大部分指令。

首先,你会发现SPU存/取单元 (SLS) 有三个基本功能:

注意只有256 KB可用来存储程序。 考虑到SPU程序可以使用C/C++编译,要预测二进制文件的大小并不容易。 因此,建议开发人员假定只有一半的可用内存(128 KB),这就为编译后的代码留出了足够的空间,使其可以根据需要占用尽可能多的空间,但这是以牺牲存储空间和效率为代价的。

最后,还有一个SPU通道和DMA传输(SSC)单元,内存流控制器利用它来填充和/或获取本地内存,以及一个_微不足道_的定点单元,它只能进行数据重排(shuffling)和矢量旋转。

偶数流水线

Image
偶数流水线简图

偶数流水线的显著特点是其算术功能。

这里有一个_真正的_定点单元(FXU),可执行基本算术、逻辑运算(与、或等)和字移位。

最后是浮点运算单元(FPU),可执行单精度(32位float)、双精度(64位double)和整数(32位int)运算。 它遵循IEEE标准,但有一些偏差(浮点运算行为与PS2类似)。

Cell内部:编程风格

当我们到达Cell的尽头时,你可能会问,开发人员该如何为这个_怪物_编程呢? 与之前为EE设计的编程模式类似,IBM提出了以下方法:

以PPE为中心的方法

Image
多阶段模式的示意图,其中PPE分配一个任务,该任务在每个SPE之间传递,并最终与处理过的数据一起返回。

Image
并行模式的表现形式,即PPE为每个SPE分配一个子任务,然后每个SPE返回处理过的数据,PPE再将其合并。

Image
服务模式展示图:PPE为每个SPE分配不同的任务,每个SPE单独完成任务。

以PPE为中心的方法是一套编程模式,它将主要责任放在PPE上,让SPE来卸载工作。 有三种可能的模式:

以SPE为中心的方法

Image
以SPE为中心的模式的示意图,即每个SPE负责自己的功能,只在获取资源时与PPE交互。

这与使用SPE为PPE服务的方式正好相反。 利用内部DMA单元,SPE获取并执行存储在主内存中的任务,而PPE则仅限于资源管理。

这种模式比其他模式要激进得多,因为以前的模式更接近于传统的、类似于PC的"带协处理器的通用处理器"模式。 因此,实施以SPE为中心的算法的代码库可能较难移植到其他平台。

结论

可以想象,虽然Cell的多核设计可以加速过程生成等新兴技术,但这些设计的实现都不是特别简单,尤其是考虑到游戏工作室更喜欢可以在不同平台上共享的代码库。

举个例子,虚幻3引擎 的开发商(Epic Games)在尝试实现其碰撞检测系统时,就证明了SPU的局限性。 他们的设计依赖于二叉空间分割(Binary Space Partitioning,BSP),这是一种非常依赖于比较(分支)的算法。 由于SPU无法像PPU那样提供动态分支预测,因此在与其他平台(即Xbox 360i686 PC,这两种平台的所有内核都提供一致的预测技术)横向对比时,他们的实现让PlayStation 3用户感到失望。 因此,Epic Games不得不采用仅与Cell兼容的进一步优化手段。

我想,对于软件工程师来说,要想充分发挥Cell的潜力,需要的只是时间、耐心和大量的学习。 然而,历史证明,这并不是每个工作室都能做到的,这让我不禁怀疑,这是否就是当前游戏机硬件(截至2021年)同质化如此严重的原因。


Previous: 2. 快速介绍

Next: 4. 图形


Rodrigo Copetti © 2026 RSS Feed

切换至现代版

主页 · 文章 · 支持 · 关于作者 · 关于此网站