就像所有的故事都会以“从前有个……”开头那样,我们今天的故事也会有这样无聊的开始。这一次要讲述的是两个显卡大腕,一个是NVIDIA,另一个则是AMD的图形部门。自从3D显卡问世以来,他们一直是竞争关系,以前是,现在也是,但是以后呢?在有关显卡的未来走向上,许多人都可以从近两年来的表现中觉察到NVIDIA已经不跟AMD拴在一个绳上了,AMD在DX11时代抢先出手,背靠微软好乘凉,继续坚持DX游戏之路,支持DX11的HD 5000显卡目前也是蝎子尾巴―独一份。NVIDIA即便没有抢得下一代显卡的沙发,但是雄心不已,他们自信比AMD看得更远,也会做得更好,新一代Fermi架构的显卡将成为NVIDIA最大的王牌。
双方的分歧似乎早有预见。DX9以及之前的时代,衡量显卡性能最重要的两个指标就是顶点单元(Vertex shader)和像素单元(pixel shader)的运算能力,通常VS和PS单元更多的显卡性能也越强。在DX10规范中,微软将VS和PS(还有一个Geometry shader几何渲染器,GS)的功能合并,统一为Unified shader,也称为Stream proceser(流处理器),这个架构一直延续到现在,即使是DX11也是以流处理器为运算核心的。统一渲染单元的好处是显而易见的,设计人员不需要再考虑顶点、像素以及几何运算的不同,不仅编程难度大大下降,而且程序的通用性也逐渐显露出来,由此开始AMD和NVIDA在显卡的核心架构设计乃至发展方向上都产生了分歧。
早在2003年的时候NVIDIA就已经在谋划GPU通用计算,由于没有统一的标准相关厂商都是摸着石头过河。当时的思路就是通过OpenGL以及DX中的高级着色器语言(High-level Shading Language)将程序映射为GPU可以识别的图形运算,计算完成后再进行一次映射而得到人们需要的结果。说白了这样的做法是在“蒙骗”GPU,需要小心翼翼地处理,不然GPU就会翻脸不干。
NVIDIA当时推出过一种CG(C For Graphic)语言来调用GPU资源进行编程开发。CG基于C语言,但是并不完全相同,程序员还是需要花时间来学习CG语言才能顺利使用。AMD(当时还是ATI)也研究过GPU通用计算,早在X1900时代就和Folding@Home项目合作利用自家Stream通用计算技术提供计算支持,限于当时的技术这些尝试并未取得多少成功。
GPU通用计算在DX10时代有了新的机会,因为DX10中微软用统一渲染器(Unfied Shader)取代了像素渲染器、顶点渲染器以及几何渲染器的功能,计算指令不再有顶点、像素或者几何之分,处理过程得以简化。微软并未强制规定统一渲染器如何设计,AMD和NVIDIA也因此各自设计了适合自己的统一渲染器,AMD推出的是原有设计的改良版,NVIDIA则以此为契机设计了更加通用的统一渲染器,从G80架构开始走上GPU通用计算的“康庄大道”,GT200发布时更是喊出“GPU中心论”,而最新的Fermi架构完全为高性能计算而生。
本文历数AMD与NVIDIA最近几代的GPU架构设计,并重点探讨了Fermi架构的设计,或许我们能从中理解两家厂商的不同理念以及他们对未来的发展设想。