缔造视觉计算王国,NVIDIA Fermi深入解读与测试

2010-04-15 19:50  出处:PConline原创  作者:后天太阳   责任编辑:chenri 

 

“我相信历史会将Fermi作为一个里程碑载入史册。”
                ——Dave Patterson 并行计算研究实验室总监

 

  Fermi,NVIDIA新一代显卡架构代号,在这半年来亮相的频率非常之高。“Fermi”一词来自于著名意大利核物理学家Enrico Fermi,1938年诺贝尔物理奖得主,核反应堆技术的发明者。

  在去年AMD发布DirectX 11显卡Radeon HD 5000系列之后,NVIDIA面临着非常大的压力,一方面产品青黄不接,一方面Fermi架构显卡迟迟不能推出。好在NVIDIA有着出色的市场宣传与公关能力,消费者与品牌商们在对Fermi的无限期待中一天一天度过。

  去年9月底的NVIDIA GTC大会上,也就是对手发布DirectX 11显卡的一周后,NVIDIA CEO黄仁勋先生展示了Fermi架构的Tesla显卡,这也是Fermi架构显卡首度公开亮相。虽然后来因为展示的是实物还是样卡引得一片轩然,但此举无疑极大鼓舞了NVIDIA产品士气,并引起全世界对Fermi的高度关注,Fermi也从此开始频频步入我们视野。

  在随后的CES(2010年1月)和CeBIT(2010年3月初)大会上,NVIDIA都高调展示了Fermi架构的桌面图形卡,Fermi虽然姗姗来迟,但离我们也越来越近了。

  终于在今天,2010年的3月27日,NVIDIA正式发布了它的全新桌面显卡——Fermi架构GeForce GTX 480/470显卡。

  NVIDIA的Fermi会在视觉计算领域引发一场“核裂变”革命吗?

◆ Fermi:新一代CUDA计算与图形架构

  在未来的游戏世界里,当显卡的渲染速度足够快后,真正能带给玩家视觉震撼的是流光溢彩的表面效果和栩栩如生的物体动作,比如现在的光线追踪和物理加速技术就是在朝着这个方向努力,然而这需要显卡具备极强的计算能力(GPU Computing),不止是图形渲染能力。

  G80架构是NVIDIA公司最初的通用计算GPU架构,即可以做图形渲染,也可以用来做并行计算,后来的GT200架构扩展了G80架构的特点和功能,性能得到进一步提升。新一代的Fermi架构则是继G80架构后的又一重要GPU架构,它站在G80和GT200的肩上,几乎是重新设计了并更注重通用计算的架构。

  Fermi继承了上代的特色,同样也是双架构设计,即CUDA计算架构和图形架构,两种架构可灵活切换,比如在游戏中需要进行物理计算时使用CUDA计算架构,需要进行渲染时使用图形架构。

  NVIDIA给Fermi的定义是:新一代CUDA计算与图形架构。它采纳了用户在使用G80和GT200架构时给出的建议,针对双精度运算、ECC内存容错能力、Cache体系结构、上下文切换和原子读写操作等方面进行了全新的设计,通过新的架构设计不仅仅增加了计算能力,并且支持更好的可编程能力和计算效果。

  Fermi架构的主要更新如下:

   ◎ 第三代Streaming Multiprocessor(SM)
     •  每个SM包含32个CUDA Core,是GT200的4倍
     •  8倍于GT200的双精度浮点性能
     •  Dual Warp调度策略,一个周期内启动两个warp进行计算
     •  每个SM有64KB的RAM,可灵活配置Shared Memory和L1缓存

   ◎ 第二代PTX ISA架构(PTX 2.0)
     •  统一寻址空间,完整的支持C++特性
     •  针对OpenCL和DirectCompute进行优化设计
     •  完整支持IEEE 754-2008 32bit/64bit精度
     •  通过Predication(断言)来提高条件性能

   ◎ 改进的内存操作子系统
     •  可配置的L1和统一的L2并行数据高速缓存
     •  首个提供ECC内存支持的GPU
     •  原子内存操作性能极大增强

   ◎ 第三代千兆线程引擎(GigaThread 3.0)
     •  10倍于上一代的上下文切换能力
     •  并发Kernel(核心程序)执行机制

  GF100是首款采用Fermi架构的GPU,旗下的产品包括GeForce GTX 480和GTX 470,它们能够实现所有的DirectX 11硬件特性,包括Tessellation和DirectCompute等,除了上面提到的领先的并行计算能力外,在游戏图形性能方面也很大改善:

   ◎ 卓越的游戏性能
   ◎ 超一流的图像质量
   ◎ 电影级的几何真实效果
   ◎ 革命性的游戏计算架构

  Fermi是相当复杂和庞大的,其晶体管数达到30亿个,规模空前,这也是它迟迟不能推出的主要原因,它实在是太复杂了!

第一章 Fermi CUDA计算架构解读

  CUDA计算架构上的改进是Fermi最重要的部分之一,经过G80和GT200两代的发展,Fermi的很多功能单元都升级到了第三代。

§1.1 第三代Streaming Multiprocessor流处理器群

  第三代Streaming Multiprocessor(SM,流处理器群)架构不只是增强了SM的计算能力,同时使得其可编程性和效率得到提高。

  • 512个CUDA Core

  从Fermi开始,NVIDIA正式使用CUDA Core的概念,实际上它就是之前的Stream Processor(SP,流处理器),为了统一,全文将通称CUDA Core。

  Fermi的SM已经是第三代了,前两代架构的单个SM中只包含有8个CUDA Core,而Fermi的SM中包含有32个CUDA Core,完整规格的Fermi具备16个SM,构成512个CUDA Core,每个CUDA Core都具备完整的整数逻辑单元(ALU)和浮点数单元(FPU)。  

  在GT200,整数逻辑单元(ALU)仅限于24bit的乘法操作,Fermi的ALU几乎采用全新的设计,对所有指令支持全32bit精度,这就符合标准的编程语言要求。通过优化,新的ALU还可以支持64bit精度和扩展的指令运算,包括支持移位、布尔值、比较、转化以及更多的指令操作。

  G80和GT200架构都是用IEEE 754-1985的单精度浮点标准,Fermi开始采用IEEE 754-2008的单精度浮点标准,并支持FMA(fused multiply-add)功能,关于FMA,后文会图解详细说明。

  • 16个Load/Store单元

  每个SM包含16个内存Load/Store(LD/ST,存/取)单元,可以保证源和目标地址在一个周期内同时由16个线程来进行操作,支持缓存和DRAM的任何位置读取。

  • 4个SFU单元

  除了存取单元外,每个SM中还包含有4个SFU(Special Function Units,特殊功能单元),它的作用是处理超越函数,包括sin、cosine、求倒数、平方根等。每个SFU在一个时钟周期内每个thread可以执行一个指令操作,因此每组warp执行需要8个周期(每组warp有32个thread)。指令分发器可以按照当前SFU的运行情况来分发指令,当一个SFU被占用时,可以将指令分发到其他的SFU单元处理。

  • 双精度浮点性能大幅提升

  单精度实数占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。双精度的浮点计算在高性能计算中有着核心的重要位置,在求解线性代数中、数值计算量子化学等中都会需要双精度浮点运算。

  Fermi架构为支持双精度浮点运算进行了特别设计,FPU单元放到了CUDA Core中,每2个CUDA Core在一个周期内可以完成1个64bit的双精度浮点数FMA操作,也就是每个SM(32个CUDA Core)在一个时钟周期内可以完成16个双精度浮点数操作,单精度与双精度的执行性能达到2:1。

  相比之下,GT200架构下的每个SM(8个CUDA Core)只有1个双精度浮点运算单元,单双精度的执行性能为8:1,可见Fermi的双精度浮点性能有着显著提升,初步估算它的双精度浮点性能是GT200架构的4倍以上,这是一项非常重要的改进。

  • Dual Warp调度策略

  在SM内是执行程序时是以Warp为单位的,32个thread为一组Warp。

  Fermi的每一个SM都有两个Warp调度器和指令发送器,Dual warp调度机制可以同时并发调度两个warp的一条指令分别在16个一组的CUDA cores上进行计算,或者在16个LD/ST单元运行,或者4个SFU上运行。Fermi的调度器并不需要对指令流间的相依性进行检查,利用这样的调度机制,可以让硬件的计算能力达到极致。

  大多数的指令都能实现双发射,例如两条整数指令、两条浮点指令或者混合的整数、浮点、Load/Store和SFU处理指令的组合都可以被并发执行,单精度和双精度的指令一样可以并发执行。

  • 64KB可配置的Shared Memory/L1缓存

  在执行CUDA程序时,每个CUDA Core对应一个thread,每个SM则对应一个thread block(线程块),SM内的Shared Memory(共享内存)对可编程性和运行效率提供了强力支持,它可以让同在一个thread block的线程进行协作,能重复利用片上内存,减少对片外内存访问。共享内存在许多高性能CUDA应用程序中起到了重要作用。

  G80和GT200的每个SM都只有16KB的共享内存,Fermi架构中,每个SM的片上内存达到64KB,重要的是这64KB可以被配置成48KB的共享内存和16KB的L1缓存,或者配置成为16KB的共享内存和48KB的L1缓存。

  对于已经使用共享内存的程序来说,可以提供3倍于上一代的共享内存支持,尤其是那些对带宽要求较高的程序获益更多。对一些已经使用了共享内存作为缓存的应用程序来说,可以转而直接使用系统硬件提供的缓存,同时还可以继续使用16KB的共享内存。最理想的是,一些原本就没有使用共享内存的程序,可以直接利用L1缓存,使得程序运行时间缩短,得到更高的性能。

键盘也能翻页,试试“← →”键