玩游戏的人对GPU应该都不陌生,当时还在拼显卡内存的时候,GPU的出现成为了游戏发烧友的选择,这也是在我脑海中对GPU的印象。然而GPU的出现不仅仅造就了高画质的游戏,更被用到了服务器的计算领域。GPU改变了服务器的运算模式,前所未有的提高了服务器运行计算的速度。
GPU横空出世
GPU诞生于1999年NVIDIA发布的GeForce256图形处理芯片上。GPU的诞生使图形处理不在依赖于CPU,处理的方式也从原来的2D变成了3D,同时也可以运行更为强大的几何运算。在图形处理上T&L是3D渲染中的一个重要部分,GPU是可以从硬件上支持T&L(transform and lighting,多边形转换与光源处理)的显示芯片。一个好的T&L单元,可以提供细致的3D物体和高级的光线特效。而如今的GPU已不再是图形处理这么简单 ,GPU通用计算技术发展已经引起业界不少的关注,事实也证明在浮点运算、并行计算等部分计算方面,GPU可提供数十倍甚至上百倍于CPU的性能。
GPU初露锋芒
和CPU相比,GPU的并行计算能力极为强大,但很长一段时间,GPU只能用于图形计算,强大的计算能力被白白浪费。之所以这样是因为GPU设计之初是作为专用设备来使用的,专用设备往往在某个计算领域拥有极为强大的性能表现,但由于其专用型的属性导致灵活度不高,在全球首款GPU GeForce 256中,GPU除了利用大量的ALU进行像素计算外,只加入了点和坐标转换单元。整个GPU只能进行固定类型的运算,连浮点计算都不支持。也正是在GeForce256上,科研人员们看中了其强大的多纹理处理性能,可以进行一些不太复杂的科学计算。最终GeForce 256被用于求解数学扩散方程,这也是GPU首次在通用计算领域得到应用,也证明了其具备通用计算的潜力。
于是,图形厂商在接下来的设计中,开始“改造”GPU,使其变得可编程化、通用化。终于,在DirectX 8时代,GPU中的像素和顶点单元被定义并分离开来了,加入了初步的可编程功能。在DirectX 9特别是DirectX 9c上,GPU终于可以开始初步支持部分程序控制功能,这个使其GPU的彻底浮点化也扫除了GPU的最后一个障碍。
GPU前所未有
时间很快多过渡到了2006年,这一年,在斯坦福大学宣布和ATI在GPU通用计算能力的挖掘和应用上获得了重大突破,ATI RadeonX1900系列显卡正式开始支持斯坦福大学主导的Folding@Home项目。Radeon X1900系列显卡设计了远超传统CPU的强大像素计算单元,单颗Radeon X1900 GPU在浮点计算能力上达到了当时最顶级的CPU 70多倍。ATI虽然获得了首次大规模成功应用GPU计算能力的“第一次”但真正的革命并非由其主导。同样在2006年,NVIDIA发布了GPU发展史上改进最大、架构进步最为明显、性能搞越最为惊人的产品:G80。G80是首次采用了统一渲染架构的GPU,NVIDIA再给予G80强大的3D性能的同时,还富裕了G80另外一项划时代的功能:CUDA。
CUDA的全称是Compute Unified Device Architecture(统一计算设备架构),他的发明,将GPU通用计算和并行计算带入了全新的时代。借助于使用C语言编译器的CUDA SDK以及专门为CUDA持续优化的NVIDIA GPU产品,开发人员可以彻底抛离之前各种令人难以忍受、极为不便的语言环境,转而使用熟悉的C语言进行操作。
在G80后,NVIDIA又发布了大幅度改进的GT200架构和堪称GPU通用计算的梦幻产品Fermi,将GPU通用计算推向一个新的境界,Fermi从设计开始就充分考虑了GPU通用计算的需求,在双精度性能、内存校验、缓存设计上全面采用了开创性的革新设计,最终达到了有史以来最为出色的通用计算效能。Fermi带来的不仅仅是纸面上的变化,现在,很多全球顶级计算机研究机构和学校,已经开始在课程中加入CUDA的相关内容,在国内的中科院和清华大学,也开始将GPU和CUDA用于研发和工程计算。
GPU强强联合
随着技术的发展,CPU+GPU的异构计算结构将引领处理器的发展方向,这也成为下一代超级计算的发展方向。目前设计GPU+CPU架构平台的指导思想是让CPU的更多资源用于缓存,GPU的更多资源用于数据计算。把两者放在一起,不但可以减小在传输带宽上的花销,还可以让CPU和GPU这两个PC中运算速度最快的部件互为帮衬。事实上,这是一条漫长的布满荆棘的艰辛道路,无论从硬件层面还是软件层面上,现在谈“异构运算”都太过超前,至少在主流市场离真正普及还有一大段距离。所幸的是,良好的生态圈正在形成——Win8对异构运算的完善支持为其带来了生存的土壤;WinZIP、Adobe等软件也逐渐加入对异构运算的支持。