第 9 章
三核时代的架构整合
时间倒回两年,2004年秋天,华盛顿州雷德蒙德微软总部的一间会议室里,蒂姆·昂格尔把一块布满走线的绿色PCB板放在桌上。他是Xbox 360硬件架构团队的核心工程师,这块板子是下一代主机的第一个可工作的原型主板,刚从实验室拿出来,上面还贴着几张黄色的温度监测贴纸。围坐在桌边的人来自三个不同的团队——微软的硬件架构组、ATI的GPU工程团队,还有Epic Games的两名高级工程师。
马克·赖因坐在靠窗的位置,他是Epic的副总裁,负责虚幻引擎3的商业授权和技术推广,但今天他的角色不同:他是带着《战争机器》开发团队的具体需求来的。会议桌中央摆着一台示波器和一台还在运行早期测试代码的Xenon处理器工程样片,风扇的声音压过了空调的低鸣。
这场会议的目的只有一个:在硬件设计冻结之前,让游戏开发者亲手摸到架构的边界。昂格尔开口时,先指向了主板中央那颗黑色封装的处理器。
他解释了三个核心和每个核心两个硬件线程的配置,然后停顿了一下,目光转向Epic的两位工程师。他需要Epic方面提供具体的数据——在物理计算和渲染线程并行运行时,什么样的内存延迟会直接导致帧率崩溃。
这不是一个抽象的技术问题,这是一个针对《战争机器》引擎架构的精确提问。
Epic在2004年夏天已经向微软展示了虚幻引擎3的早期技术演示。那个演示里有一组高度细节化的角色模型,每张脸的光照反射都是用像素着色器逐像素计算的。演示跑在一台用当时最高端的PC搭建的开发机上,帧率并不稳定,有时会跌到二十帧以下。
但微软的人看到了关键的东西:这个引擎对统一着色器架构的需求,几乎是量身定做的。
把时间拨回到2003年春天,微软的硬件规划团队还在面临一个根本性的选择。初代Xbox在全球卖出了两千四百万台,对比PlayStation 2的一亿五千五百万台,这个数字只能用惨淡来形容。
微软没有从初代Xbox的硬件上赚到一分钱利润,每卖一台机器亏损超过一百美元,总亏损额高达数十亿美元。
但比尔·盖茨和史蒂夫·鲍尔默在2003年做出的决定不是撤退,而是加速。他们看到的不是两千四百万这个数字本身,而是Xbox Live积累下来的在线服务基础设施和七百万付费用户。这些用户习惯了一个统一的身份系统、稳定的语音聊天和标准化的网络对战体验。当索尼还在为PlayStation 2的网络适配器单独销售时,微软已经把一个完整的在线生态铺到了北美和欧洲的客厅里。
这个生态是下一场战争的地基。但地基上要建什么样的建筑,取决于硬件架构的选择。
2003年夏天,微软硬件团队开始接触潜在的芯片供应商。初代Xbox使用的是英特尔奔腾III处理器和英伟达GeForce 3显卡,这两颗芯片都不是为微软定制的。奔腾III是一颗标准的x86处理器,和当时数百万台个人电脑里的芯片没有本质区别。
GeForce 3是英伟达当时最好的GPU,但它的固定功能管线设计直接限制了开发者能实现的图形效果——顶点着色器和像素着色器的比例是锁死的,芯片设计时英伟达就已经决定了多少晶体管分配给哪一种运算。初代Xbox的硬件架构,本质上是一台精简版的PC:CPU、GPU、北桥、南桥、独立的内存池,每个组件之间通过标准总线连接,系统延迟完全由PC的架构逻辑决定。
这不是为游戏机设计的,这是为兼容性设计的。微软在2003年面临的选择是清晰的:要么继续走PC组装逻辑的老路,用英特尔和英伟达的下一代PC芯片拼装出新的主机;要么彻底转向游戏机专用架构,从零开始定义一颗处理器和一颗图形芯片。前者的成本低、风险小、开发周期短,但会导致Xbox 360永远无法在性能上真正领先同时代的PC高端配置,更不用提索尼正在研发的PlayStation 3。
当时已知的情报显示,索尼与IBM和东芝联合开发的Cell处理器采用了全新的异构多核架构,理论浮点运算能力远超任何x86处理器。如果微软继续用PC芯片,那就等于在性能上提前认输。
转向专用架构的代价同样巨大。从头定制芯片意味着漫长的设计周期、高昂的研发成本,以及与芯片供应商之间复杂的知识产权谈判。
更重要的是,定制架构要求微软的硬件团队必须在芯片设计阶段就做出大量不可逆转的决策——核心数量、缓存大小、内存接口、总线带宽——而这些决策将直接限制未来五到八年内所有游戏开发者能在Xbox 360上做到的事情。如果他们选错了方向,整个世代的游戏阵容都会被一颗不合适的芯片拖入泥潭。
罗比·巴赫在2003年秋天的一次内部评审会上拍了板。他的理由不复杂:初代Xbox最大的教训之一,就是开发者被硬件束缚得太紧。
《光环:战斗进化》的成功恰恰是因为Bungie的工程师花了大量时间绕过硬件限制——他们把游戏数据从DVD光盘预加载到硬盘上以减少读取延迟,重新设计了内存分配策略以便在统一内存池中为纹理和几何体找到最佳比例,甚至牺牲了一部分分辨率来确保三十帧的稳定刷新率。但这些优化是工程师们在与硬件搏斗,而不是与硬件协作。
巴赫的结论是:下一代主机的硬件必须从第一天起就站在开发者这边。这条原则一旦确立,芯片选型的方向就变得清晰了。
IBM的芯片设计团队在2003年底向微软提交了第一个Xenon处理器的架构草案。这不是一颗从IBM现有的PowerPC产品线中摘出来的成品,而是一颗从头设计的游戏机专用处理器。IBM的设计师从PowerPC 970的指令集架构出发,但完全重新设计了核心的内部结构。最终定案的Xenon处理器包含了三个独立的处理器核心,每个核心支持双线程并发执行。
每个核心的主频锁定在3.2GHz,这个数字在2005年意味着单核性能已经追平当时最高端的桌面处理器,而三个核心加在一起的理论计算能力则远超任何消费级的单芯片产品。
但主频数字从来不是重点。Xenon真正的设计意图,是解决初代Xbox在多任务处理上的结构性瓶颈。初代Xbox的奔腾III只有一个核心,所有的游戏逻辑、物理计算、AI决策、网络通信、音频处理都必须在一个时间片内轮流争夺CPU资源。游戏开发者被迫在帧与帧之间的极其有限的时间窗口内,把不同类型的计算任务强行塞进一个线性队列。结果是每一帧的预算里,总有某一个环节成为短板:要么物理计算不够精细,要么AI的决策树被裁减到近乎愚蠢的程度,要么网络同步数据包的发送频率被压低到影响多人游戏体验的临界点。Xenon的三核设计直接针对这个痛点。
微软的硬件架构师们向IBM提出的指令是明确的:给开发者三个平等的核心,让游戏引擎可以独立分配物理、AI和渲染线程,不允许任何一个核心因为架构限制而成为瓶颈。
每个核心配备了自己的L1指令缓存和数据缓存,三个核心共享一个1MB的L2缓存。这个共享缓存的大小在当时是一个非常大胆的决策,它意味着芯片上大量的晶体管预算被投到了数据共享效率上,而不是核心本身的计算单元数量。
IBM的工程师在芯片设计阶段做过一个内部评估:如果把共享缓存削减到512KB,他们可以在同一块硅片上塞进第四个核心。但微软的团队否决了这个方案。增加第四个核心会提高开发者的线程调度复杂度,而扩大共享缓存可以直接降低核心之间的数据交换延迟,让已经存在的三个核心运行得更高效。
这是一个为游戏负载特性优化过的决策——游戏引擎的数据共享模式远比纯粹的浮点运算吞吐量更依赖缓存命中率。
当昂格尔在2004年秋天的会议上把Xenon的工程样片展示给Epic的工程师时,这颗处理器的设计已经基本冻结。
但会议桌对面的ATI工程师们带来的Xenos GPU,却是一个更加激进的赌注。ATI在2003年接到微软的合作邀请时,面临着与IBM类似的命题:他们需要提供一颗专门为游戏机设计的图形芯片,而不是从PC显卡产品线中改造出来的一颗衍生品。
当时的PC显卡市场正处于固定功能管线向可编程管线快速过渡的时期。ATI的Radeon 9700 Pro在2002年已经引入了可编程顶点着色器和像素着色器,但两者的硬件资源仍然是固定分配的——芯片上有特定数量的顶点处理单元和像素处理单元,两者的比例由ATI在芯片设计时根据当时的游戏负载特征预先设定。这个比例一旦确定,就不能在运行中被调整。如果一个游戏的顶点处理负载远超像素处理负载,那么顶点单元就会成为瓶颈,而像素单元则处于闲置状态,反之亦然。
开发者必须接受这个硬件比例,然后调整自己的图形技术以适配它。这正是微软要求ATI打破的束缚。
ATI的工程团队在2003年底拿出了一个代号为“C1”的架构方案,这个方案的核心是一项在当时还从未在任何量产芯片上实现的技术:统一着色器架构。C1芯片上不再区分顶点着色器单元和像素着色器单元,所有的着色器单元都是同一种可编程计算单元。芯片内部包含了四十八个这样的统一着色器,每一个都可以在任意一帧中执行顶点计算、像素计算或几何处理任务。一个硬件调度器负责根据当前帧的实际工作负载,动态地将任务分配给空闲的着色器单元。如果某一帧需要密集的顶点变换——例如一个包含大量角色动画和变形的场景——调度器可以把绝大多数的着色器资源分配给顶点任务。如果下一帧是近距离的特写对话场景,需要极其复杂的逐像素光照算法,调度器就可以把几乎所有的着色器单元转向像素任务。
这个设计的灵活性在当时是革命性的。但它同时也是一个昂贵的技术赌注。
统一着色器单元的复杂度远高于传统的固定功能单元,因为每个单元都必须能够执行所有类型的着色器指令,而不是专门优化过的单一类型指令。这意味着每个单元的晶体管数量更大,功耗更高,并且在四十八个单元之间维持一个高效的任务调度器本身就是一个巨大的芯片设计挑战。
ATI的工程师在设计调度器时面临着严格的实时性要求:调度决策必须在纳秒级别内完成,任何延迟都会直接表现为帧率的抖动。
ATI在当时为PC显卡开发的统一着色器架构——后来成为Radeon HD 2000系列——预计要等到2006年才能进入量产。C1的进度要求ATI在2005年夏天之前交付可量产的工程样片,这意味着游戏机芯片的技术节点比PC产品线整整提前了一年。
Epic的工程师们对这个架构的态度可以用一句话来概括:这正是他们需要的。虚幻引擎3的渲染管线在设计之初就假设了一个高度可编程的图形硬件环境。
引擎的材质系统允许每个像素执行极为复杂的着色器指令——法线贴图、高光贴图、环境反射、次表面散射模拟——这些计算全部消耗像素着色器资源。在同一帧里,角色动画驱动的顶点变换量同样巨大,《战争机器》中的Locust族士兵模型每个都包含数万个三角形,动态光照条件下每帧都要重新计算每个顶点的位置和法线。
在传统的固定功能GPU上,Epic的工程师被迫在顶点和像素资源之间做出痛苦的取舍:如果角色精度高,场景光照效果就必须妥协;如果追求复杂的材质表现,角色的几何细节就要被削减。
他们受够了这种选择。在2004年秋天的会议上,Epic的工程师带来了具体的数据。他们用一台搭载了早期Xenos工程样片的开发机运行了《战争机器》的一个测试场景——一片被战火摧毁的城市街区,地面和墙壁上有大量的法线贴图细节,几个角色模型在场景中移动,动态光源模拟爆炸后的火光闪烁。测试的帧率数据被投影到会议室的白板上。昂格尔看着那些数字,知道问题不只在GPU上。
测试场景的帧率波动范围很大,最低时跌到了二十帧出头。但瓶颈并不在GPU——Xenos的四十八个统一着色器还有相当的余量。瓶颈出现在Xenon处理器的内存访问延迟上。当游戏引擎同时进行物理碰撞检测和AI路径规划时,两个任务线程频繁争抢共享L2缓存的访问权,导致其中一个线程的数据被频繁踢出缓存,下一次访问时必须到主内存中去读取,延迟骤升。昂格尔的团队在会前已经预见到了这个问题,他们在原型主板上设计了更大的内存带宽,但光靠带宽无法弥补缓存未命中的代价。512MB的统一内存——这是微软在2004年做出的另一个关键决策,而这个决策在会议桌上引发了激烈的争论。争论的一方是微软内部的成本控制团队。他们的逻辑是清晰的:初代Xbox配备了64MB的统一内存,当时那个数字已经超过同时代PC的标准配置,但到了开发后期,Bungie的工程师仍然认为64MB不够用。
游戏需要更大的纹理缓存来支持高分辨率贴图,更大的帧缓冲来支持抗锯齿算法,更大的音频缓冲区来支持多声道环境音效。到了Xbox 360,分辨率从480p跳到了720p高清标准,纹理分辨率、模型细节和光照精度都呈指数级增长。开发者的需求很直白:他们需要至少512MB。争论的另一方是微软的供应链和财务团队。GDDR3内存是当时最昂贵的内存技术,2004年的每MB采购成本高得惊人。如果坚持用512MB,仅内存一项就会让每台主机的物料成本增加数十美元。考虑到初代Xbox每台亏损超过一百美元的惨痛教训,财务团队的担忧并非没有道理。巴赫的硬件团队在这场争论中站在了开发者一边。他们拿出的论据不是技术指标,而是初代Xbox的实际教训。初代Xbox虽然名义上拥有64MB统一内存,但硬件上内存被物理分区为两块——一块用于CPU访问,一块用于GPU访问。开发者不得不在两个区域之间手动管理数据搬移,而跨区的数据访问延迟高得令人沮丧。
Bungie的工程师后来在事后分析中写道,他们在《光环2》的开发过程中花费了大量时间编写自定义的内存管理代码,仅仅是为了把纹理数据从GPU内存区域中搬移出去,为帧缓冲腾出空间——这些时间本可以用来优化光照算法或增加更多的环境细节。如果想让Xbox 360真正实现从开发者角度出发的设计目标,就必须消除内存分区的概念。最终定案的512MB GDDR3统一内存,物理上是一块单一的内存池,CPU和GPU共享同一个地址空间。开发者可以自由分配内存,不需要关心哪一块内存属于哪个处理器。游戏引擎可以把大量的内存分配给高分辨率纹理,或者在物理计算密集的场景中把内存倾斜到碰撞网格和粒子系统上。这个设计消除了初代Xbox内存分区的结构性摩擦,但代价是主板布线的复杂度急剧增加。高速GDDR3内存的信号完整性对PCB走线长度有着近乎苛刻的要求,每条数据线的长度必须在极小的公差内保持匹配。
微软的硬件工程师在主板上采用了八层PCB设计,信号层和地层交错堆叠,以确保内存总线的阻抗受控。当昂格尔的团队完成第一版主板布线时,他们发现从Xenon处理器到内存颗粒的信号路径长度比初代Xbox缩短了将近百分之四十,但付出的代价是主板的设计密度达到了一个前所未有的水平。这个设计密度的副产品是热管理的噩梦。三核处理器、统一着色器GPU、GDDR3内存颗粒、南桥芯片、网络控制器——所有这些高功耗组件被压缩在一张主板上的狭小空间内,彼此之间的间距被压到了工程极限。散热团队在主板上布置了多个温度传感器,他们在2004年底到2005年初的测试中逐渐意识到一个严峻的问题:当Xenon处理器的三个核心同时满载运行、Xenos的四十八个着色器单元全速运转、内存控制器的数据吞吐量接近理论峰值时,主板上的局部热点温度可以飙升到超出安全阈值。传统的铝制散热片和单一风扇方案在这种热流密度面前完全不够用。
昂格尔在那次会议结束后的一个月里,与散热团队开了一系列紧急会议。他们测试了不同的散热方案——更大的铝翅片、铜芯热管、双风扇配置,甚至考虑过当时还极其昂贵的液态金属导热介质。每种方案都有自己的代价:更大的散热片增加重量和体积,铜材推高成本,双风扇意味着更高的噪音和更复杂的风道设计。最终他们选择了一种妥协方案:一个整体式的铜底铝翅片散热器覆盖处理器和GPU区域,配合一个大直径的离心风扇从侧面吸入空气,经过散热鳍片后从机箱后部排出。这个设计在实验室条件下可以把芯片结温控制在额定范围内——前提是环境温度和系统负载在预设参数之内。但实验室条件不是用户的客厅。娱乐中心的机柜通常是封闭或半封闭的,通风条件远不如测试台。Xbox 360的工业设计团队在设计ID外壳时追求的是垂直和水平两种摆放姿态下的视觉统一性,散热孔的面积和位置受到了外观的限制。
当散热团队把工程样机放进模拟的娱乐中心机柜进行封闭环境测试时,内部温度读数比开放式测试台高出了十几摄氏度。他们向管理层报告了这个发现,建议推迟发布以留出更多时间优化散热设计。但这个建议在2005年初的时间线上已经无法被采纳。2005年5月,微软在E3展前发布会上正式公布了Xbox 360的硬件规格。台上的演讲者逐一列举了数字:三核处理器、五百MHz图形处理器、五百一十二MB统一内存、二十GB硬盘、内置无线网络适配器。台下的游戏开发者和媒体记者对这些数字的反应是热烈的——这些规格在当时远远超过了任何一台消费级PC的综合配置。但那些坐在雷德蒙德办公室里的硬件工程师们知道,每一个数字背后都藏着一个未经用户在客厅中验证的风险。Xenon和Xenos的整合方案兑现了微软对开发者的承诺。当Epic的工程师在2005年下半年拿到了更接近最终规格的开发套件时,他们运行了《战争机器》的完整测试场景。
画面在720p分辨率下稳定运行在三十帧,动态光照、法线贴图、角色动画、环境破坏效果同时渲染在同一帧画面中。虚幻引擎3的材质编辑器不再需要因为硬件限制而简化着色器指令,《战争机器》中那些被战火侵蚀的建筑物墙壁上的每一道裂缝都是由像素着色器逐像素渲染的,而不是预先烘焙的静态纹理。这是统一着色器架构赋予开发者的自由:他们可以把所有四十八个着色器单元分配给材质计算,在保持角色精度不降低的情况下实现复杂的环境视觉效果。如果没有这个架构,《战争机器》的视觉冲击力将大打折扣。但同一批工程师也看到了代价。当测试场景运行超过一个小时后,开发套件的风扇转速会自动提升,噪音从低沉的背景音变成了尖锐的呼啸。温度传感器记录到的核心温度曲线稳定但偏高,如果环境温度再高出几度,风扇就必须全速运转才能维持系统稳定。这是封装在那块高度集成的绿色PCB板内部的真实物理极限。Xbox 360的硬件架构设计是一次以开发者需求为基准的精密整合。
三核处理器解决了多任务并行的瓶颈,统一着色器解除了图形管线的固定分配约束,统一内存消除了手动数据搬移的痛苦。每一项选择都服务于一个清晰的目标:让游戏开发者在有限的硬件资源内释放最大的创作自由度。但每一项选择也都积累了自身的热负载,三项选择的叠加效应被封装在一个被市场窗口压缩到极限的工程周期中,在尚未被充分验证的散热方案上运行。到2005年11月Xbox 360正式发售时,微软已经向全球主要市场的零售渠道铺了超过一百万台主机。每一台机器的主板上都封装着同样的架构承诺,也封装着同样的架构债务。这些机器即将进入数百万个客厅,用户的温度环境、通风条件和连续游玩时长将逐一验证这些选择在真实世界中的耐久性。昂格尔和他的团队在他们能够控制的范围内已经尽力了,但剩下的变量已经不在实验室的可控条件之内。