热点推荐
ZOL首页 > 显卡 > 评测 > 正文

改变翻天覆地 史上最全Fermi架构解读


分页浏览|全文浏览    【中关村在线 原创】 作者:濮元恺 | 责编:龚力成     评论
回到顶部阅读

Fermi架构第一印象

前言:在经过漫长的4年开发期之后,众望所归的Fermi“费米”架构GPU终于诞生,这款GPU身上凝聚了众多“第一”,打破了很多芯片设计的世界记录。而更为深远的意义在于,代号GF100的Fermi架构GPU产品,在保持图形性能的前提下,将通用计算的重要性提升到前所未有的高度。我们根据最近收集的资料,与所有关注显卡、关注游戏、关注通用计算的网友一起探寻Fermi架构的设计方向和性能特性。同时,我们共同期待两家厂商酝酿已久的GPU对决。现在离Fermi最后的发布,仅有1天时间,让我们共同期待。

Fermi“费米”架构第一印象

    ●一块40nm工艺,30亿个晶体管的大芯片

    由于庞大的运算资源、控制资源和缓存资源的加入,Fermi在设计之初,就没有考虑过小芯片战略,因为这是不可能做到的。所以即将登场的,是一块集成度高达30亿个晶体管的单管芯封装芯片,这是半导体工业的奇迹

    ●基于图形,但超越图形的GPU设计方案

    Fermi的众多特性,已经明明白白告诉用户,这不是仅为游戏或者图形运算设计的GPU,而是面向图形和通用计算综合考虑的成果。全局ECC设计、可读写缓存、更大的shared memory、甚至出现了分支预测概念……这次Fermi抛弃长期使用的“流处理器”称谓方式,更明确体现了NVIDIA的意图。

    ●一块4核心的GPU,因为它包含4个GPC

    GF100拥有这样的三层分级架构:4个GPC、16个SM、512个CUDA核心。每个GPC包括4个SM,每个SM包括32个CUDA核心。你可以认为GF100是一颗4核心(GPC)处理器,因为这个GPC几乎是全能的。


30亿晶体管的咆哮

    ●更大更全的缓存

    GF100核心,除同样拥有12KB的L1纹理缓存之外,其拥有真正意义的可读写L1缓存和L2缓存。GF100核心的设计思路直接导致GPU中首次出现了64KB的RAM支持可配置的shared memory和L1缓存。

    ●Tessellation细分曲面单元引入,带来几何性能大幅提升

    在这之前,3D显卡的几何性能的提升过程是非常缓慢的,从GeForce FX 5800到GeForce GTX 285,显卡的像素渲染能力提升了超过150倍,但是几何性能仅仅提升了不到3倍。DirectX 11要求的硬件Tessellation单元改变了这样的状况,Fermi更是将细分曲面单元做到了你不可思议的规模。

    ●TMU和ROP等后端单元的增强

    代号RV770的HD4870是AMD非常成功的一款产品,它用最小的晶体管消耗,打击了对手NVIDIA的痛处——GPU后端设计。所以我们看到在开启高倍AA等效果时,后端强大的GPU性能衰减能够得到有效控制。这次Fermi架构重点增强了GPU后端设计,而且力度不小。

    ●底层计算单元不断改进

    毫无疑问,G80到GT200以来,NVIDIA的MIMD架构流处理器设计一直是图形芯片中效率最高的,虽然它很耗费晶体管,但是以最后实际性能衡量,还是很划算的。这次Fermi延续了这种设计,但是在计算单元和周边资源方面做了扩充,更高精度和更小性能衰减是永远的目标。

    ●GPU设计更贴近应用,也更偏向CPU

    Fermi放弃了GPU固有的简洁明快的设计理念,转而向更深层次发展,但是更强的线程控制能力和周边资源的充沛度,已经让Fermi打开了“潘多拉魔盒”……NVIDIA如果能应付得了这些问题,将在GPU领域取得一系列突破,如果应付不了各种扑面而来的问题,这种设计所付出的代价有可能拖垮NVIDIA整个公司。

濮元恺所写过的技术分析类文章索引(持续更新)

 NVIDIA/ATI命运转折
GPU十年发展回顾

改变翻天覆地
最全Fermi架构解读

显卡只能玩游戏?
10年GPU通用计算回顾

通用计算对决
四代N卡激战CUDA-Z

从裸奔到全身武装
 CPU功能集成之路探秘

AMD统一渲染架构
历程回顾与评测

浅析DirectX11技术
带给图形业界的改变

摩尔定律全靠它
CPU光刻技术分析

我就喜欢
 "N饭"永不投诚语录

别浪费你的电脑
分布式计算在中国

从Folding@home项目
看GPU通用计算发展

 Computex独家泄密
解析AMD下代GPU

回到顶部阅读

图形性能与通用计算并重

图形性能与通用计算并重的设计方向

    代号GF100的Fermi设计方案在4年前确定下来并付诸行动,这时正值代号G80的Geforce 8800GTX做最后的出厂准备。G80凭借全新的MIMD(多指令流多数据流)统一着色器(又称流处理器)获得了业界的一致认同,同时被业界关注的还有G80的通用计算性能。

    NVIDIA的Tony Tamasi先生(NVIDIA高级副总裁,产品与技术总监)表示:“以前的G80架构是非常出色的图形处器。但Fermi则是一款图形处理同样出色的并行处理器。”

    这句话揭示了Fermi的与众不同,它已经不再面向图形领域设计了,因为更广阔的通用计算市场在等待它。Fermi将为通用计算市场带来前所未有的变革,图形性能和游戏被提及已经越来越少。


30亿晶体管的咆哮
NVIDIA公司在不断强调并行计算的重要性

    从NVIDIA处理器架构的发展来看,Tamasi先生的话意思很清楚。回顾历史我们可以发现NVIDIA最近几年间,大规模改进图形处理架构设计的是GeForce 6000(NV40)系列,之后就是GeForce 8000(G80)和GeForce GTX 200(GT200),最后就是Fermi。

    “CUDA Cores”是Fermi最基础的运算单元,将它的历史向上追溯首先是G80时代的统一着色单元(Unified Shader Model),我们在G80和GT200时代将它统称为流处理器(Stream Processor),再向上追溯可知,这个单元将Vertex Shader(顶点着色器)和Pixel Shader(像素着色器)合并而成。

    理论上说“CUDA Cores”只是起了一个好听的名字,让人们更看重GPU通用计算的作用,实际上我们在图形领域还是将它视为普通的流处理器。但这背后透露出NVIDIA公司的另一种计划——面向并行计算领域设计一颗芯片,并使其具备图形运算能力,这颗芯片由众多的“CUDA Cores”组成,运算速度主要由“CUDA Cores”的数量和频率决定。

    Fermi就在这种设计目标下诞生了,你可以说它不是GPU,因为它真的是一颗并行通用计算芯片,只不过它也能安装在显卡上帮你运行游戏。不过对于我们评测人员就比较麻烦,Fermi诞生之后,我们需要对它的底层运算性能和实际运算表现做评测,但是拿它和谁对比呢?是HD 5870,还是I7-965?

    似乎它们都没有可比性,也没有统一的评比标准。一切可以在Fermi上运行的程序,I7-965也能办得到,但是大规模并行速度惨不睹;很多Fermi能做的工作,HD 5870却做不了,因为它没有足够的周边资源诸如LDS(Local Data Share)支撑这么多流处理器同时运作,同时这颗GPU身上更找不到任何可读写的缓存。

    在没有了解Fermi的核心构成之前,很多人“CUDA Cores”概念嗤之以鼻,认为这是NVIDIA公司的营销策略,就像HD5870所拥有的1600个流处理器一样,实际上是320个SIMD单元。两家公司确实打了不少口水仗,无数玩家也跟着它们提出的概念升级了自己的显卡。不过这次Fermi改变名称和设计方向,是有备而来的。

30亿晶体管的咆哮
越来越多的机构和厂商意识到通用计算的重要性

    NVIDIA这次敢提出图形性能和通用计算并重,说明GPU设计的重点和难点都在通用计算方面而非图形。因为一颗已经演化了十年的GPU肯定能做好自己的老本行图形计算,但是要做通用计算,需要更强大的线程管理能力,更强大的仲裁机制,丰富的共享cache和寄存器资源以及充足的发射端……如果做不好这些东西,GPU永远都是PC中的配角,永远都是一颗流处理器。这些表面上看这些部件是极占晶体管的东西,更可怕的是设计这些部件需要太多科研成本和时间。

    Impress Watch网站知名IT评论人後藤弘茂称NVIDIA全新Fermi架构,是以处理器为目标进行设计的。因为你在Fermi身上可以看到以前GPU上从来没有的东西,包括更多的指令双发射、统一的L2全局缓存、64KB的可配置式L1或者Shared Memory、大量的原子操作单元等等。

    当然图形性能也毫不含糊,除了非常暴力的处理核心“CUDA Cores”之外,Fermi拥有强大的ROP和TMU单元,可以提供更高级别各种AA算法,并且有效控制性能衰减。Gather 4指令可以有效助力抖动采样实现更高画质。全新设计的PolyMorph Engine(多形体引擎)核心概念——Tessellation功能是必不可缺的,虽然这个概念由微软提出,由AMD率先应用在GPU上并坚持到HD 5870,但是这次呈现在我们面前的Fermi在Tessellation多数据并行计算方面遥遥领先HD 5870。

回到顶部阅读

Fermi运算单元构成模式

Fermi运算单元构成模式

    ●GF100整体架构

    GF100 GPU基于图形处理团簇(翻译为GPC),可扩展流阵列多处理器(SM)和内存控制器(MC)。一个完整GF100实现四个GPC,16个SM和6个内存控制器。通过对GPC的开启和关闭,对SM和内存控制器不同的配置,可以划分出满足不同价位的产品。所以我们也可以称GF100为一个4 GPC核心的GPU。


30亿晶体管的咆哮
Fermi架构GF100功能单元分布

    图中我们可以看到GF100的总线接口、GigaThread线程调度器、四个完整的GPC单元、六个内存控制器、六个ROP簇和768KB二级缓存。每个GPC单元包含四个多边形引擎。六个ROP簇紧邻二级缓存。

    CPU的命令通过Host Interface总线接口传输到GPU。在GigaThread引擎会从系统内存提取指定数据,并把它们拷贝到指定的显存。 GF100集成了6个64位GDDR5内存控制器(共计384位),以便获得高带宽和低延迟。然后GigaThread引擎创建并调度这些block到各个SM,其次再到warp(每个warp包含32个threads线程)交给CUDA Core和其他执行单位。在GigaThread引擎重新分配工作时,图形流水线上的各个单元如细分曲面和光栅化之类的单元也会继续工作。

    GF100拥有512个CUDA Core,它们属于16个SM单元,每个SM单元包括32个CUDA内核。每个SM是一个高度平行处理器,最多支持在任何规定时间完成对48个warp的处理 。每个CUDA Core是一个统一的处理器核心,执行顶点,像素,几何和kernel函数。一个统一的768KB二级缓存架构负责线程加载、存储和纹理操作。每组SM里四个纹理单元,共享使用12KB一级纹理缓存,并和整个芯片共享768KB二级缓存。每个纹理单元每周期可计算一个纹理寻址、拾取四个纹理采样,并支持DX11新的压缩纹理格式。

30亿晶体管的咆哮
Fermi架构GF100核心照片

    GF100拥有48个ROP单元,用来执行抗锯齿和原子内存操作。这48个ROP单元被分配为6组,每组8个,每组ROP配备一个内存控制器。内存控制器、L2高速缓存和ROP单元是紧密耦合的,也可以成组屏蔽。所有ROP单元和整个芯片共享768KB二级缓存(GT200里是独享)。

    关于运行频率,在每一组SM阵列里,纹理单元、一二级缓存、ROP单元和各个单元的频率也都完全不同于以往。除了ROP单元和二级缓存,几乎其他所有单元的频率都和Shader频率(NVIDIA暂称之为GPC频率)关联在一起:一级缓存和Shader单元本身是全速,纹理单元、光栅引擎、多形体引擎则都是一半。

    Fermi颠覆了G80以来的分频模式,曾今我们称固定单元的频率是GPU核心频率,而流处理器频率较高,它的速度是核心的2.15或者2.25倍。从Fermi开始“核心频率”就是流处理器频率(也可以称为GPC频率),而固定单元的频率默认为“核心频率”的一半,未来的超频模式肯定要发生变化了。

回到顶部阅读

Fermi GPC运算架构

    ●Fermi GPC运算架构

    我们可以这样认为:NVIDIA的第一代CUDA机构是从G80开始延伸至GT200,而GF100将是第二代CUDA架构产品。G80核心的诞生奠定了NVIDIA未来核心架构的主方向,并一直延续至GT200,当然在发展的过程中NVIDIA还是会对核心整体进行优化调整,但总体来说就是累积晶体管增加硬件规格,功能方面并无变化。反观Fermi,核心硬件规格数量相比GT200确实也有大幅增长,但是在产品整体架构上Fermi做了很大改动,可以说是颠覆性改动,它不仅仅是借鉴以前成熟的架构体系,还调整并在架构上新增功能模块,令Fermi不再简简单单的是图形核心,而是一个复合型功能核心。

    在NVIDIA产品进入DirectX 10的统一架构后,我们看到核心中引入了TPC(Thread Processing Cluster)、SM(Streaming Mulitporcessor)和SP(Streaming Processor)等新概念。例如,G80拥有8个TPC,每个TPC拥有2个SM,每个SM拥有8个SP,这种由繁化简的结构一直延续在NVIDIA的图形产品中。


30亿晶体管的咆哮
G80和GT200的TPC构成,图片来自Anandtech网站

    通过对比G80、GT200到GF100的发展模式,我们看到SM矩阵数量在减少,而每个GPC中SM数量和每组SM中SP数量在增加。在这中架构设计理念上GF100虽然是延续了G80的组成设计,但是每个组成模块的数量优化上有了大幅改变。

    GF100图形架构核心,从硬件的块数称为图形处理团簇(GPC)。每个GPC包含一个光栅引擎和四个SM单元。GPC是GF100占主导地位的高层次的硬件模块。除了计算单元它还包括两个重要特点——分别是一个可升级的光栅引擎(Raster Engine)、Z-cull和一个带有属性提取和细分曲面的多边形引擎(Polymorph Engine)。

30亿晶体管的咆哮
Fermi架构GPC架构图

    正如其名称所示,所有的GPC都集成了关键的图形处理单元。它包括顶点,几何,光栅,纹理均衡设置和像素处理资源。随着ROP单元功能的不断增强,一个GPC单元可以被看作是一个配置齐全的GPU,而GF100拥有4个这样的核心。

回到顶部阅读

并行几何处理流水线设计

    ●并行几何处理流水线设计

    传统的GPU几何单元设计使用了一个单片前端用来获取、装配和光栅化三角形。这种固定管线模式只能提供性能固定的并行执行内核数量。而随着应用程序的工作量不同,这条几何管线常常瓶颈或利用率不足。单一的几何处理管线在面对复杂的几何需求时,成为GPU性能的主要障碍。

    Fermi具备的光栅并行化是一个重要创新。NVIDIA称Fermi GF100是一个全新架构,不但是通用计算方面,游戏方面它也发生了翻天覆地的变化,几乎每一个原有模块都进行了重组:有的砍掉了,有的转移了,有的增强了,还有新增的光栅引擎(Raster Engine)和多形体引擎(PolyMorph Engine)。


30亿晶体管的咆哮
光栅引擎(Raster Engine)

    光栅引擎严格来说光栅引擎并非全新硬件,只是此前所有光栅化处理硬件单元的组合,以流水线的方式执行边缘/三角形设定(Edge/Triangle Setup)、光栅化(Rasterization)、Z轴压缩(Z-Culling)等操作,每个时钟循环周期处理8个像素。GF100有四个光栅引擎,每组GPC分配一个,整个核心每周期可处理32个像素。

30亿晶体管的咆哮
多形体引擎(PolyMorph Engine)

    多形体引擎则要负责顶点拾取(Vertex Fetch)、细分曲面(Tessellation)、视口转换(Viewport Transform)、属性设定(Attribute Setup)、流输出(Stream Output)等五个方面的处理工作,DX11中最大的变化之一细分曲面单元(Tessellator)就在这里。Fermi GF100产品中有16个多形体引擎,每个SM一个,或者说每个GPC拥有四个。

    凭借多形体PolyMorph引擎,Fermi实现了全首款可扩展几何学流水线,该流水线在单颗GPU中包含了最多16个Tessellation引擎。这些引擎在DirectX 11最重要的全新图形特性GPU加速Tessellation中能够发挥出革命性的性能。通过将更加细腻的几何图形融入到场景当中,Tessellation让开发人员能够打造出视觉清晰度极高、更加复杂的环境。锯齿边缘平滑了,从而使游戏中所渲染出来的人物能够拥有影院般细腻的画质。

    在以前的架构中,固定功能单元只是单一的一条流水线。而在GF100,无论是固定功能单元和可编程操作单元都并行设计,这大大提高图形性能,也解决了GPU长期以来未有重大突破的性能短板。

    多形体PolyMorph引擎的出现,是几何流水线近几年间不断演化的重大突破。特别是细分曲面操作,需要的三角形和光栅能力都异常可怕,传统GPU无法应对。多边形引擎的出现大幅度提高了三角形、细分曲面和流输出能力。通过给每个SM搭载属于自己的细分曲面Tessellation硬件单元,并为每个GPC搭载属于自己的光栅化引擎,GF100最终为我们提供了高达8倍于GT200几何性能。

回到顶部阅读

可读写缓存和Shared memory

大规模缓存和Shared memory引入及其意义

    为了增加计算单元的效能,更好地配合计算核心,降低存储器延迟,缓存的概念引入到功能处理器中,例如CPU现在已经拥有L1、L2和L3三个等级缓存,而在GPU中缓存概念还是十分模糊。主要原因是GPU的运算核心数量太多,缓存需求量太大,而另一个方面,在以往的GPU通用计算程序中,确实很少有用到缓存,特别是可读写的真正意义上的缓存。


30亿晶体管的咆哮
CPU和GPU功能性单元对比

    为了增加GPU的计算能力和计算效率,NVIDIA工程师大胆的将缓存概念引入到GF100中,自然引入缓存势必需要大量晶体管完成,在这点上与CPU道理相同。这样的选择要承担很大风险,但是面向应用设计的GPU必须进行改进,也必须直面问题而不能回避。为了在满足数据计算吞吐率的前提下,NVIDIA工程师为GF100设计了一套实用灵活的L1和L2。

    通过了解不同的成千上万的应用程序,NVIDIA工程师发现shared memory可以解决一部分程序的需求,但是不能解决所有的问题。一些应用程序天然需要shared memory,有些应用程序则需要缓存cache,有的既需要shared memory也需要cache。优化的内存设计可以既提供shared memory也提供cache,可以让程序员根据自己的需求来做选择。Fermi架构通过变化存储器的资源配置,可以同时支持这两种需求。

30亿晶体管的咆哮
Fermi架构可配置缓存结构

    GF100的每一个SM中拥有64KB的可配置片上缓存,可以设置为48KB共享缓存加16KB L1缓存,也可以设置为16KB共享缓存加48KB L1缓存。在之前的GT200核心中,并没有L1缓存的设计。L1缓存可以用于处理寄存器溢出、堆栈操作和全局LD/ST。过去,GPU的寄存器如果发生溢出,会大幅度增加存取时延。

    有了L1缓存以后,即使临时寄存器使用量增加,程序的性能表现也不至于大起大落,双精度等运算的衰减控制也将更为优秀。对于那些无法预知数据地址的算法,例如物理计算、光线追踪都可以从GF100的专用L1缓存设计中显著获益。共享缓存的设计则有利于多线程间数据重用,让程序把共享缓存当成缓存来使用,由软件负责实现数据的读写和一致性管理。而对那些没有使用共享缓存的应用程序来说,也可以直接从L1缓存中受益,显著缩减运行CUDA程序的时间。

30亿晶体管的咆哮
GT200和GF100架构缓存构成形式与容量对比

    Fermi有768KB的统一的L2缓存,可以支持所有的存取和纹理操作。L2缓存和所有的SM都相通。L2提供有效和高速的数据支持。有些算法不能在运行前就确定下来,像一些物理问题,光线跟踪,稀疏矩阵乘法,尤其需要缓存的支持。过滤器和转换器需要所有的SM都去读取相同数据的时候,缓存一样会有很大的帮助。

    而Fermi的对手代号R800的HD5870所具备的cache是不可随便调用的,HD5870的缓存实际上是传统的Texture cache,只不过现在可以用来临时释放结果做LDS(Local Data Share),不可编程,不可操作,不可写,只读。所以R800现在是16KB LDS+16KB cache,也就是说专用LDS只有16KB。

    这里顺便提及Fermi首次在GPU中引入全局ECC的作用。Fermi是第一款支持内存错误检查和修复(ECC)的GPU架构。在使用GPU做大数据量的处理和高性能计算的时候,ECC是有大量的需求。在医疗图像处理和大型集群中,ECC是最有用的特性。

    正常情况下的内存位的存储错误,都会引起软件的错误。ECC就是在上述错误没有多系统造成影响的情况下,用来检查和纠正这样的错误。由于这样的错误会根据系统的增大线性的增加,ECC就成为大型集群中必不可少的需求。

    Fermi架构GPU的寄存器,共享内存,L1缓存,L2缓存和DRAM内存都受到ECC保护,这样的设计部只是为了高性能的GPU应用,也是为了增加系统的可靠性,这是大规模部署Tesla等高端通用计算产品的前提。但是ECC技术是在原来的数据位上外加位来实现的,所以支持ECC技术的Fermi实现各种存储的代价,都要大于普通GPU。当然我们也找到另外一种说法称FermiDRAM ECC实现机制和传统CPU每8-bit增加一个位元的方式不一样,是一种专利方式。

回到顶部阅读

强大的线程调度能力

    ●强大的线程调度能力

    关于线程的调度问题,我们首先需要了解一些G80以来CUDA架构的线程关系。

    线程结构:CUDA将计算任务映射为大量的可以并行执行的线程,并且硬件动态调度和执行这些线程。Kernel以线程网格(Grid)的形式组织,每个线程网格由若干个线程块(block)组成,每个线程块又由若干个线程(thread)组成。实质上,kernel是以block为单位执行的,CUDA引入Grid只是用来表示一系列可以被并行执行的block的集合。各block是并行执行的,block间无法通信,也没有执行顺序。目前一个kernel函数中有一个grid,而未来支持DX11的硬件采用了MIMD(多指令多数据)架构,允许在一个kernel中存在多个不同的grid。


30亿晶体管的咆哮
线程、线程块和执行内核的关系

    Block:CUDA中的kernel函数实质上是以block为单位执行的,同一block中的线程需要共享数据,因此它们必须在同一个SM中发射,而block中的每一个线程(thread)则被发射到一个SP上执行。一个block必须被分配到一个SM中,但是一个SM中同一时刻可以有多个活动线程块(active block)在等待执行,即在一个SM中可以同时存在多个block的上下文。当一个block进行同步或者访问显存等高延迟操作时,另一个block就可以“趁虚而入”,占用GPU资源,最大限度利用SM的运算能力。

    Warp:在实际运行中,block会被分割为更小的线程束,这就是warp。线程束的大小由硬件的计算能力版本决定。在目前所有的NVIDIA GPU中,一个线程束由连续的32个线程组成。warp中的线程只与thread ID有关,而与block的维度和每一维的尺度没有关系,这种分割方式是由硬件决定的。以GT200的角度来解释,warp中包含32条线程是因为每发射一条warp指令,SM中的8个SP会将这条指令执行4遍。在硬件中实际运行程序时,warp才是真正的执行单位。虽然warp是一个由硬件决定的概念,在抽象的CUDA编程模型中并不存在,但是其影响力绝对不容忽略。

回到顶部阅读

SM双warp调度与并行指令

    ●SM单元的双warp调度能力

    Fermi的每一个SM都有两个指令发送单元,可以同时让两个warp相互独立的并发运行。Fermi的Dual warp调度机制可以同时并发调度两个warp的一条指令分别在16个一组的CUDA core上进行计算,或者在16个存/取单元运行,或者4个SFU上运行。Fermi的调度器并不需要在指令流之间进行附属检查。利用如此优美的双发射调度机制,使得Fermi可以让硬件的计算能力达到极致。


30亿晶体管的咆哮
Fermi架构的Warp运行关系

    在Fermi架构中,非常多的指令可以进行双发射,例如两条整数运算指令,两条浮点数运行指令,或者混合的整数,浮点,存取,和SFU特殊处理指令都可以被并发执行。单精度和双精度的指令一样可以并发执行。

    ●并行指令更自由

    NV不断充实周边资源,使用更激进的架构,而AMD不断扩大流处理器规模,都是为了更好的隐藏延迟。GT200架构已经可以控制SMIT活用跳转来在实现线程在不同的SM单元之间进行跳跃。命令单元为multi-thread模式,能够执行Out-of-Order指令,而当处理warp命令流时则是In-Order,而根据NV架构设计师John Nickolls的介绍,GT200架构实际warp中的线程也能够支持Out-of-Order。

    Fermi在每个SM前端都有两个Warp调度器和两个独立分配单元,和SM其它部分完全独立,均可在一个时钟循环里选择发送一半Warp,而且这些线程可以来自不同的Warp。分配单元和执行硬件之间有一个完整的交叉开关(Crossbar),每个单元都可以像SM内的任何单元分配线程(不过存在一些限制)。

    作为运算单元的CUDA核心在Fermi的SM每个单元中共2个组,每组16个,SFU有4组,载入/存储单元16个。这4个小组能够各自并行执行不同的Warp不同的指令。由于CUDA核心是16个一组,16线程并列会让物理vector变长。因此2个周期能够以32线程构成的单Warp的一个指令。载入/存储单元也同样如此。SFU因为是4线程并列,因此是以8周期执行1个warp。这样指令单元本身增加到了2个,各个指令单元能够每个周期发出2条指令。可以说Fermi实现的并行化指令自由度更高。

回到顶部阅读

GigaThread线程调度优化

    ●GigaThread线程调度优化

    Fermi架构的另一个重要特性,就是它的双层分布式调度机制。在片上的层面(SPA Streaming Processor Array,流式处理器矩阵级别),全局的分布式线程调度引擎(global work distribution engine)分发block到每一个SM上,在SM层面,每一个warp分布式调度引擎按照32个线程为一个warp执行。

    Fermi实现了SM级别的双发射,意味着SPMD(单线程多任务)的实现。从并行kernel下探到最底层,实际上就是靠的SM级别的双发射。SM级别的SPMD上升到GPU核心级别,Fermi就是MPMD(多线程多任务)。这种设计已经越来越像CPU,而且随着GPU的发展,每走一步,就多像一份。


30亿晶体管的咆哮
Fermi实现了SM单元级别的双发射

    第一代GigaThread线程调度引擎,在G80架构中实现了12288个线程的实时的调度管理。Fermi架构不只是增强了原有的机制,而且引进了更快的context上下文交换机制,并行kernel执行机制,增强了线程block的调度能力。Fermi的这项能力相对于上一代GPU提高了10倍。

    同时像CPU一样,GPU也可以利用context上下文交换机制来管理多任务的切换,每一个任务都可以用分时的方式利用处理器的计算资源。Fermi的运算流水线经过优化设计,把context上下文的切换时间减少到了10~20毫秒,极大的优化了上一代的GPU架构。不只是性能的提高,这个设计可以让开发者创建更快的kernel-to-kernel应用程序,例如让程序在图形和PhysX上的应用,图形与物理效果处理之间的运算也将受益于更快的context上下文交换机制。

●并行执行内核Concurrent Kernel Execution

30亿晶体管的咆哮
并行执行内核让资源利用更充分,计算速度更快

    Fermi支持kernel并发运行,同一应用程序的不同kernel可以同时运行在GPU上。Kernel并发机制可以让应用还曾向执行更多的kernel来发挥GPU的能力。例如,PhysX应用程序需要计算流体和固体,如果是串行执行,只能利用一半的线程处理器。Fermi的架构可以让同一个CUDA context的kernel都同时运行在同一个GPU上,这样可以更有效的利用GPU的资源。不同应用程序context的kernel函数也可以通过更快速的context切换,更快地运行在GPU上。

回到顶部阅读

细分曲面技术带来的变革

细分曲面技术带来的变革

    在游戏画面的生成过程中,我们一般看到的是3D画面的贴图,但是隐藏在贴图里面的还有3D画面的骨架——几何构图。3D画面的形成首先要构建几何构图,然后再进行渲染。几何构图越复杂,最终形成的物体表面就越接近现实。可以认为Tessellation细分曲面是DirectX 11为我们带来的最重要的革新。


30亿晶体管的咆哮
曲面细分示意图,曲面越复杂越接近真实

    DirectX 11提供的Tessellator单元本身不具备可编程性,因此DirectX11向Tessellator单元输入或者从中输出的过程是通过两个传统的管线阶段完成的:Hull Shader (HS,外壳着色器)和Domain Shader (DS,域着色器)。

    Hull Shader负责接收琐碎的图形数据和资料,而control points将会基于如何配置Tessellator来产生数据。可以说,Tessellator就是一个固定功能模块,用来处理一些基于一定参数的输入数据。最后Domain Shader将会接收由Tessellator产生出的点,并依照终点控制(control points)置换贴图将这些点形成一个合适的几何图形。

    实际上R6xx和R7xx硬件都具有Tessellation单元,但是由于Tessellation属于专有实现方案,是AMD的独有技术,因此应用并不算很广泛。而在AMD 的推动下,此次Tessellation成为了DirectX 11中的一个必备的部分,AMD长期不懈的坚持终于得到回报。

    在此之前,人们对低代价多边形操作法已经探索了近10年,从最开始的对三角形的fan操纵,到后来的龟裂和冲撞检查,这些方法可以实现曲面细分效果,但是对资源的消耗量太大不可控制。这次微软在DirectX 11中加入硬件Tessellation单元,我们可以视作曲面细分技术历经长时间的磨练后修成正果。虽然它不太符合通用处理单元的设计方向,但是如果计算晶体管的投入与性能回报,独立的硬件Tessellation单元是目前最好的选择。

    ATI一直强调的Tessellation是创造更多纹理细节、阴影以及平滑边缘的几何图形的最佳途径之一。而且,高级几何图形同时也需要真正的、完美的位移贴图。当前,大部分几何图形都是通过纹理渲染和某些诸如凹凸贴图、视差贴图之类的技术模拟实现的。开发者们采用Tessellation技术的话,我们可以看到非常逼真的物体效果,而且随着DX11的普及,NVIDIA以及AMD最终将会从Tessellation技术中获益。

    GF100拥有更多的PolyMorph(多形体引擎),是以SM(流处理器)为单位分配的,拥有多达16组。多形体引擎则要负责顶点拾取(Vertex Fetch)、细分曲面(Tessellation)、视口转换(Viewport Transform)、属性设定(Attribute Setup)、流输出(Stream Output)等五个方面的处理工作。

30亿晶体管的咆哮
Tessellation效果性能对比

    DirectX 11中最大的变化之一细分曲面单元(Tessellator)就在这里,因此GF100的理论Tessellation性能将会远超HD 5870(核心代号Cypress),因为Cypress只有一个Tessellator单元。这些硬件上的设计,让GF100在进行Tessellation操作时,性能下降很少。

    总体来看,Fermi的多形体引擎相对于以前绝非几何单元改头换面、增强速度而已,它融合了之前的固定功能硬件单元,使之成为一个有机整体。虽然每一个多形体引擎都是简单的顺序设计,但16个作为一体就能像CPU那样进行乱序执行(OoO)了,也就是趋向于并行处理。NVIDIA还特地为这些多形体引擎设置了一个专用通信通道,让它们在任务处理中维持整体性。

    当然这种变化复杂得要命,也消耗了NVIDIA工程师无数的精力、资源和时间。有一种传言说,多形体引擎是GF100核心变化的重要组成部分,也是GF100无法在去年及时发布的最主要原因。这么做也是不得已而为之。考虑到细分曲面单元的几何复杂性,固定功能流水线已经不适用,整个流水线都需要重新平衡。通过多形体引擎的并行设计,几何硬件不再受任何固定单元流水线的局限,可以根据芯片尺寸弹性伸缩。

回到顶部阅读

游戏画质进一步改善

游戏画质进一步改善

    由于ROP和TMU单元的资源空前充沛,Fermi可以给玩家更好的游戏画质体验,包括更先进的采样技术和性能衰减更小的抗锯齿加速。

    代号RV770的HD4870是AMD非常成功的一款产品,它用最小的晶体管消耗,打击了对手NVIDIA的痛处——GPU后端设计。所以我们看到在开启高倍AA等效果时,GPU的性能衰减能够得到控制。而这次Fermi架构也增强了后端,而且力度不小。

    众多资料中,我们首先了解到的是Fermi架构的GF100所支持的Gather4抖动采样指令。DirectX 11详细定义了显卡需要提供的特性,但对渲染后端的工作涉及甚少,所以NVIDIA做了多形体引擎,还有抖动采样。抖动采样不是新技术,长期用于阴影贴图和各种后期处理,通过对临近纹素(Telex/纹理上的像素点)进行采样来创建更柔和的阴影边缘。它的缺点也是非常消耗资源。

    DirectX 9/10上抖动采样是分别拾取每一个纹素,DirectX 10.1开始改用Gather4指令,NVIDIA则在硬件上使用单独一条矢量指令。NVIDIA自己的测试显示,这么做的性能大约是非矢量执行的两倍。


30亿晶体管的咆哮
Gather4抖动采样指令细节图解

    Gather4指令,使四个纹理映射到一个128×128的单纹理指令像素。GF100的DirectX 11实现4倍节省硬件资源的Gather4,大大加快阴影映射、环境闭塞和后期处理算法。随着抖动取样的应用,游戏可以实现平滑柔和阴影或自定义纹理过滤效率。对游戏开发者来说,这意味着消耗的硬件资源更少;对游戏玩家来说,则意味着更好的画质。

    在采样过程优化的同时,游戏玩家关注的抗锯齿效果也在不断发展。CSAA全称 Coverage Sample Anti-Aliasing(覆盖采样抗锯齿),G80时代已经被NVIDIA引入,不过当时只支持到16X,Fermi将这个数值提升到了32X,并且将色彩取样和覆盖取样分开处理:8个色彩取样,24个覆盖取样,画质和性能都显著提升。

30亿晶体管的咆哮
8X和32X CSAA的效果对比

    Alpha to Coverage可以使用全部采样点,拥有33个透明级别,上图是GT200不使用覆盖采样与GF100采用32X CSAA的效果对比,32X CSAA效果更为温润出色。相比传统的抗锯齿模式,Fermi执行CSAA性能下降非常低,32X CSAA性能下降只有传统8X的0.7%左右。

    这一切性能衰减方面的优秀表现,都离不开NVIDIA对GF100的ROP和TMU单元做出的改进。关于GPU后端这部分资源,我们将在以后的评测中为大家详细分析。

回到顶部阅读

底层计算单元的改进(一)

底层计算单元的改进和效果

    虽然在CUDA概念里,CUDA core或者SP就是一个内核,但是从目前实现的硬件整体而言,CUDA core其实只是一个功能单元而已。真正能比较接近于我们常说的内核,则是CUDA core的上一级——Streaming Multiprocessor(简写为SM),因为目前只有在SM这一级才具备Program Counter(程序计数器)、调度资源以及分离的寄存器堆块。


30亿晶体管的咆哮
一个CUDA Core运算核心的构成

    Fermi的每个SM拥有32个高性能CUDA Core——这是四倍于G80/GT200的设计,每个CUDA core都有全流水线化的整数算术逻辑单元(ALU)和浮点单元(FPU)。Fermi的ALU几乎采用完新的设计,支持64bit和扩展的精确的指令运算,同时支持计算,移位,布尔值,比较,转化和更多的指令操作。

    Fermi的所有流处理器现在都符合IEEE 754-2008浮点算法(AMD的Cypress架构也是如此)和完整的32位整数算法,而后者在过去只是模拟的,事实上仅能计算24-bit整数乘法;同时Fermi全面引入了积和熔加运算(Fused Multiply-Add/FMA),每循环操作数单精度512个、单精度256个(G200仅支持单精度FMA)。所有一切都符合业界标准,计算结果不会产生意外偏差。

    和MAD(multiply-add)指令相比,Fermi所支持的FMA指令在做乘运算和加运算的时候只在最后运算的时候作一次舍入,不会在执行加法的时候就出现精度损失,精度比把操作分离执行更高。当然我们需要了解的是,GT200在执行双精度浮点运算的时候,使用的是FMA指令,这就证明GT200时代SM中的DPU双精度单元已经成熟满足了FMA指令所需的硬件要求。

30亿晶体管的咆哮
FMA指令在精度上的优势

回到顶部阅读

底层运算单元改进(二)

    ●4个特殊功能单元Four Special Function Units (SFU)

    特殊函数处理单元处理超越函数,包括sin、cosine、求倒数、平方根。每一个SFU在一个周期内每一个线程可以执行一个指令操作,每一个warp执行需要8个周期。指令分发器可以按照当前SFU的运行情况来分发指令,当一个SFU在进行运算的时候,可以将指令分发到其他的SFU处理单元。
 
    ●双精度设计Designed for Double Precision

    Fermi的双精度浮点(FP64)性能也大幅度提升,峰值执行率可以达到单精度浮点(FP32)的1/2,而过去只有1/8,AMD现在也不过1/5,比如Radeon HD 5870分别为单精度2.72TFlops、双精度544GFlops。由于最终核心频率未定,所以暂时还不清楚Fermi的具体浮点运算能力(双精度预计可达624GFlops)。

    双精度的浮点计算在高性能计算中有着核心的重要位置,在求解线性代数中,数值计算量子化学中都会需要双精度浮点运算。Fermi架构为支持双精度浮点运算进行了特别设计每一个SM在一个时钟周期内可以完成16个双精度浮点数的FMA操作。是在GT200架构以后又一激动人心的设计。


30亿晶体管的咆哮
双精度运算中Fermi架构的性能提升

    ●快速原子内存操作

    在多进程(线程)的操作系统中不能被其它进程(线程)打断的操作就叫原子操作,文件的原子操作是指操作文件时的不能被打断的操作。原子操作在并行计算中非常重要,它可以让线程对共享的内存结构做正确的读写操作。

    原子操作包括add、min、比较和交换、读、修改和写操作,它们都不用打断其他的正在运行的线程。原子操作被大量使用在并行存储、缩减和并行的建立数据结构中,而不需要锁定线程的执行。

30亿晶体管的咆哮
Fermi原子操作能力提升

    大量原子操作单元和L2缓存的使用,大大增强了FermiGPU架构中的原子操作能力。在相同位置的原子操作,Fermi的速度比GT200快20倍,连续的内存操作是GT200的7.5倍。

    在GPU支持的内存寻址空间方面,GT80/GT200都是32-bit的,最多搭配4GB GDDR3显存,而Fermi一举支持64-bit寻址,即使实际寻址只有40-bit,支持显存容量最多也可达惊人的1TB,目前实际配置最多6GB GDDR5——仍是Tesla。

    同时Fermi统一了寻址空间,简化为一种指令,内存地址取决于存储位置:最低位是本地,然后是共享,剩下的是全局。这种统一寻址空间是支持C++的必需前提。而以前的架构里多种不同载入指令,取决于内存类型:本地(每线程)、共享(每组线程)、全局(每内核)。这就和指针造成了麻烦,程序员不得不费劲清理。

回到顶部阅读

费米首次引入游戏计算架构

首次引入游戏计算架构

    过去的GPU在处理游戏中的图形运算时,几乎不能做其他操作。唯一可以做的就是在支持PhysX物理效果的游戏中提供一定的物理运算支持。游戏中的AI(人工智能)、景深、光线追踪等等效果,都是依赖CPU运行的。GPU无法对其进行加速。

    Fermi架构引入的游戏计算架构(Compute Architecture for Graphic),打破了这一传统。随着通用计算的盛行,专业领域和民用领域都前途无量,NVIDIA CUDA并行计算架构就会在GF100Fermi架构中继续发扬光大,而且用途更加广泛,单就游戏而言受益也是多方面的。

    可编程着色器的运算性能近年来有了很大的进步。展望未来,可编程仍然在GPU中将继续充当压倒一切的重要性,它可以让开发人员能够创建新一代的视觉效果。光栅化(Pasteurization),光线跟踪(ray tracing)和雷耶斯法(Reyes)是众所周知的一般渲染算法。截至Fermi出现之前,GPU的设计仍然纯粹为光栅化。开发人员继续寻找新的方式来改善他们的图形引擎,GPU则需要善于多样化和不断增长的图形算法集。由于这些算法是通过一般通用计算API,所以GPU的运算能力对一个强大的计算架构的执行效率是至关重要的。从本质上讲,可以认为游戏计算架构是一种新的可编程着色应用。

    GF100的计算架构是设计之初就考虑到射线追踪。GF100是第一款GPU硬件支持递归,可以高效的实现光线追踪算法和其他图形算法的GPU。GF100的L1和L2缓存大大提高光线追踪性能,改善就细粒内存访问的效率。L1缓存提高了邻近的光存储效率,而二级缓存,进一步放大了整个处理系统的存储带宽。

    CUDA架构的实现途径多种多样,CUDA C、CUDA C++、OpenCL、DirectCompute、PhysX、OptiX Ray-Tracing等等。这其中既有NVIDIA自己似有的开发方式,也有开放的业界标准规范,开发商可以自由选择。


30亿晶体管的咆哮
GPU游戏计算架构实例

    在游戏中,NVIDIA CUDA计算架构可以执行画质处理、模拟、混合渲染等等,实现景深、模糊、物理、动画、人工智能、顺序无关透明(OIT)、柔和阴影贴图、光线追踪、立体像素渲染等大量画面效果。

    NVIDIA还宣称,GF100的游戏计算性能相比GT200有了大幅提高,比如PhysX流体DEMO演示程序3.0倍、《Dark Void》游戏物理2.1倍、光线追踪3.5倍、人工智能3.4倍。

    下面简要介绍几个GPU游戏计算的实例:《地下铁2033》是近期推出的一款FPS游戏,其景深效果的计算就采用了DirectCompute。采用以往传统的后处理方式效果并不能让人满意,而采用皮克斯的技术则系统资源消耗则会太大,而采用CUDA则能很好的协调技术研发者和游戏开发者之间的工作。

30亿晶体管的咆哮
GPU游戏计算架构模拟出非常真实的景深效果

    Capcom发售的Dark Void就利用了NVIDIA APEX Turbulence模块技术,用来表现机械和武器的开火和粒子效果。

    CUDA还可以用于游戏的AI寻路计算,可以高效的计算最短路径,并可以做冲突预测,GF100在寻路方面以提供三倍于GT200的性能。

    流体模拟基于粒子层次,模拟超过128000个粒子互动,甚至包括液体表面张力计算,GF100可以提供两倍于GT200的性能,这样的技术可以广泛应用于游戏的水流、泥浆和血液等流体的物理特性模拟。PhysX 3.0得益于并行核心程序执行,相比之前性能可以有20-40%的提升,而在实际游戏应用中性能提升会更为明显。

    GF100的光线追踪采用光栅化和光线追踪组合的方式,主要光源依然采用光栅化,而阴影和反射采用光线追踪的方式,GF100得益于新的缓存架构在这一应用中可以提供四倍于GT200的性能。

回到顶部阅读

费米是否挑战半导体极限

Fermi是否挑战半导体工艺极限

    一颗拥有了众多改进并且重新设计的GPU芯片,总是能引起我们的无限遐想。Fermi架构的GF100核心拥有多大的理论浮点值我们在文中几乎没有提及过,而让我更着迷的是Fermi如何继承G80和GT200的优秀传统,将实际和理论的差值降到最小。

    前文已经告诉大家,Fermi用追加大量的寄存器和线程调度资源解决了这一问题,让编程者不再迷茫怎样改写程序才能达到最佳状态,用户也不必担心自己的GPU会不会因衰减太过严重而远离标称性能。

    但是以上两项改进,让Fermi付出了太大的晶体管代价,有人甚至疑惑Fermi是如何在一块芯片上装进了512个CUDA核心,也有人称这种行为是NVIDIA赌博式的激进,最终要付出代价……

    实际上Fermi面临的问题在两个层面,首先是半导体物理学极限。普遍观点认为过高的晶体管集成度会给一块芯片造成不能承受的发热和功耗,但是如何量化“过高”这个概念?实际情况是Fermi的30亿个晶体管在应用40nm工艺时,尚未触碰这个问题。我们得到的消息是Fermi的运行频率和功耗都可控,最主要的一点是GTX480功耗在250W左右,没有超越PCI-E 2.0规范要求的300W。


30亿晶体管的咆哮
台积电40nm工艺内部互联层示意图

    但是GPU芯片的内部互联线长数据大家可以仔细对比。据我们了解,R600的内部互联线长达到19000公里,RV770到了27000公里,如果RV770不换掉ringbus环形内存总线,线长可能要超过40000公里,现在R800在AMD的全力改进下稳定在了36000公里。理论上基于IC设计层面,R800还可以继续扩展规模,但是实际操作中几乎已经不可能了。IC设计中,不是晶体管多内部互联线长就会过度,要看芯片具体结构,大量重复的单元才会导致线长急剧放大。

    内部互联线长对芯片互联层数提出了极高要求,ATI一味增加GPU重复单元(流处理器)的做法,导致AMD手头已经没有继续上攻互联层的技术储备了,目前是9/14,既逻辑互联层为9,物理互联层为14。

30亿晶体管的咆哮
AMD自R600时代开始重复单元急剧膨胀

    而NVIDIA的芯片规模一直较大,却拥有各种复杂的非重复单元,最后使得硕大的GT200芯片拥有不到20000公里的内部互联线长,这个值小于AMD目前最大的GPU核心R800只是和曾今的R600差不多,N卡的互联线长平均只有同代A卡的60%。Fermi的具体数据尚不得而知,但是我们根据GPU内部单元设置,推测在线长方面Fermi没有障碍。

    最终的芯片面积方面,R800核心面积334mm2,FermiGF100核心面积576mm2,新工艺的启用使得两者都比不上55nm工艺的GT200b大。更稀松的芯片布局使得Fermi没有挑战到半导体工艺的物理极限,同时对供电的需求并不算太高,较大体积的芯片,唯一需要挑战的就是最终良品率。

30亿晶体管的咆哮
Fermi架构面临的大芯片问题

    大个头的Fermi架构面临的问题是完全不可回避的。如上图所示,根据BSN原来的估计,每片300mm晶圆所能产出的GF100最大片数为130片。不过后来他们得知GF100芯片的真实尺寸为24x23.9mm(或24x24mm),这个数值据称与65nm制程的GT200 GPU核心尺寸完全一样,面积均为570平方毫米。这样经过计算,每片300mm晶圆上能产出的最大GF100片数为94个。

    GF100在A1步进制程时,每片300mm晶圆上产出的合格GF100芯片只有9片,也就是说良率仅不足10%,A2步进制程的出台便顺理成章了,不过据BSN掌握的消息显示,A2步进的良率大约是25%左右,也就是说每片300mm晶圆能产出24-26片合格芯片,这样每片芯片的价格在208美元左右,这种价格已经接近两片AMD Cypress芯片R800核心的价格。目前上市的则是A3制程的Fermi核心,良品率进一步提升,但价格还是明显高于R800芯片。我们分析得出Fermi虽然没有挑战半导体工艺极限,但是至今还是受成本压制,如果良品率不能得到有效提升,NVIDIA很难将投入产出比最大化。

回到顶部阅读

聚焦未来GPU发展方向

聚焦未来GPU发展方向

    从SIGGRAPH 2003大会首先提出GPU通用计算概念,到NVIDIA公司2007年推出CUDA平台,再到今天Fermi架构面向通用计算领域设计。越来越多的信号告诉我们,GPU通用计算是一片正在被打开的潜力巨大的市场。

    GPU通用计算目前遇到的最大障碍,其实来自GPU一贯的架构设计。由于GPU无法摆脱传统的图形加速器身份,而图形领域SIMD和VLIW是数据并行性和操作并行性的典型结构。

    ●SIMD架构的尴尬

    SIMD适合多媒体中的分组数据流,通过特定算法将长的数据流截成定长短向量序列,从而可以和向量处理器那样实现对定长短向量序列的高效处理。VLIW具有的优点是:指令操作域定长,译码简单;适合流水处理,减少CPI;编译器需要开发程序潜在的指令级操作并行性。VLIW指令字较长,而SIMD具有很强的数据压缩能力。事实上,传统观点一直认为VLIW和SIMD技术相结合可以获得更高的性能加速比,且非常适合多媒体数据处理。


30亿晶体管的咆哮
AMD与NVIDIA的GPU流处理器单元对比

    AMD从R600核心开始,一直延续着上述理念设计GPU产品,R600身上有很多传统GPU的影子,其Stream Processing Units很像上代的Shader Units,它依然是传统的SIMD架构。这些SIMD架构的5D ALU使用VLIW技术,可以用一条指令完成多个对数值的计算。

    由于内部的5个1D ALU共享同一个指令发射端口,因此宏观上R600应该算是SIMD(单指令多数据流)的5D矢量架构。但是R600内部的这5个ALU与传统GPU的ALU有所不同,它们是各自独立能够处理任意组合的1D/2D/3D/4D/5D指令,完美支持Co-issue(矢量指令和标量指令并行执行),因此微观上可以将其称为5D Superscalar超标量架构。

    SIMD虽然很大程度上缓解了标量指令执行效率低下的问题,但依然无法最大限度的发挥ALU运算能力,尤其是一旦遇上循环嵌套分支等情况,SIMD在矢量处理方面高效能的优势将会被损失殆尽。同时VLIW的效率依赖于指令系统和编译器的效率。SIMD加VLIW在通用计算上弱势的原因就在于打包发送和拆包过程。

    ●MIMD架构的改进

    NVIDIA从G80开始架构作了变化,把原来的4D着色单元彻底打散,流处理器不再针对矢量设计,而是统统改成了标量运算单元。每一个ALU都有自己的专属指令发射器,初代产品拥有128个这样的1D运算器,称之为流处理器。这些流处理器可以按照动态流控制智能执行各种4D/3D/2D/1D指令,无论什么类型的指令执行效率都能接近于100%。

    AMD所使用的SIMD架构流处理器,具有非常明显的优势就是执行全4D指令时简洁高效,对晶体管的需求量更小。而NVIDIA为了达到MIMD流处理器设计,消耗了太多晶体管资源,同时促使NVIDIA大量花费晶体管的还有庞大的线程仲裁机制、端口、缓存和寄存器等等周边资源。NVIDIA为了TLP(线程并行度)付出了太多的代价,而这一切代价,都是为了GPU能更好地运行在各种复杂环境下。

    ●NVIDIA遇到的障碍

    TLP线程并行度的设计方向是近年来NVIDIA公司GPU设计的主要目标。展望未来GPU发展,以下几个问题是必须解决的。首先是分支预测能力,GPU需要拥有更好的分支能力,才能运行更多复杂程序,更好的利用cache来掩盖分支的延迟;然后是更大的缓存和Shared memory(AMD称之为LDS ,Local Data Share),这种共享寄存器负责共享数据和临时挂起线程,容量越大,线程跳转和分支能力就越强;线程粒度同样重要,粒度越细能够调用并行度来进行指令延迟掩盖的机会越大,性能衰减越小。细化粒度对GPU的线程仲裁机制要求很大;同时大容量缓存的可读写性也是必须具备的……

    除此之外实现更高水平的通用计算还有很多棘手的问题,现在它们已经被摆到NVIDIA面前。NVIDIA沿着自己设定的方向,却用自己的产品打开了GPU领域的“潘多拉魔盒”,Fermi架构到底该如何看待,更是带给业界前所未有的思考。

    2009年在加州圣荷西召开的NVIDIA发者大会上美国橡树岭国家实验室宣布一项新超级计算机计划,将用来研究能源与气候变迁,速度可望比目前最快的超级电脑更快十倍。其将采用的正是NVIDIA整合30亿个晶体管的GPU——“Fermi”架构GF100。

    橡树岭的电脑与运算科学实验室副主任Jeff Nichols在声明中表示:Fermi GPU可促成以往不可能实现的“重大科学突破”。他说:“借由NVIDIA的技术支持,橡树岭能创造一个能提供亿亿次(exascale,10的18次方)运算的运算平台。”亿亿次运算是超越目前千兆次(petaflop)运算1,000倍的技术,达到每秒100万兆次运算。此后又有消息称NVIDIA将和微软合作,开发使用Tesla高性能计算卡的基于Windows HPC Server 2008平台的集群服务器。这些信号都标志着NVIDIA已经正式进入超级计算机市场。

30亿晶体管的咆哮
美国橡树岭国家实验室关于Fermi混合运算架构的研究

    Fermi的分支能力虽然得到增强,但它依然不是分支预测,而是分支论断(predication),这一步的提升在以前是不敢想象的。在Fermi中为这一功能的初步实现提供了一个独立单元,它和仲裁器、Atomic单元的地位一样重要。分支论断只能算是分支预测的雏形或前身,需要的硬件开销的也较小,但这还是给NVIDIA带来了很多难题。

    更大的缓存更是遥不可及,无论是Shared memory还是cache,这些缓存空间的提升需要半导体工艺的强大支持,因为这部分缓存和CPU一样使用6T SRAM晶体管,SRAM的每一个比特位需要占用6个晶体管,存储密度较低,1MB容量的二级缓存就需要占用5000万个晶体管,这是一个相当惊人的数字。

    缓存的可读写性带来了很多问题,它包括缓存一致性协议,缓存的命中率等问题,这些问题每年要消耗Intel和AMD等CPU制造公司很多研发力量,而Fermi的诞生,只能把NVIDIA也牵连进来。

    面对前方无尽的障碍和难题,我们似乎有些悲观,其实大可不必这样,GPU发展到今天,已经突破了无数技术屏障,虽然你很难想象一个最初因图形处理而诞生的硬件,今天竟然成为大规模并行计算领域的明星,但事实就是这样。NVIDIA花费巨大精力设计出的Fermi架构不但为NVIDIA打开了通用计算领域更广阔的空间,带来了可观的利润,也打开了GPU设计领域的“潘多拉魔盒”,更多以前不可想象的功能也正在GPU芯片中不断实现。

    在文章最后让我们一起回忆文章开始时那句经典的评论:“Fermi是一款图形处理同样出色的并行处理器。”不用怀疑,Fermi所代表的正是未来GPU的发展方向。

 

———————————————————————————

本文参考文献:

[1] NVIDIA GF100 Graphic Architecture Whitepaper GF100图形架构白皮书
[2] NVIDIA Fermi Architecture WhitepaperFermi架构计算白皮书
[3] 零距离接触NVIDIA GF100
[4] Fermi秘史 揭秘难产核心前生今世的故事
[5] 以处理器为目标 NVIDIA全新Fermi架构解析
[6] DX11先锋 ATI HD 5870震撼视觉超详解
[7] NVIDIA Fermi 体系架构技术预览
[8] BSN:Nvidia GF100 Fermi芯片成本分析
[9] 流处理器缘何差6倍A-N GPU架构解析

频道热词:华硕主板  Intel  AMD  
视觉焦点
显卡评测热点
排行 文章标题
TOP10周热门显卡排行榜
  • 热门
  • 新品