1999年,NVIDIA推出了首款图形处理器(GPU),它是迄今为止使用最广的并行处理器。源于对逼真及实时图像的渴求,GPU已成为既可以浮点运算又可以编程的处理器;如今的GPU在计算吞吐量和内存带宽上远优于CPU,使其成为加速数据并行应用程序的理想处理器。
2003年起,NVIDIA开始对GPU进行非图形应用程序方面的探索。通过使用高级图形语言如DirectX、OpenGL和Cg,将各种数据并行算法移植于GPU。像蛋白质折叠、股票期权定价、SQL查询及MRI重建等问题都能通过GPU获得非凡的加速表现。这些早期将图形API用于通用计算的尝试被我们称为GPGPU程序。
虽然GPGPU模型显示出不俗的加速性能,但依旧面临诸多问题。首先,它要求程序员具备有关图形API以及GPU架构的相关知识。其次,问题必须按照顶点坐标、纹理及着色程序的方式表达出来,极大地增加了程序的复杂性。第三,不支持诸如随机读写内存等基础的编程特性,大大限制了编程模型。最后,缺少对双精度运算的支持(直到最近)意味著有些科学应用程序不能运行在GPU上。
为解决这些问题,NVIDIA采用了两项关键技术——G80统一图形与计算架构(最先采用于GeForce 8800、Quadro FX 5600与Tesla C870 GPU)和CUDA。CUDA作为一种软硬件架构,可采用多种高级编程语言对GPU进行编程。同时,这两种技术也代表着一种新的GPU应用方式。相比以前通过编程将专业图形单元与图形API结合不同,程序员可通过CUDA扩展来编写C语言程序,针对通用的大规模并行处理器。我们把这种新型GPU编程模式称之为“GPU计算”,它意味着更广泛的应用程序支持,更多编程语言的支持,是与初期GPGPU编程模型的本质分离。
G80架构
NVIDIA旗下GeForce 8800是被赋予了新型GPU计算模型的产品。2006年11月推出,基于GeForce 8800的G80为GPU计算所带来了的是一些关键性的创新:
G80是首款支持C语言的GPU,允许程序员使用GPU所带来的计算力,而又无须再学习一门新的编程语言。
G80是首款以单个、统一处理器取代顶点与像素管线的GPU,这种处理器可以执行顶点、几何、像素及计算程序。
G80是首款利用标量线程处理器的GPU,从而消除了程序员手动管理向量寄存器。
G80采用了单指令、多线程(SIMT)的执行模型,多个相互独立的线程可并行执行单条指令。
G80对内部线程通讯采用了共享内存和栅障同步。
2008年6月,NVIDIA对G80架构进行了重大改进。第二代统一架构——GT200(首次采用是在GeForce GTX 280,Quadro FX5800 和Tesla T10 GPU上)——将流处理器的核心数量(以下称其为 CUDA核心)从128增加至240。每个处理器的寄存器组都扩大了一倍,允许更多的线程任何时候在芯片上执行。增加硬件内存的联合存取以改善内存访问效率。另外,还添加了对双精度浮点运算的支持,以处理科学和高性能计算(HPC)应用。
在设计每款新一代GPU时,NVIDIA都以改善现有应用性能与GPU可编程性为宗旨;更快速的应用性将能带来直接的效益,GPU在可编程性上的不断进步,使得它发展成为我们当下最通用的并行处理器。正是基于这样的理念,促使我们又着手研发GT200架构的继任者。
NVIDIA的下一代CUDA计算与图形框架Fermi
从最初的G80起,Fermi架构在GPU架构上做出了最重大的飞跃。G80是统一图形与计算并行处理器的雏形,而GT200是对G80在性能及功能性方面的延伸。对于Fermi,我们融入了上两款处理器以及为它们编写应用程序中所获得的经验,应用了一种全新的方法,设计和创造出世界上第一款计算型GPU。在Fermi的研发准备过程中,我们收集了自推出G80和GT200以来广泛使用GPU计算的用户的反馈,并将以下关键领域作为改进重点:
改善双精度浮点运算的性能——单精度的性能大约是台式CPU的10倍,而有些GPU计算应用程序还需要更高的双精度浮点运算性能。
ECC支持——ECC允许GPU计算用户在数据中心的安装中安全地部署大规模的GPU,并确保数据敏感型应用程序,如医学影像及财务期权定价等不出现内存错误。
真正的缓存层次——有些并行算法无法使用GPU的共享内存,用户需要一个真正的缓存架构来辅助他们。
更大的共享内存——许多CUDA程序员需要超过16KB的SM共享内存来加速他们的应用程序。
更快速的上下文转换——用户需要在应用程序之间实现更快速的上下文切换,和图形与计算应用之间更快速的相互操作。
更快速的原子操作——用户需要为他们的并行算法实现更快速的“读-修改-写”原子操作。
针对这些需求,Fermi工作小组设计了一款处理器,原始计算力得到了极大的提升,通过架构上的创新还大大增加了可编程性以及计算效率。Fermi在架构上的闪光点体现在:
第三代流式多处理器(SM)
每个SM有32个CUDA核心,是GT200的4倍
双精度浮点运算的峰值性能是GT200的8倍
双Warp调度器同时调度和分配来自两个不同warp的指令
64 KB的RAM,可配置为共享存储器和L1缓存
第二代并行线程执行ISA
统一寻址空间,提供完整的C++支持
优化OpenCL和DirectCompute
完整的IEEE 754-2008 32-bit和64-bit精度支持
完整的32-bit整数路径,以及64-bit扩展
内存存取指令支持向64-bit寻址的转换
通过Predication提升性能
改进的内存子系统
NVIDIA Parallel DataCacheTM层次,拥有可配置的L1和统一的L2缓存
首款提供ECC内存支持的GPU
显著改善原子内存操作性能
NVIDIA GigaThreadTM Engine
相比早先产品10倍以上的应用程序上下文切换
同步执行多核心程序
线程块乱序执行
双重叠式内存传输引擎
评论
查看更多