扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
1.导读
就像所有的故事都会以“从前有个……”开头那样,我们今天的故事也会有这样无聊的开始。这一次要讲述的是两个显卡大腕,一个是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通用计算技术提供计算支持,限于当时的技术这些尝试并未取得多少成功。
DX10中统一渲染器的出现推动了GPU通用计算的发展
GPU通用计算在DX10时代有了新的机会,因为DX10中微软用统一渲染器(Unfied Shader)取代了像素渲染器、顶点渲染器以及几何渲染器的功能,计算指令不再有顶点、像素或者几何之分,处理过程得以简化。微软并未强制规定统一渲染器如何设计,AMD和NVIDIA也因此各自设计了适合自己的统一渲染器,AMD推出的是原有设计的改良版,NVIDIA则以此为契机设计了更加通用的统一渲染器,从G80架构开始走上GPU通用计算的“康庄大道”,GT200发布时更是喊出“GPU中心论”,而最新的Fermi架构完全为高性能计算而生。
本文历数AMD与NVIDIA最近几代的GPU架构设计,并重点探讨了Fermi架构的设计,或许我们能从中理解两家厂商的不同理念以及他们对未来的发展设想。
2.NVIDIA与AMD统一渲染架构的不同
计算机每个像素都是由RGB(红绿蓝三原色)组成,并附加alpha灰度值表示各颜色的透明度,顶点则包含XYZW四个坐标。因此在进行图像处理时像素单元可以同时进行R、G、B以及Aplha四次运算得出像素的颜色,顶点单元也可以一次进行XYZW四次矢量坐标运算,DX10之前的架构都是这种SIMD(Single Instruction Multiple Data,单指令多数据)架构,这种架构在进行4D矢量运算时效率最高,可以100%满负载执行而不浪费运算单元。
除了矢量运算,游戏中的标量运算也越来越多,执行1D标量计算时传统SIMD架构的利用率就只有原来的25%,这将带来不可避免的效能降低。AMD之前也采取过变通手法,将4D矢量改为3D矢量+1D标量运算,NVIDIA的G70中除了3D+1D组合之外还有2D矢量+2D标量的运算方式。随着DX10中统一渲染单元的到来,SIMD架构的缺陷日益显现,厂商需要新的架构设计。
AMD将传统的4D矢量运算改良为4D+1D架构
AMD的解决方法是将原有的4D矢量运算拓展到4D矢量+1D标量架构,并命名为Supersclar(超标量),而4D+1D的运算架构也一直使用至现在的DX11显卡上。AMD的Supersclar架构在一个周期内可以进行5次矢量运算或者一次标量+一次矢量运算,而且5D指令只需要一个发射端口,每个流处理器所需的晶体管较少,设计难度也大大减小,缺陷依然是遇到标量运算时效率降低,AMD通过大幅增加流处理器单元的数量并增加分支预测单元(Branch Execution Unit)改善指令分配问题,在驱动设计上要付出更多努力。
AMD的Superscalar架构沿用至今
与AMD的循序渐进相比,NVIDIA的解决方式更有革命性。NVIDIA的首款DX10架构G80中使用了标量设计,所有运算不管是4D矢量、3D+1D、2D+2D或者1D标量全都转为标量计算,这样标量运算中效率一直为100%,不过矢量运算中也存在着效率下降的问题,因为G80一个周期内只能执行一次运算,执行4D矢量需要四个周期才能完成。NVIDA采用异步架构将流处理器的频率与核心频率分离,流处理器的频率大幅提升至1.3G以上,几乎达到了核心频率的两倍,即使是4D矢量运算速度也有保证。
NVIDIA的标量流处理器无异于一次突破,此后的游戏以及通用计算程序中证明了此架构的优秀。除了频率提高一倍的流处理器弥补了数量上的劣势外,最主要的还是全标量架构的高执行效率,G80中每个指令都可以1D标量进行运算,利用率可以一直保持在100%,而AMD的4D+1D架构需要将指令组合成适合5D运算的VLIW(超长指令)才能保证充分利用所有流处理器,一旦重组不成功或者指令不适合重组,那就无法发挥出流处理器数量众多的优势,因此AMD显卡的理论浮点运算能力非常强劲,但在实际应用中相比NVIDIA的显卡并不突出,甚至有所不如,从Folding@home中的贡献排名中也一窥而知。
截至今年12月27日的Folding@home贡献度排名
上述有关A、N架构设计的不同只是一个方面,有关两家在具体架构设计上的差异之处还有许多,总体来看AMD直到目前为止的DX11显卡依然延续了R600开创的4D+1D超标量结构,但是设计难度较小,可以通过新工艺大幅提高sp单元数量来获得性能提升,而NVIDIA则走了另一条路,1D标量流处理器执行效率高,异步分频也可以弥补数量上的损失,实际效果也非常好,但要面临设计负责、成本高昂的难题。除了游戏方面的应用,高效率的1D标量设计还有助于NVIDIA实现GPGPU通用计算,这也是NVIDIA近两年来一直在谋划的新战略。
3.G80横空出世 NV谋划通用计算
2006年的11月份,NVIDIA首先推出了支持DX10规范的新一代显卡,首批显卡包括定位旗舰的GeForce 8800 Ultra(定价800-1000$)、高端的GeForce 8800 GTX(599$)以及次高端的GeForce 8800 GTS(399-499$),这三款显卡全部基于NVIDIA的G80架构,率先支持了DX10规范(与当前的情景有几分相像)。
G80架构的成功是NVIDIA近三年最为得意的资本之一,即便是当前的中低端显卡也受益于G80衍生出的G92/G94架构,由8800 GTX工艺升级而来的9800 GTX再到现在的GTS 250酣战了对手三代显卡,直到现在仍是玩家的最佳选择之一。G80架构能够实现这一切都要归功于当时架构设计的优异,NVIDIA放弃了以往显卡的矢量运算单元,改用复杂但是效率更高的标量运算。
前面已经提到AMD与NVIDIA在流处理器设计思路上的不同,DX10规格了统一渲染单元的功能,但是如何具体实现统一渲染功能可由厂商定夺。AMD沿用了传统的SIMD架构,坚持4D+1D的运算方式,每个流处理器的设计方式也很简单,同时也可以大幅提高流处理器单元的数量。G80则革命性地使用了MIMD指令架构,内部单元完全针对1D标量设计,执行1D、2D、3D指令效率很高,代价则是设计复杂,晶体管规模庞大而成本高昂。
G80架构设计图
G80架构拥有128个流处理器(以下简称SP)、64个纹理单元和24个光栅单元,由8个阵列组成,NVIDIA定义为线程处理阵列(TPC,Thread Processing Cluster),每个TPC拥有16个sp和8个纹理单元。每阵列中的sp单元也分为两组,每组8个sp,这8个sp也被称为一组streaming multiprocesser(简称SM)单元。每一个阵列都拥有独立的8个纹理过滤单元(Texture filtering unit,TF)、4个纹理寻址单元(Texture address unit,TA)以及L1缓存。详细结构如下:
每阵列的详细结构
在有关G80显卡的分析与测试中,大家对其游戏性能更为关注,G80显卡也在这点上交出了满意的答卷。不过游戏应用并非全部,殊不知NVIDIA在推出G80之际也推出了名为CUDA(Compute Unified Device Architecture)的GPU通用计算环境技术,除了最早发布的8800 Ultra/GTX只支持CUDA 1.0,其余衍生出的核心则可以支持CUDA 1.1,以此类推的GT200架构支持CUDA 2.x,最新的Fermi将会支持CUDA 3.x。
有关显卡的通用计算并非NVIDIA首创,在此之前已经有许多公司尝试过,就连老对手ATI在Folding@Home项目上都比NVIDIA起步要早,但在DX10统一渲染器出现之前显卡通用计算技术的发展一直处于较低水平,流处理器的出现使其有了充当CPU的可能,而在支持环境上,CUDA的出现解决了软件开发环境的问题。
G80架构身上还有另外一个第一一首次支持C语言的显卡架构,而CUDA的核心其实就是一个C语言编译器,程序员无需学习额外的编程语言,直接使用他们熟知的C语言编程,通过CUDA的编译即可直接调用GPU硬件资源,而在此之前的GPU通用计算,程序必须映射到GPU能够处理的DX或者OpenGL这样晦涩难懂的API才能“骗”过GPU执行通用计算。换言之,CUDA的出现降低了GPU开发的门槛,借助GPU强大的浮点运算能力,开发者可以用标准的C语言编程实现CPU也无法企及的大规模并行计算。
很快NVIDIA就发布了Tesla品牌,借助G80架构的通用计算能力进军HPC高性能计算机市场,抢占传统CPU服务器的领地。
4.R600接踵而至 AMD首代DX10架构出师不利
NVIDIA推出G80架构时,AMD与ATI正忙于双A合并的事宜,AMD推出的第一代DX10架构的显卡依然是原先ATI负责的。在晚了NVIDIA将近半年之后,AMD于2007年5月份发布了基于R600架构的HD 2000系列显卡,由于AMD与NVIDIA在统一渲染器设计上的思路不同,R600的问世也让人们有机会对比A、N两家的不同。
R600核心架构设计图
承前文所述,AMD的统一渲染器设计在原来的SIMD架构上改良而来,Superscalar超标量架构由1个4D矢量一个1D标量运算核心组成,进行传统的4D矢量运算时效率最高,而遇到1D标量运算时运算效率降至四分之一,所以需要更多数量的流处理器来弥补这个劣势。R600架构中设计了320个流处理器单元,分为四个SIMD阵列,每个阵列又可分为两组,每组40个sp单元。每阵列的80个sp中又分为16个小单元,每一组都是由5个流处理器和一个分支预测单元。
具体方式如下图所示:
AMD显卡中每一个流处理器的详细结构
这张图也可以解释为什么AMD与NVIDIA显卡中流处理器数目差异如此之大,AMD所称的流处理器实际上是由5个小单元组成,所以通常称AMD显卡的中流处理器为流处理器单元,而NVIDIA显卡才成为流处理器,换算一下的话两者是5:1的关系。这个比列只是一种近似比较,实际性能还要考虑各自的频率以及效能。
R600的纹理单元
R600内设计了四个纹理单元,正好对应SIMD阵列的数目。每组纹理单元拥有4个纹理过滤单元和8个纹理寻址单元,因此共有16个纹理过滤单元,32个纹理寻址单元。
HD 2000系列首度支持Hardware Tessellation技术
在R600架构的显卡上还有两项技术值得一提,第一个则是Hardware Tessellation,也就是目前DX11中火热的硬件曲面细分技术,AMD在HD 2000显卡中引入了这一技术,不过当时的硬件环境远不成熟,Hardware Tessellation不具有实用性,只在HD 2000显卡上昙花一现,到了HD 3000系列就去掉了。
AMD的环形总线技术
另外一个则是1024-bit环形总线技术,2900XT本身就拥有512bit显存位宽,已经是当时位宽最大的,G80最大位宽也不过384-bit。AMD在此基础上又引入了Ring bus环形总线,可以等效1024-bit位宽,如果使用高速的GDDR4显存,那么显存带宽可以轻易突破130GB/s(这一数值在今天的高端显卡上也不容易达到),普通的GDDR3显存带宽也有100GB/s以上的带宽。可惜的是当时的生产工艺还是80nm,512-bit的显存位宽要占据相当大的晶体管规模,AMD的环形总线技术也没有普及开来,到HD 3000系列上甚至精简为256-bit,但是搭配高速GDDR3显存来弥补。
R600作为AMD推出的第一代统一渲染架构在虽然亮点多多,但是在市场上并没有引起玩家的共鸣,性能上相对NVIDIA的G80并没有胜算,很快就被改进版的RV670架构所取代。
5.改进版RV670 AMD开始新策略
在HD 2000系列折戟沉沙之后,AMD很快便推出了改进版的RV670架构。在吸取了HD 2900XT失利的教训后,AMD在RV670上并没有增加新晶体管,反而是在减负,晶体管数量由2900XT的7.2亿个降至6.6亿,核心面积则从原来的408平方毫米减少至192平方毫米。RV670能够减负一方面是架构的精简,比如去掉了1024-bit环线总线改用25bit,另外一方面则得益于生产工艺的进步,由原来的80nm、65nm一步跨入55nm制程工艺,核心面积因此大幅减少。
新工艺是RV670获得重生的关键
在功能上,RV670增加了DX10.1和PCI-E 2.0支持,增加了HD 2900XT确实的UVD解码引擎,可完整支持主流高清编码的硬解,新一代HD 3800系列显卡还支持三路/四路交火以提高游戏性能,并在功耗上有过人表现。
DX10.1 Demo演示与DX10.0的不同
核心架构设计上,RV670与R600并没有明显区别,依然是320个流处理器,分为4组SIMD阵列,每个阵列对应一组纹理单元。每5个sp单元和一个分支预测单元组成一个流处理器,继续着4D+1D的超标量结构。
RV670架构图
RV670架构的HD 3800显卡更像是R600架构的正式版,而HD 2000系列只是一次试水,它承担太多不成熟的技术和工艺导致性能与价格上都没有优势,也正是从RV670身上AMD发现了另外一条路:如果顶级性能上不能超越对手,那么就要在同价位上比对手做的好。要实现这一点,需要AMD在制程工艺、设计思路以及市场策略上作出相应的改变,还好下一代RV770架构成功实现了逆转。
6.规格翻倍 RV770赢得双丰收
真正给AMD带来生机的是HD 4800系列显卡。在HD 3800系列显卡身上找到新思路之后,AMD又于2008年6月分发布了RV770架构的第二代DX10.1显卡,显卡的流处理器单元从上代的320个暴增到800个,AMD显卡的架构容易增加流处理器单元的优势渐渐显现出来。
RV770架构图
RV770的SIMD阵列由RV670的4组增加到10组,纹理单元也相应地增加到10组,整体规格是上一代架构的2.5倍,流处理器单元达到了800个,纹理处理器则提高到了40个,光栅单元(ROP)为16个,sp单元的急剧增加也大幅提升了HD 4800系列显卡的性能,至少可以抗衡NVIDIA的GeForce 9系显卡。
RV770的纹理单元做了改进
对比前面的RV670架构可以看出RV770的几点不同:SIMD阵列排列方向横置,纹理单元紧靠流处理器单元。因为RV670架构在纹理性能上不尽如人意,AMD在RV770上改进了纹理单元的设计,虽然每个纹理单元的规格没有变化,但是效率更高,一个简单的例子就是开发者去掉用以保证纹理单元独立性的TMU Pool设计。
ROP单元
RV770的光栅单元数量保持在RV670的16个,不过HD 4800系列显卡的抗锯齿性能明显要强于HD 3800系列,因为RV770的ROP单元Depth stencil ops(景深模板的每秒操作数)双倍于RV670,在执行2MSAA/4MSAA运算时每周期可填充16像素,8AA时每周期可填充8像素,都达到了RV670的两倍。 此外AMD之前引入过名为CFAA(Custom Filter Anti-Aliasing)的新算法,在使用CFAA的时候AMD的显卡还可以利用流处理器进行抗锯齿运算,800个流处理器最高可以达到24x CFAA。
RV770最为成功的并非它的架构设计而是AMD的市场策略。通过对制程工艺的熟练掌握,RV770在规格翻了一倍多的同时并没有大幅增加核心面积(RV670为192平方毫米,RV770在256平方毫米),晶体管数量从6.6亿增加到9.56亿的同时功耗控制也非常出色(TDP功耗为110W,支持自动降频),所以RV770的成本很低,显卡上市价直接切入消费者的心理价,AMD的“Small die”策略赢得了市场成功。
7.怪兽来袭 GT200架构不走寻常路
进入DX10时代之后,竞争对手AMD已经升级了三代显卡架构,而NVIDIA依然是靠G80架构打头阵,虽然期间也推出过工艺升级的G92架构,但这只是一次次的马甲战略而已,NVIDIA真正的新架构是与RV700几乎同期发布的GT200,这是一款规模庞大的GPU架构,晶体管数量达到了惊人的14亿,NVIDIA的GPU架构设计继续走“巨核心”之路。
G80作为游戏显卡毫无疑问是非常优秀的,但是它无法承担实现NVIDIA的通用计算梦想的重任,因为G80的运算能力不足,而且只支持单精度浮点运算,缺少了商业计算中更为重要的双精度浮点运算,而GT200架构中增加了双精度浮点运算支持。
GT200架构设计图
G80中设计了8组TPC(thread processing cluster)阵列,每阵列2个SM(streaming multiprocesser)单元,总计128个流处理器,而GT200中设计了10组TPC阵列,每TPC的SM单元提高到3个,总计240个流处理器。同时每个TPC阵列包括8个TF纹理过滤单元总计80个纹理处理器,ROP总数则提高到32个。
TPC阵列结构
具体到每一个TPC阵列,其包含3个SM单元24个流处理器,每SM单元可执行的线程数由G80的768条提升到1024条,所以总的线程执行能力达到了G80的2.5倍(10*3*1024/8*2*768=2.5)。图中Local memory缓存容量从G80的16K翻倍到32K,共享L1缓存同样从8K翻倍到16K,每个SM中寄存器数量因此从8192个答复增加至16384个,可容纳的指令更多。
GT200中引入注目的一项改进便是SM单元中增加了FP64双精度浮点运算,而G80中仅能支持FP32单精度运算。尽管代价高昂,执行双精度运算时GT200的效能仅有单精度时的1/8,但双精度运算却是必须的,因为GT200除了应付游戏(游戏应用不需要双精度运算)之外还要进军HPC高性能计算机行业,如果不支持双精度浮点运算那就毫无竞争力。
应该说GT200的架构设计是成功的,但是NVIDIA没有想到AMD的RV770能获得意想不到的成功。在顶级性能上AMD的HD 4870只相当于低阶的GTX 260,远落后于GTX 280,但是GT200的成本太高了,而且NVIDIA的生产工艺也落后于AMD,65nm工艺生产出的GT200显卡核心面积达到了576平方毫米,同时显卡的功耗、发热以及PCB配件都处于较高水平,市场上销售的产品过于昂贵,消费者并不买账,即使是改进到55nm之后仍未被普通消费者认可,NVIDIA以GT200实现GPU中心论的梦想遭到了对手顽强的狙击后不得不面对现实。
8.厚积薄发 AMD抢先推出新架构DX11显卡
AMD利用RV770打了一个漂亮的翻身仗,被G80压制了两年了的怨气也随着HD 4800显卡的热销而消散,内部早已在谋划下一代DX11显卡的研发了。受益于RV770架构优异的可拓展性,AMD代号cypress的新架构在规模方面又有了惊人的提升,流处理器单元再次翻番。
代号Cypress的HD 5870架构图
从架构上看,Cypress好像是两个RV770核心封装在一起,因为5870的规格都是HD 4870的两倍,1600个流处理器、80个纹理单元和32和ROP光栅单元刚好是RV770架构的两倍数量,性能上也基本是HD 4870的两倍。不过cypress的内部设计并非两块RV770核心封装在一起那么简单。
Cypress单个流处理器结构
每个流处理器中除了原有的Stream Cores和Branch Unit分支预测单元之外,HD 5870中的1D标量处理器中多出一个执行SAD(Sum of Absolute Differences)指令的功能,SAD指令并不再DX11或者OPenCL的标准要求中,AMD加入这条指令是为了加速视频解码,RV770需要耗费12个运行周期才能模拟出这一功能,现在则只需要一周期执行SAD指令即可。
HD 5870的流处理器也加入了双精度浮点运算支持,每个流处理器(包括5个流处理器单元)可以执行4条32-bit FP MAD运算,2条64-bit FP MUL or ADD运算,1条64-bit FP MAD运算,4条24-bit Int MUL or ADD运算,特殊功能区每周期可以执行一条32-bit FP MAD运算,均比RV770有了大幅提高。
Cypress的SIMD阵列的纹理单元也有多项改进,HD 5870纹理单元已经支持读取压缩后的AA颜色缓冲数据以减少带宽占用,此外纹理的差值运算转移到流处理器中而不再由纹理单元负责。Cypress的双线过滤纹理运算能力达到了每秒680亿次,实际性能中一大明显改变就是可实现各向无角度纹理过滤。
HD 5870改进了纹理过滤功能实现了几近完美的纹理性能
自从XBOX 360的紧密合作之后,AMD与微软在DX标准上一直走的很近,虽然DX10时代被NVIDIA抢先,但是卧薪尝胆之后AMD终于在DX11上取得回报,DX11中的硬件曲面细分是AMD钻研多年的心血(DX11中的已经是第六代技术了),在标准支持上自然有先天优势。HD 5800系列显卡的先发制人已经赢得了第一回合,NVIDIA方面也放出了代号“Fermi”的下一代显卡的消息,相关产品已经在准备中。从目前的消息来看,Fermi的规模足够庞大,但是推出时间一直推迟,NVIDIA手里的这张王牌到底有多强的实力成了媒体以及消费者最为关心的话题,当然密切关注的还有AMD。
9.Fermi欲出 NVIDIA胜算几何?
与AMD抛弃RV870这样的研发代号相似,NVIDIA新一代显卡的研发代号也不再延续GT300的名字而是命名为“Fermi”,这个名字来自于美籍意大利物理学家Enrico Fermi(恩里科 费米,伟大的实验物理与理论物理学家,建立世界上第一座可控裂变反应堆,并参与原子弹研发,1938年因发现中子核反应获诺贝尔物理学奖)。如果联系到NVIDIA的高性能服务器品牌名为“Tesla”(尼古拉 特斯拉,一个被世人忽略的科学天才,有兴趣的可以查找维基百科),NVIDIA在新架构上寄托的希望甚至是野心也就很明了了。
Fermi能否给NVIDIA带来好运?
如果说G80是NVIDIA试水通用计算的第一步解决的是有无的问题,GT200是针对G80通用计算能力不足的一次扩展,那么Fermi将是NVIDIA近几年来开发通用计算架构的一次总结,也是一次升华,其目的是设计出世界上第一款通用计算GPU(NVIDIA官方PDF语),继续推进NVIDIA的“GPU是计算的核心”构想。
NVIDIA在设计G80架构时还带着很大的试探心理,毕竟当时的重心依然是DX游戏应用,通用计算能力属于显卡的附属,再加上当时的工艺限制,GPU核心不可能设计的很庞大,所以G80流处理器数量较低,而且不支持双精度浮点运算。GT200中虽然支持双精度运算,但是效率比较低,Fermi吸取了前两款GPU的使用经验,针对高性能计算作了如下改进:
1. 提升双精度运算能力。在这一点上相比GT200改进多多,FP64双精度浮点运算能力可以达到FP32单精度峰值速度的1/2,而GT200中双精度仅有单精度运算的1/8峰值速度。
2. 支持ECC纠错。商业计算对数据运算的可靠性要求非常高,服务器中ECC内存必不可少,NVIDIA要想在其中分一杯羹也同样要在计算可靠性上下足功夫,Fermi的register寄存器缓存、L1/L2缓存以及显存都支持ECC纠错功能,减少了后顾之忧。
3. 真正的缓存结构。Fermi之前的架构都是共享内存(shard memory)结构,有些并行程序并不支持共享内存,需要真正的缓存来避免这种情况的发生。
4. 更大的共享内存。原来16KB大小的SM内共享内存已经不能满足越来越多的CUDA程序的要求,Fermi中每组SM单元的共享内存提高到64KB。
5. 更快的转换速度。Fermi是首款真正的肩负游戏应用和高性能计算的GPU架构,在两种不同的应用环境中的转换速度要尽可能地快,NVIDIA的目标是提高至少10倍。
6. 更快的原子操作。并行计算中需要更快的“read-modify-write”原子操作,Fermi的速度将达到GT200的5-20倍。
Fermi的设计目标看起来非常远大,NVIDIA倾注了大量心血用它打造真正的GPU 中央处理器,无论是游戏应用还是高性能计算都要一网打尽,那么Fermi架构能否承担这一重任呢?
10.30亿晶体管 Fermi的CUDA核心设计
NVIDIA在9月底公布了Fermi的官方文档,人们终于有机会可以亲自体验到Fermi架构的强大。Fermi显卡将拥有目前最为庞大的30亿个晶体管,512个CUDA核心,采用TSMC 40nm工艺生产,虽然目前尚未得知正式产品的核心面积、频率以及TDP功耗等参数,但是仅30亿个晶体管这样庞大的规模就足以让人震撼了,想想14亿晶体管的GT200吧。
Fermi架构图
Fermi的设计目标是512个CUDA核心(实际上就是流处理器,NVIDIA为了推进CUDA连名称都有所改变),这512个核心分为16组SM,每组SM单元包含32个CUDA核心,而GT200中每组SM单元只包含8个流处理器,但是拥有30组SM单元,所以CUDA核心总数上反而有所增加。
SM单元的组成情况
每组SM单元中包含32个CUDA核心,每一个CUDA核心都拥有一个全功能的ALU逻辑运算单元和FPU浮点运算单元,其中浮点运算单元支持IEEE 754-2008标准(之前的核心仅支持IEEE 754-1985标准),新标准支持单精度和双精度下的FMA指令(Fused mutiplay-Add),这是一种同时混合乘法与加法的操作,比单独进行乘法或者加法运算要精确的多。
改进后的CUDA核心执行FP64双精度运算时效能大增,峰值速度可以达到单精度时的一半(双精度的运算量是是单精度运算的8倍),而GT200只能达到单精度时的1/8,竞争对手AMD的双精度效率也不过是1/5。
每组SM中还用16个Load/Store单元用以存储缓存(Cache)或者显存(DRAM)中寻址数据。最右边的SFU则是special function unit(特殊功能单元),可以执行正弦/余弦等数学或者插值运算。
11.提高可靠性 内存系统支持ECC纠错
ECC全称是Error Checking and Correcting(错误检查与纠正),相比以往的奇偶校验技术ECC不仅能检查出错误还能自动纠正,提高了计算的可靠性,如果没有ECC校验人们需要计算出两次相同的结果之后才能确认计算成功。之前的GPU都不支持ECC技术,很难在商业计算中立足。Fermi的一大改进则是增加了ECC支持,而且核心内的register、cache和DRAM中都提供了ECC支持。
普通用户对ECC或许没有什么概念,但是在商业计算上ECC却是不可或缺的功能,GT200虽然实现了双精度浮点运算,但是并没有支持ECC,所以使用GT200的Tesla 10系列服务器只适合做小规模的集群,要想真正冲击高性能计算机领域只有靠Fermi架构的服务器了。
Fermi与前两代架构中的存储系统的不同(图片来源于realwordtech)
随着CUDA编译的程序越来越大,GT200中每SM单元16KB的共享内存已经不能满足需要,Fermi架构中每SM单元的可用内存/缓存提高到了64KB,而且配置方式非常灵活,既可以是48KB shard memory加16KB L1缓存也可以是16KB shard memory加48KB L1缓存,这样无论是对shard memory需求高或不高的程序都能从中受益。
Fermi中的L2缓存容量达到了768KB,而且是所有SM单元共享的,每一个SM单元都能从中获得最新数据,实现了GPU内的高速数据共享。
外部显存上,Fermi选择了GDDR5显存,拥有6条GDDR5内存控制,每条位宽为64-bit因此总位宽为384-bit,比GT200中的8条内存控制器512-bit位宽要少一些,不过GDDR5的传输速率要高于GDDR3,所以总带宽还有大幅增加,如果搭配1050MHz的GDDR5显存总带宽将达到201GB/s,显存容量也达到了1536MB,最高可达6GB。考虑到ECC显存不菲,桌面级Fermi可能去掉ECC支持。
12.二代并行线程指令 完整编译环境支持
Fermi也是首款支持第二代PTX(Parallel Thread eXecution,并行线程执行)指令的GPU架构,PTX是NVIDIA用以支持并行线程处理器的低级虚拟机和ISA(Instruction-Set Architecture),每当程序运行时PTX指令都会通过GPU驱动转变为机器指令。设计PTX主要目的是为了提供一个机器无关的支持C、C++、Fortan等语言的编译器ISA,并能超越GPU架构与核心数目差异而充分发挥GPU性能的编程环境,在G80、GT200发布之时并未见到NVIDIA大张旗鼓地宣传这一指令,而在Fermi架构中,PTX 2.0指令有了明显改进,重要性也不可同日而语。
PTX 2.0指令提升了可编程性、精确度以及性能,完整支持IEEE 32位浮点精度,所有变量及指针拥有统一寻址空间,支持64位寻址,支持OpenCL与DirectCompute(DX11中的通用计算)新指令,最重要的一点则是统一寻址空间完全支持C++语言。
统一寻址空间不再需要指定具体的寻址位置
在PTX 1.0中Load/store操作时需要从local、shard以及global三处寻址空间中指定一个,由于C/C++语言中所有变量和函数都是通过指针才能确定的对象中,编译时分离的寻址空间无法确定指针的位置导致不能支持C/C++语言。在PTX 2.0中loca、shard以及global寻址空间得以统一,load/store操作不再需要指定具体寻址空间因而解决了不支持C/C++语言的难题。
另外PTX 1.0的寻址长度为40-bit,可以支持TB以上的寻址空间,到了PTX 2.0中Load/store操作的寻址长度进一步提升到64-bit,未来的寻址空间要求再高也不会出现寻址空间不够的问题了。
Fermi架构要想拓宽远大的通用计算之路,良好的编译环境是少不了的。除了NVIDIA自家力推的CUDA之外,NVIDIA的显卡也支持OpenCL、OpenGL、DirectCompute、Python、Fortran、C/C++(CUDA本身就是基于C语言的)等多种编程环境,Fermi还有一个名为Nexus的小插件,安装此插件之后程序员可以在MS VS2008中直接调用GPU资源,甚至不再需要额外的转换。
13.GigaThread线程调度 多任务并行处理
Fermi架构中每组SM单元的可执行线程数提高到了1024条,总线程执行能力则达到了24576条,如此多的线程数如何调度分配成了一大难题,为此NVIDIA引入了新的两级分配式(Two-level Distributed Thread Scheduler)线程调度机制。
第一级是芯片级的,有个全局分配引擎负责将线程块(Thread Blocks)分配到每个SM单元中,这一过程较为简单。第二级的线程调度则是SM内部,需要将32条并行线程分配到具体执行单元中去,这一过程比较复杂,因此NVIDIA引入了Dual Warp Scheduler调度机制。
Dual Warp Scheduler双线程调度器示意图
SM单元的调度器由32条并行线程组成,NVIDIA称之为“Warp”。每组SM中都包含两条warp 调度器和两个指令发送单元(保证两个warp调度器都可以同时发送和执行指令)。由于调度器各自独立运行,每个调度器都可以发送指令到16个CUDA核心、16个Load/Store单元以及4个SFU单元中去(正好是SM单元的一半),两个调度器互不依赖因此一个周期内即可发送一个warp,而G80/G200架构中需要两个周期才能完成一个warp,相比之下Fermi执行效率大幅提升。
Dual Warp Scheduler的困难是双精度运算不支持这样的双向调度方式,好消息则是大多数指令如整数指令、浮点指令、整/浮混合指令、load(载入)、Store(存储)以及SFU指令都支持Dual Warp Scheduler,只要这两条指令是相同的。
Fermi同时支持多任务处理,那么如何在不同人物之间快速切换也变得很重要。Fermi架构支持Context Swithing(前后关联切换)可以在25微秒内切换两种不同的应用,10倍于前代架构。举例来说,当前时刻显卡在进行纹理处理,下一时刻就要进行物理加速计算,Fermi架构就可以在25微秒内保证物理加速计算所需的资源,下一时刻或许又会从物理加速计算转向别的应用,期间的切换时间越短越好。
Fermi支持Concurrent Kernel Execution并行计算
上一段讲的不同程序之间的切换,Fermi并行处理的另外一个好处则是支持并发核心执行(Concurrent Kernel Execution),同一应用程序中不同但相关的核心可以同时运行,这样可以最大化利用GPU能力。举例来说,物理加速运算中可能需要请求流体以及刚体计算,这两者属于同一程序内的不同核心,以往的串行执行方式会是执行完流体运算后再进行刚体计算,而Fermi则可以同时进行流体与刚体计算。
14.桌面版本Fermi面临的挑战
前面用大篇幅介绍了AMD与NVIDIA在显卡架构设计上的不同策略,并重点解析了Fermi的架构优势,但那只是针对通用计算方向的,与普通消费者的关系不大。大部分人真正期待的还是Fermi游戏卡,它的性能如何,价格如何,对游戏的支持才是普通玩家所关注的。虽然NVIDIA官方宣称Fermi的游戏性能值得期待,但是考虑到Fermi现在的处境,桌面版本的Fermi显卡还要面临多项挑战。
1. 时间问题。
AMD的DX11显卡已经发布了三个多月,相关产品已经在市场上占据先行优势,而Fermi的发布日期从传闻的11月底到明年的1月份CES展会,最终推迟到明年第一季度,目前仍没有一个确切的发布日期。长久的等待将会使得消费者的兴趣消灭殆尽,毕竟锅里的没有碗里的实在。即使NVIDIA能够成功在明年一季度发布fermi显卡,中低端产品的布局仍然需要一定的时间,这会给予AMD发布新品进行狙击的机会。
当NVIDIA老总拿着模型时他会想到Fermi如此难产吗?
2. Fermi显卡的性能问题。
从架构上来看Fermi显卡30亿个晶体管512个流处理器的规格足够强大,但是实际产品并没有问世,目前无人尚无法确认Fermi的游戏性能。此外,DX11中以硬件曲面细分为代表的多项重要技术指标都是由AMD研发,NVIDIA能在多大程度发挥DX11的性能现在还不好说。近期NVIDIA官方PDF中也确认了基于Fermi架构的Tesla 20系列产品将削减流处理器规格至448个,虽然并未提及桌面版产品,但是这样的举动依然让人有些担心。
性能问题本不应该是Fermi所担忧的,但在最终产品发布之前谁也不敢打包票,当年Matrox 的Parhelia(幻日)显卡不就是一个高规格低性能的例子吗?
3. 产品良率问题。
Fermi显卡与AMD的HD 5000系列一样采用TSMC的40nm工艺来生产,但是Fermi的结构十分庞大,生产工艺明显比HD 5000系列更为复杂,NVIDIA如何控制好产品的良率也会是面临的难题之一,之前甚至有媒体爆出GT300晶圆的良率不足2%,虽然被NVIDIA否认但是Fermi的良率控制仍将是NVIDIA要解决的困难之一。
4. 产能问题。
TSMC最早上半年就开始代工40nm工艺的晶圆,但是当时受限于晶圆良率不足,产能十分有限,代工的AMD HD 4770显卡因此受到殃及。时至今日TSMC的40nm产能依然不足,HD 5850/5870一度因此遭受断货之逾。而且AMD即将在明年1月份发布多款桌面、移动平台的DX11显卡,将进一步与Fermi显卡争夺产能。
5. 成本问题。
Fermi显卡的成本来自两个方面:一是核心的制造成本,类似的悲剧已经在GT200上演过一次,巨大的核心面积使得晶圆成本居高不下。AMD最新的Cpress核心晶体管数量达到了21.5亿个,但是核心面积仅有334平方毫米,Fermi架构30亿个晶体管数量的规模是GT200架构的两倍之多,即使有40nm工艺助阵最终成品的核心面积也会是一个庞然大物。
前代架构的核心面积对比
另外一个成本则来自于PCB设计及元件用料。Fermi的核心规模庞大,其对显卡的电气要求也更高,相关元件也要保持一定的高水准才能保证显卡的稳定运行,这又是一个提高成本的地方。回想GT200架构,其PCB历经P651/654、P891/P897、P892等多种变动仍未能大幅减少PCB成本,GT200也一直未能普及到主流市场。
6. 价格问题。
这个问题实际上是承袭自成本问题而来,Fermi高昂的成本使得最终产品的价格也会居高不下,考虑到各种因素旗舰级的Fermi单卡卖到4999元以上的价格也并非不可能,除非NVIDIA愿意吐血大甩卖。如果Fermi不能保持有竞争力的价格,那么市场前景堪忧,至少在国内市场不是那么乐观。
Fermi需要解决的问题中还要包括没有提及的功耗及发热,NVIDIA削减Tesla 20系列的规格就是因为功耗无法控制在合理水平。在当前呼吁绿色节能的大环境下如果Fermi显卡是一个高发热的电老虎,那么也会影响一些消费者的选择倾向。不过话说回来,愿意买而且有钱买Fermi显卡的用户中好像也不会有人在意功耗问题,发热问题更不会考虑,反正会有厂商推出散热更好的显卡。
15.总结
统一渲染器的出现为GPU开拓新的应用领域提供了一个发展契机,AMD与NVIDIA在如何实现统一渲染器的设计上也走了不同的道路,AMD改进SIMD架构设计出的5路超标量胜在实现难度小,占用晶体管数量少,虽然处理标量运算效率低,但是可以通过大幅提升流处理器单元的数量来弥补可能的性能劣势,所以我们可以看到AMD显卡从RV70的流处理器从RV670的320个基础上提高到800个,Cypress架构又再次翻番达到惊人的1600个。NVIDIA则采取了另外一条路,每个流处理器不再区分标量或矢量,全部按1D标量计算,因此显卡的计算效率很高,通用性较好,缺陷则是设计复杂,晶体管规模庞大。
双方更深层的不同还是显卡未来的发展方向,要理解这一点需要我们先确认两家公司业务上的不同。AMD收购ATI之后同时拥有了GPU和CPU业务,他们更愿意组合GPU和CPU的优势互相促进产品的销量,无论哪一个产品的销量好都能做到旱涝保收,他们并不乐见GPU抢占CPU的功能,所以对于GPU通用计算并不热心。反观NVIDIA,它的业务起家于GPU,但是将GPU的未来完全寄托于游戏显卡上是很危险的,3D技术发展到现在已经很难在画质上一次次地革命,消费者并不会为了一点画质改进就不断升级显卡,而且游戏主机也在不断侵蚀PC游戏的地盘,NVIDIA显然不能将显卡的未来全部放在游戏这一个篮子里,开发GPU的通用计算功能进而进军其他领域也就是水到渠成的事了。
与NVIDIA有着相似眼光的还有业界大腕Intel,不过Intel没有独立的GPU业务,擅长的X86处理器,所以Intel的如意算盘则是用精简后的X86指令抢占GPU的通用计算业务,Larrabee项目就是关键的棋子。Larrabee并非简单的游戏显卡(当然,这也会是它的目的之一),它的指令集源于精简后的X86指令,通用性更强。除了Intel可能推出的自有API之外,Larrabee也会支持目前开放的OpenCL、DirectX等标准。Larrabee不成功则已,一旦其性能达到一定水准,凭借Intel的生产能力和资金实力,AMD和NVIDIA的GPU业务都会受到巨大冲击。不过值得他们庆幸的是Larrabee的进展并不是那么顺利,第一代产品已经取消,后续产品可能要到2010年底才会发布。
本文用大篇幅回顾了DX10以来AMD与NVIDIA在显卡设计上的不同,对Fermi更是着墨众多,除了Fermi还未发布其身上的神秘之处颇多之外,更主要的是Fermi肩负双重使命,一是要终结AMD在DX11显卡上的一家独大局面,扭转目前被压制的颓势,毕竟这一年来NVIDIA没有实质意义上的新产品发布,仅靠马甲战略维持场面。Fermi的第二项重任则是继续开拓通用计算市场并最终分得一杯羹。经历G80/GT200两代产品的有益尝试之后,Fermi架构可以说是专为高性能计算而生,ECC纠错支持、PTX2.0指令、高速并行线程处理、完整的C++支持都是针对HPC(高性能计算机)需求而设计。
明年1季度发布的怪兽Fermi能否带来惊喜?
尽管面临的困难重重,Fermi依然要背水一战。NVIDIA通过Fermi是守得云开见月明亦或是折戟沉沙铁未销暂时无人得知。
Good luck,Fermi.
参考:
1. NVIDIA_Fermi_Compute_Architecture_Whitepaper
2. Anandtech:NVIDIA's Fermi: Architected for Tesla, 3 Billion Transistors in 2010
3. Realwordtech:Inside Fermi: Nvidia's HPC Push
4. techreport:Inside Fermi's graphics architecture