在SGI在图形市场失去主导地位之后,任天堂需要寻找新的合作伙伴。
一个很有希望的候选者是IBM:除了他们在大型机上的著名工作之外,他们最近还与摩托罗拉和苹果联手,创建了一个强大的CPU,足以与英特尔在PC市场的主导地位竞争。 这个合作的结果是一系列名为PowerPC的处理器,这些处理器被选中用于驱动99%的苹果Macintosh电脑、IBM的工作站和一些嵌入式系统。

PowerPC架构的Gekko芯片。 这就是GameCube所采用的处理器
为了理解这对GameCube意味着什么,我们首先来看看最终导致了PowerPC CPU的诞生的一系列创新。
PowerPC的起源
IBM是推动新兴RISC CPU设计进入主流市场的三大早期力量之一。 在80年代,当伯克利大学忙于开发"RISC CPU",而斯坦福大学的学者们刚刚创立MIPS时,IBM已经生产了801和ROMP CPU。 这些是具有开创性但在商业上并不成功的芯片,它们实现了一系列后来被称为"RISC模型"的指导原则。
商业里程碑
进入90年代,IBM再次尝试,推出了一系列新的UNIX工作站,名为"IBM RS/6000",并在其中内置了一种新的内部RISC CPU:POWER1。 POWER1专注于指令级并行,具有吸引人的先进特性,如:
- 一个完整的32位指令集,称为POWER指令集。
- 一个64位浮点单元。
- 哈佛缓存架构,这种架构将数据空间和指令空间分离,以增加带宽。
- 通过将其分布在三个独立单元(分支、定点和浮点)上,能够同时执行两个指令。 因此,POWER1被认为是一种双路超标量处理器。
- 静态分支预测,它将控制冒险转化为加速执行的机会。
- 通过寄存器重命名,实现浮点操作的乱序执行。 总的来说,这大大增加了CPU每单位时间执行的指令数量(并处理了数据冒险)。
- 核心设计源自IBM的大型机时代,当时它以Tomasulo算法的形式发布,并随后在IBM System/360(1966年)上实现。 通过POWER1,IBM成功将其部分技术带到了工作站设备上。
然而,POWER1 CPU是一个由多个芯片组成的大而昂贵的包。 因此,在接下来的尝试中,IBM将其设计缩小,以适应单个芯片。 虽然仍然遵循POWER指令集,但代价是采用了32位浮点单元、冯·诺伊曼缓存架构,并恢复到顺序执行。 这个新的芯片被称为RISC单芯片(RISC Single Chip,"RSC"),并与他们的RS/6000工作站的低端系列一起出货。
面向普通用户
在IBM开发这些技术的过程中,他们还同意与苹果和摩托罗拉联手,共同对抗英特尔-微软在桌面市场的垄断,形成了AIM联盟。 因此,一个新的项目应运而生,旨在低端市场中打造一个具有竞争力的CPU。 这个项目将融合三家公司提供的知识产权,包括:
- IBM的RSC处理器设计。
- 摩托罗拉的总线架构(在他们的内部RISC处理器Motorola 88110中找到)。
- 苹果和摩托罗拉对终端用户需求的了解。
摩托罗拉88110团队的一员,Keith Diefendorff,被招募为首席架构师,并在1993年,产生了下列的项目最终成果:
- PowerPC指令集:POWER的一个子集,增加了乘法指令,支持对称多处理器设置和可选的64位模式。
- PowerPC CPU,一个新的桌面CPU系列,开始于PowerPC 601。 这是RSC微架构的成本效益版本。
- 摩托罗拉也完全放弃了88000 CPU的开发,转而专注于这个新系列。
PowerPC的流行
为了确保新系列既在技术上具有竞争力,又在商业上可行,PowerPC 601试图将某些指令级并行的先进技术带给大众,其中值得一提的包括:
- 实现了POWER和PowerPC两种指令集,以帮助POWER开发者过渡到PowerPC。
- 采用三路超标量执行,使用三个独立的执行单元(FPU、分支和ALU)。 这比以前的设计有所改进。
- 基于摩托罗拉的设计,一种新的总线设计被称为总线接口单元(Bus Interface Unit),提供:
- 一个64位数据总线和32位地址总线,前者对于利用超标量能力至关重要。
- 突发传输(Burst transactions),允许用单条指令传输32字节内存(L1缓存的大小)。
- 内存管理单元(MMU),在同一封装中提供虚拟内存。
对于终端用户来说,这个新的CPU现在可以在IBM的低端RS/6000系列和苹果的新系列Macintosh电脑"Power Macintosh"中找到。
当代产品
PowerPC 601旨在为PowerPC系列积累势头,但在接下来的几年中,微架构经历了动荡的变化。
各自发展
601一上市,摩托罗拉和IBM就决定分别开发后续一代。 这意味着将是一个完全独立的PowerPC实现,不再包含任何POWER ISA的元素,并形成两个不同的产品系列:
- 低端的PowerPC 603由摩托罗拉领导开发,面向便携式市场。 为此,它提供了一个较小的L1缓存(现在基于哈佛架构),两个额外的执行单元,并且不支持多处理器。 这些设计决策导致整体消耗率为1.8-2.0瓦。
- 高端的PowerPC 604由IBM领导开发。 以高昂的价格和高功耗(14.5-18.5瓦)为代价,它提供了先进的并行能力(类似于MIPS),如4发射执行,恢复了乱序执行,动态分支预测和多处理器支持。
尽管603应该因其电源效率而脱颖而出,但现有的商业应用程序最终掩盖了其能力。 例如,苹果的软件架构仍然依赖于模拟68000指令,这被603的小缓存大小限制住了。
顺便提一下,IBM开发的PowerPC 4xx系列原本是作为微控制器解决方案,而非桌面CPU。 这些芯片配备了小型缓存,并且没有包括像MMU和FPU这样的复杂模块。 不过,这个系列提供了可定制封装,以便根据制造商的需求进行适配。 尽管如此,虽然4xx系列对本文主题而言并非重点,但值得注意的是,一个知名的竞争对手曾采用该系列来处理一些次要任务。
再次合作
然而,最终结果表明,第二代的桌面PowerPC芯片在成本上要么过高,要么在性能上无法与英特尔的处理器竞争。 因此,苹果让IBM和摩托罗拉再次合作,推出了一个新一代的统一设计,将两者的优点结合起来。 节能的603被选为新型设计的基础。 为了改进这个基础,采取了某些决策:
- 通过提供更大的缓存和高内存带宽来克服其局限性。
- 结合604的设计理念,如动态分支预测和乱序执行(目前仅限于内存操作)。
- 实现新的增强功能,如额外的ALU以实现更大的并行性。
这成为了750系列,被苹果作为PowerPC G3推广。 从那时起,IBM和摩托罗拉继续致力于750系列的变体和增强。 这些改进主要集中在更高的时钟速度、更大的缓存和更小的制造工艺。
有趣的是,总是最节能的CPU能够经受住开发动荡的考验,这一点后来也被其他公司(MIPS、英特尔和ARM)所证实。
乐队解散
随着时间的推移,这三家公司之间的距离越来越远。 在PowerPC G3发布两年后,摩托罗拉独自推出了一个名为7400的新系列(苹果将其命名为G4)。 这个系列的特点包括:一个64位浮点单元;一个更快的总线架构,称为"MPX";一组称为"Altivec"的SIMD指令。 尽管它在桌面市场很受欢迎(这要归功于苹果),但IBM只专注于其专属的POWER CPU系列。
几年后的2003年,摩托罗拉最终放弃了CPU业务,并剥离了其半导体部门,导致飞思卡尔公司的成立。 后者对开发PowerPC芯片也不感兴趣,因此AIM联盟走到了尽头。 尽管如此,苹果仍然需要新的CPU,因此IBM通过缩小其POWER4设计,继续了继承线,推出了PowerPC 970 CPU(也称为"G5")。
这就是历史部分的结束。 现在,是时候来看看GameCube的独特CPU了(它位于750/G3和7400/G4之间)。 从现在开始,我将专注于GameCube硬件,但如果你对这个插曲感兴趣,你可能会想接下来阅读PlayStation 3、Xbox 360和Wii U的研究。
PowerPC Gekko芯片
回到2001年,任天堂需要一款既强大又便宜的处理器。 为了满足这些要求,IBM采用了其过去的一款设计,一个增强版的G3,称为PowerPC 750CXe(可以在2001年初夏发布的晚期iMac G3中找到),并对其进行了加强,增加了游戏开发者会喜欢的能力。 结果就是PowerPC Gekko处理器,主频为486 MHz。
让我们来看看是什么让Gekko如此特别,为了做到这一点,我们首先需要了解750CXe的特点。 现在,回顾了PowerPC的历史,你可能会发现很多信息与之前的设计重叠(这就是这些研究的目的!)。 话虽如此,750CXe提供了:
- PowerPC指令集架构:这一点不足为奇。 唯一额外的信息是750CXe实现了v1.10规范。
- 外部64位数据总线:正如你之前所看到的,虽然ISA可以适应32位总线,但我们仍然需要在不降低性能的情况下移动更宽的数据块。
- 三发射超标量:如果所需的单元可用,CPU可以在管道的同一阶段处理多达两个指令。 如果队列中包括分支指令,可能同时处理的指令数量增加到三个。
- 乱序执行:CPU可以重新排列指令的顺序,以使其所有单元都保持工作状态,从而提高效率和性能。
- 两个整数单元: 与超标量和失序模型相结合,可增加单位时间内完成的整数运算次数。
- 拥有32位和64位寄存器的集成浮点运算单元:加速浮点数和双精度浮点数操作。
- 四级流水线(带有额外的优点): 这里是先前有关指令流程的简介。 在750CXe中,浮点运算被分为三个更多的阶段(总共7个阶段),而装载存储操作被分为两个阶段(总共5个阶段)。
- 总的来说,这增加了指令吞吐量,而不会失控.
此外,该CPU还包括专用单元,可加快特定计算速度:
- 分支预测单元: 每当需要评估一个条件(这个条件会决定CPU是否应该选择路径'A'或路径'B') 时,CPU会根据先前的执行情况选择其中一条路径,然后再评估条件。 如果预测正确,CPU会节省一些时间;如果不正确,它将会回退并按照正确的路径执行。
- 专用存-取单元: 它将操作寄存器的单元与处理主存储器的单元分开。
- 集成内存管理单元(MMU): 将来自CPU的所有内存访问进行接口处理。
- 以前的游戏主机在制造上包括这个组件作为另一个协处理器,而现在MMU已经集成在同一芯片内,从而降低了制造成本。
当然,还包括了一些高速缓存以加速内存带宽:
- 64 KB一级高速缓存(L1 cache): 分为32 KB的指令缓存和32 KB的数据缓存。
- 256 KB二级高速缓存(L2 cache):它可以装载指令和数据,这大大提高了带宽。
IBM的改进
虽然之前列出的特性受到很高评价(与之前的一代相比),但这款CPU在游戏性能方面仍然落后于其他处理器(不要忘记这仍然是一款通用用途的CPU,在处理电子表格方面表现出色,但在物理运算方面一般)。 为了弥补这一点,IBM添加了以下的调整来构建Gekko处理器 :
- 增强的指令集,包括50条新的SIMD指令:这些指令可以在一个周期内操作两个32位浮点数或一个64位浮点数。 因此,新的SIMD指令将加速向量计算,特别在几何变换过程中非常有用。
- 32位浮点寄存器:这些浮点寄存器与新的SIMD指令一同引入。
- 写入汇集管道: 可用的特殊内存写入机制。 如果启用,它不会执行单拍(single-beat)传输,而是将所有内存写入请求保存在 128 位字节的缓冲区中,直到缓冲区满25%,然后使用一种称为突发传输(burst transaction)的技术执行写入请求,这种技术可以一次性移动32字节的数据块。
- 正如您可以想象的那样,通过充分利用可用的总线,这可以节省大量的带宽。5
- 锁定的L1缓存: 程序可以占用16 KB的L1数据缓存用作"暂存区"(极快速的内存)。
除了处理游戏逻辑(物理、碰撞等)外,这些增强功能将使CPU能够以可接受的性能实现图形流水线的某些部分(几何变换、光照等)。 这非常重要,因为GPU只能加速有限的一组操作,因此最终的结果不受GPU的限制所制约。
是进步还是退步?
在您的N64的文章中,您提到该系统有一颗64位的CPU,但GameCube的CPU是32位的。 Nintendo是否降级了他们的游戏机呢?
事实上,Gekko实现的是32位PowerPC规范,而MIPS R4300i可以在32位和64位模式之间切换。 要回答这是否是一种改进,您需要问自己一个问题:为什么需要'64位'?
- 处理超过4 GB的内存->对于GameCube这种拥有有限内存位置的设备来说,并不是必要的。
- 操作更大的数据块并减少周期和带宽的使用->通过Gekko的新SIMD指令、64位FPU和数据总线以及写入汇集管道来实现的。
- 为了提出更多的宣传术语->是啊... 我觉得这已经不能说服人们了。
正如您所看到的,GameCube已经享受到了64位系统的优势,尽管它并没有被称为'64位游戏机'。 这正是为什么您和我不能仅通过'位数'来总结两台复杂的机器。
巧妙的内存系统
在设计下一代架构时,任天堂的架构师们对他们之前的设计进行了事后分析,并发现在使用统一内存架构以及一些高延迟组件(如RDRAM)时,导致了最大的瓶颈之一(几乎50%的CPU周期被浪费在空闲状态)。 此外,多个独立单元的加入也导致了对内存总线的竞争。
因此,GameCube的设计者提出了一种新的内存系统,严格基于提供专用内存空间和使用低延迟芯片。 采用新设计后,GPU和CPU将不再争夺相同的内存(导致填充率问题),因为GPU现在拥有自己的内部内存,而且速度惊人。 另一方面,GPU仍将负责对I/O的访问进行仲裁。
这样系统就有了两条主要总线:
- 北桥(Northbridge): 64位宽,连接CPU和GPU。 它的运行速度是CPU时钟的3倍,因此必须对任务进行优化,以减少对GPU的依赖。 DMA和高速缓存等其他组件可能会派上用场。
- 南桥(Southbridge): 它也是64位宽,将GPU与24 MB,称为"Splash"的1T-SRAM连接起来。 这种类型的RAM由DRAM(最常用的类型,但也更便宜、更慢)制成,但通过额外的电路进行了增强,使其表现得像SRAM(更快、更贵,主要用于高速缓存)。 总线速度是GPU的两倍,这可能是为了让GPU在CPU和主内存之间提供稳定的带宽。
此外,这种设计还包含一条额外的(但并不常见的)总线,可以在其中找到更多内存:
- 东桥(Eastbridge): 它将GPU与另一个名为音频RAM(Audio RAM,"ARAM")的内存芯片连接起来。 它提供16 MB的SRAM供一般用途使用,这对于备用内存来说是相当大的。 不过,总线不能通过正常方式(内存地址)访问。 相反,它连接到一个8位串行端点(时钟频率比GPU慢两倍,比CPU慢四倍),只能通过DMA访问。
总的来说,这意味着虽然ARAM提供了相当大的内存容量,但它将仅限于不那么关键的任务,如充当音频缓冲区或被某些配件使用(在I/O部分中解释)。
充分利用ARAM
到目前为止,我们已经看到,从纸面上看,该机的内存能力无疑优于前代产品,但仍有改进的余地。 例如,任天堂本可以安装更多硬件,将ARAM整合到 CPU 的内存映射中。
与此相关,我们再来看看Gekko中使用的MMU。 CPU采用32位地址总线,最多可访问4 GB内存,但系统中的内存却远远达不到这个数量。 因此,为了防止出现未填充(和不可预测)的内存地址,"虚拟内存"寻址被默认激活,用更安全、易缓存和连续的"虚拟"地址映射来掩盖物理地址。
为了实现这一功能,Gekko(以及其他PowerPC架构)通过以下过程将虚拟地址转换为物理地址:
- 执行块地址转换(Block Address Translation,BAT):有8对可编程寄存器(4对用于数据,4对用于指令),每对寄存器将一个虚拟地址范围映射到一个连续的物理地址范围。 如果在这些范围内找到物理地址,MMU就会尝试查找。
- 如果BAT不起作用,则读取页表: MMU还存储了一个表,用于编目页面(虚拟地址块)的物理地址。
- MMU读取页表可能需要一些时间,因此需要一个转译后备缓冲区(TLB)来缓存最近的读取。
- x86或MIPS等其他架构也提供分页功能,但并非所有架构都提供TLB。
- 最后,如果请求的虚拟地址仍然无法转换,那么MMU就会在CPU中触发"分页错误"异常,并让操作系统决定下一步该怎么做。
那么,这对开发人员有什么用呢? 原来,任天堂发布了一些库,可以在分页的帮助下使用ARAM扩展主RAM。 简而言之,ARAM是不可寻址的,但CPU可以调用DMA从ARAM中获取和存储数据。 因此,CPU可以将页面从主RAM中移出,为其他资源腾出空间,并将其暂时存储在ARAM中。 之后,每当发生页面故障时,操作系统包含的一些例程就会用于查找ARAM中丢失的页面,并将其恢复到主RAM中的原始位置。
总之,通过一些巧妙的技巧,这些通用功能使GameCube游戏能够享受比技术允许值更多的内存,从而达到更高的质量水平。 不过,需要注意的是,这些技巧可能会带来一些性能损失(尤其是在想当然的情况下)。


