NVIDIA新武器“Fermi”DX11架构解析
第1页:略显神秘的NVIDIA“原子弹”Fermi
现在看来,公元2009年在计算机硬件发展史上注定不会是平凡的一年,特别是在图形处理器方面,AMD在今年9月推出了新一代支持Directx 11技术的代号为“Cypress”的图形处理器,而NVIDIA也不甘人后,同样在近期向我们揭开了Fermi架构的神秘面纱。
NVIDIA于11月中旬首度展示"Fermi"实物
如果你从Fermi发布伊始就开始关注它的话,那么你就会发现NVIDIA并没有真正地谈及过Fermi的具体性能参数和晶体管数量。而我们本文的目的就是一探究竟,参考的信息主要是官方白皮书和从NVIDIA工程师口风中获得。
“为什么NVIDIA只介绍Fermi的计算性能?”这个问题相信很多人都会问。也许大家已经注意到了,NVIDIA公司最近几年都是有意在向非图形应用方向发展。比如G80的推出,同步现身的还有CUDA,这意味着那些希望通过GPU处理非图形应用的人们终于有了一个平台。该图形处理器功能非常强大,同时CUDA也为高级图形渲染编程带来了新的途径。
Fermi核心架构图
作为在GPU架构计算上的一次尝试,我们已经看到了NVIDIA的CUDA与AMD的Stream技术展开了激烈的竞争,而OpenCL现在也开始允许开发者在不影响GPU性能的情况下实现跨平台开发,同时微软现在也有了DirectCompute,一种可以在更多非图形的模式下充分利用设备的技术。还有我们不能忽视的就是Intel对Rapidmind的成功收购。
GPU计算如今正在成为一个大产业,NVIDIA公司和其它公司一样正在努力地进入到这个拥有极大增长潜力的新兴产业中去。我们已经看到了GPU计算的市场份额正在不断增长。
在GPU技术峰会上,NVIDIA选择了对Fermi的图形晶体管数量持保密态度。当然这样做也是为了保留竞争力。简单得说就是“为什么要把我们产品的竞争力提前透露给AMD呢?”,当然,也许还有另一种可能就是目前Fermi还无法进行真实硬件平台的性能评测。
NVIDIA针对高性能计算市场推出的GPU通用计算产品Tesla
Fermi将会是NVIDIA首次将注重点放在了硬件计算领域上的一款产品。超级计算机以及其它大型计算设备将会因为Fermi在通用计算上的优势而受益。因此在图形处理方面被“间接”地放置在一个次要的位置上。不过可以肯定的是,Fermi依然是GPU,依然会坚地维护在图形处理领域上的优势。#p#page_title#e#
在我们开始细节讨论之前,先对Fermi架构整体进行一下了解还是很有必要的:首先我们看到的是Fermi的基本架构图,NVIDIA之前的D3D10级产品在每个簇(TPC)里均配备有多个shader multiprocessors (SM),一般是2-3个,这主要取决于架构的演变。G80及其系列产品均为2个SM,每个SM拥有8个标量单元组成。
基于G80的产品包括有GeForce 8800 GTX 和GTS,配备有8个TPC。一些衍生产品则屏蔽掉了其中的一个TPC(以及ROP)。NVIDIA在17个月之前推出了GT200,属于高端产品。该产品对TPC进行扩展,包括有3个SM单元,每个SM单元均配备有单个双精度浮点运算单元。通过这个双精度浮点运算单元的支持,可以让开发商及时获得相关的功能。
Fermi配备有单个SM单元,每个SM相当于2个16路向量模块。因此子块配置将会是Fermi架构配置的关键。在nVIDIA的官方白皮书中看到GF100配备了2个不同的子块,每个子块配备有16个SM单元。
每个子块均配备有SFU单元,可进行特别硬件访问以及矢量单元插值,实现一个线程组或warp的8个时钟周期。此后NVIDIA指出TPC拥有独立的载入/存储单元,同时每个SM拥有64KB分段共享内存和L1缓存。缓存可以被配置成16/48 或48/16 KB。每个子块由于执行相同的warp,因此均可以相互间共享互访。
该芯片使用L2缓存满足所有内存控制器I/O的需求,同时任意来自TPC的对L2缓存的写入对于芯片上其它TPC都是可见的。该缓存的设计与当前nVIDIA架构的设计存在明显的不同,这也是其以计算性能为主的一个关键。图形处理对于内存子系统管理来说是件高度本地化的任务,因此GPU缓存一直以来都比较小,因为本地化操作意味着你不需要将所有的数据读入缓存以满足所有的内存读取的需求。同样的,非图形计算能够引进非本地存储器存储空间以及随机存取模式,因此配备更大统一的L2缓存可以实现加速。同时芯片上所有的内存从寄存器到DRAM都可以受到ECC保护。
至于智能调节方面,这里有全局调度器和每个Fermi芯片前的逻辑芯片,能够为每个SM线程调度器实现初步调度。每个SM均配备了一些核心和状态跟踪的逻辑芯片、缓存以及传输芯片。由于Fermi芯片的每个SM均可以运行不同类型的线程,因此前端必须每个SM的指令流。
虽然SM能够在每个时钟周期运行2条指令,由于调度器的问题,会存在解码指令的单独缓冲队列。NVIDIA没有透露队列的深度,不过可以确定的是队列和解码器均可以保护芯片达到最高速度。
新的SM调度器,可以在一个块里让2个warp独立的并发运行。NVIDIA表示这里有2个调度器,但是可信度不高。warp的延迟需求是老的D3D10设计的一半,需要2倍数据的warp去消除相同内存存取的延迟。
双warp可以实现SM的混合指令执行,同时由于warp的线程在数字和执行指令上是独立的,同时由于是子块管理,因此指令的混合是灵活的。32-bit IMUL可以在一个子块使用一个半warp执行。
在Fermi之前,芯片的主要部分主要为计算内核。硬件可以一次运行一个核心,并且是连续的,不过需要在CUDA runtime 的帮助下。而现在计算核心可以属于SM层。总的来说,Fermi的运行与G80是一样的。这是一个梯级架构,每个矢量管线都专门应用于单个物体计算,数据并行应用以及将数据附属问题降至最低。#p#page_title#e#
Fermi的分歧是在warp层产生,因此为32个对像调度。硬件方面现在可以预测几乎所有的指令。而Fermi与Cypress(RV870)相比的话,我们就可以看出AMD的倾向性。谈到Cypress时,AMD的工程师们会告诉你这款产品拥有1600个shader单元,这个是凭借其采用的独立架构而产生的。
对于RV770来说,Cypress的纹理资源则提升了一倍。ROPs数量增倍,光栅单元也是增倍,显存也在容量和有效带宽上获得了倍增。至于shader硬件,5个ALU中只有4个就可以实现IEEE754-2008 FP32 FMAs,同时T-unit也拥有其独有的特性。这些加起来就带来了不小的提升,从渲染到纹理取样以及像素输出,直至内存带宽。在核心芯片使用TSMC 40nm工艺情况下,核心面积为334mm2,配备有21.5亿个晶体管。
RV870基本上就是RV770硬件参数的翻倍,只有内存接口带宽仍然为256bits。这看上去感觉会有些不平衡,但是除此以外,这款产品可以视作是一款怪兽级图形处理器,它可以让游戏比以往任何时候运行的都要更快,配备有世界级的输出引擎,出色的物理效果,当然价格也是相当“吸引”人。而在另一方面,NVIDIA则只有依靠GT200来撑场面,而AMD的产品也只有在计算方面要落后一些。因此这也是NVIDIA为什么如此重视计算方面性能的原因,这点在我们看过GF100的配置之后就更加清楚了。#p#page_title#e#
GF100基于的正是Ferm架构。属于D3D11产品,由16个TPC组成,每个TPC包含有一对矢量SIMD处理器,一个独立的内存池和寄存器;dual-issue, dual-warp调度器,并且可以通过内置内存控制器访问芯片的ROP和DRAM。
它的子块可以实现双精度计算。这是一个16位宽DP矢量单元,每个时钟循支持单个FAM 16线程。由于操作预测限制,当DB子块运行时,SM无法运行第二子块。另外对于DP FMA而言,FPU可以在一个时钟周期内运行DP MUL和ADD。ALU还有一个很有趣的功能,就是可以在一个时钟周期处一个32-bit MUL或ADD。
其它的子块则是16位宽,负责另一半的线程warp单精度矢量计算。每个时钟周期可以运行一个单精度FMA或者MUL、ADD。对于子块来说新的FMA功能是很重要的。这样可以让nVIDIA的D3D10级硬件能够在单个计算级上拥有比老产品更高的计算精度。在图形模式下,由于运行在GT200相同的数字精确性,因此Fermi架构的芯片(例如GF100),MADD的速率将只有一半,因为运行的是老的MUL和ADD,需要2个时钟周期。自动提升FMA将会由驱动来自动完成。
计算的精度是由Fermi所支持的IEEE754-2008所决定的,其中包括例处处理以及实现更快的浮点性能包括有NaN, +ve以及-ve等。
每个子块同样配备有SFU(special function unit)。SFU执行矢量插值,同时为硬件提供特殊的指令比如SIN, COS, LOG等。DP子块SFU在双精度下不运行指令。
子块和SFU能够运行大量其它指令以及特殊计算,比如转移、分支指令、ops对比以及交叉ALU计数器等。完整的指令混合以及输出过程目前仍不清楚,NVIDIA声称调度器只受到操作数收集和发送的影响。如果所有的数据依赖都是令人满意的,同时拥有足够的接口满足 register pool的服务请求,这样可以想像SM将会运行所有的指令混合。通过256个接口可以提供足够的操作数取以满足SGEMM峰值速率的要求,同时也可以满足HPC的需求。 GF100的SM最大线程数量为1536,相比GT200提升了50%。
这个方面唯一值得讨论的限制就是子块双精度运行。由于DP操作的数尽可能需要达到2倍,这样操作将会消耗所有可能获取的register file接口,这样其它子块的其它指令将无法运行。在内存同步方面,我们注意到所有的Fermi SM包括有64KB L1缓存与共享memory pool,如果需要的也可以支持ECC。线程可以同时访问shared memory和L1缓存。另外就是每个SM的register file为28KB。
GF100的L2缓存为768KB,这样每个SM可以分配到48KB,不过需要记住它是完全一致的。首先显存类型为GDDR5,但是内存控制器仍然支持GDDR3,NVIDIA将会把后者在6GiB Tesla配置上应用。
与当前已经上市的产品相比,Fermi的设计比如GF100同样也支持改进的原子操作性能。warp中的原子操作是通过L2缓存的使用实现的,NVIDIA的白皮书表示额外的原子单元会影响到影响是不准确的,原子操作是通过L2实现操作而非通过DRAM完成。
GF100声称能够同时支持16个计算kernel,每个SM分配一个。较早支持CUDA的架构只能够同时支持一个kernel,并且是在降序模式下连续执行。不过GF100则没有这样的限制。Kernel依然会像以前那样通过驱动按队列执行,不过当TPC空闲下来可以运行另一个kernel时,它就可以自由得调度并且运行。至于DRAM,GF100可以通过6个64bit通道支持GDDR5显存,同时显存的频率可以达到4200MHz。随了新的内存以外,还包括有独特的内存控制器。在纹理单元方面,GF100看起来应该是支持与GT200相同的,同时其处理峰值速率为相同频率下GT200的1.6倍。纹理可以支持D3D11所需的全部要求,当然还包括有FP32过滤器。虽然内存总线缩减为384bits,但是GF100的ROP数量最高可以达到48个。
NVIDIA很有可能会选择通过参数的变化来推出衍生产品,比如可以简单将DP子块替换成功能更简单的块。其它仍然保持不变,包括配备相同的调度器、register file甚至操作数电路。这样将可以推出非DP衍生品,当然也会丢失一些整数处理的速率,但是这对于衍生产品来说则不会有影响,因为其面对的是不同的市场。双精度浮点基本是GPU独有的非图形特性,至少在这点上将其从衍生产品上取消还是相当有用,这样可以推出更小、更便宜的产品。