● Fermi GPU架构带给我们的思考
在经过漫长的4年开发期之后,众望所归的Fermi架构GPU终于诞生,这款GPU身上凝聚了众多“第一”,打破了很多芯片设计的世界记录。有人说Fermi拥有强大的Tessellation细分曲面单元,也有人说Fermi拥有高倍的AA特性,而实际上这都只是Fermi架构的毛皮,或者说在图形领域的一些细微改进。实际上Fermi的真正提升在于架构代差……
NVIDIA的Tony Tamasi先生(NVIDIA公司高级副总裁,产品与技术总监)表示:“以前的G80架构也是非常出色的图形处器。但Fermi则是一款图形处理同样出色的并行处理器。” 这句话揭示了Fermi的与众不同,它已经不再面向图形领域设计了,因为更广阔的通用计算市场在等待它。Fermi将为通用计算市场带来前所未有的变革,图形性能和游戏被提及已经越来越少。
诸如曲面细分之类的东西在未来更长一段时间内将逐渐淡化,因为那些不过是体现了一个公司对微软历代DirectX要求的理解和按图索骥的能力罢了。真正体现水平的是运算单元部分,是每一个运算器的构成和组织方式。
如果说从G80身上已经看到了GPU迈入通用计算领域的影子,那在代号GF100的Fermi身上,你能更多地找到CPU的烙印Fermi的cache,并行kernel,分支论断,warp级的乱序执行,都已经远远超越GPU的意义。它们消耗了Fermi大量的晶体管资源,而有些设计甚至是和图形运算完全无关或者说不能提高图形性能的。
Fermi架构设计图
这篇文章写在Fermi发布之前,鉴于文章篇幅有限,且未来我们将给出Fermi架构的细节分析,所以在这里简单说明一些Fermi的设计新方向和新特性:
1、更大更全的缓存体系:GF100核心和上一代GPU相比,除同样拥有12KB的L1纹理缓存之外,其拥有真正意义的可读写L1缓存和L2缓存。GF100核心使得GPU中首次出现了64KB的RAM支持可配置的shared memory和L1缓存。
Shared memory可以解决一部分程序的问题,但是不能解决所有的问题。一些应用程序天然需要shared memory,有些应用程序则需要缓存cache,有的既需要shared memory也需要cache。优化的内存设计可以既提供shared memory也提供cache,可以让程序员根据自己的需求来做选择。Fermi的SM单元比过去大得多,所以每个SP独享的shared memory可以减少,可通用的资源也就更多了,这些改进全靠缓存的引入。
为GPU引入缓存也意味着风险,首先缓存的可读写性带来了很多问题,它包括缓存一致性协议,这需要用复杂的逻辑进行控制。其次缓存的命中率等问题需要NVIDIA着手解决,如果缓存的命中率过低,引入缓存将带来数据读写减速。同时还不得不考虑缓存引入的大量晶体管开销(前文已经分析)。
2、底层计算单元不断改进:毫无疑问,G80到 GT200以来,NVIDIA的MIMD架构流处理器设计一直是图形芯片中效率最高的,虽然它很耗费晶体管,但是以最后实际性能衡量,还是和划算的。这次Fermi延续了这种设计,但是在计算单元和周边资源方面做了扩充,更高的精度和更小的衰减是永远的目标。
Fermi所支持的FMA指令在做乘运算和加运算的时候只在最后运算的时候作一次舍入,不会在执行加法的时候就出现精度损失。其次Fermi架构为支持双精度浮点运算进行了特别设计每一个SM在一个时钟周期内可以完成16个双精度浮点数的FMA操作。同时大量原子操作单元和L2缓存的使用,大大增强了Fermi GPU架构中的原子操作能力。
3、更强大的线程调度能力和分支论断:在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的发展,每走一步,就多像一份。
PTX是NVIDIA针对支持并行线程处理器运作而设计的低级虚拟机和ISA,当程序执行之前,PTX指令会被GPU驱动转译为GPU的本机代码。Fermi所支持的PTX 2.0 ISA为所有的指令提供了predication(论断)支持,使得这个特性可以更容易、更快地去执行条件语言。在Fermi中为这一功能的初步实现提供了一个独立单元,它和仲裁器、Atomic单元的地位一样重要。分支论断只能算是分支预测的雏形或前身,但这种功能在以前的GPU上是可望而不可及的。