首页 > 范文大全 > 正文

NVIDIA的显卡炼金术

开篇:润墨网以专业的文秘视角,为您筛选了一篇NVIDIA的显卡炼金术范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

在DirectX 9的时代,GPU的可编程性迎来了革命性的变化――只要GPU符合DirectX 9 API,那么原则上就能通过HESL(High LevelShader Language,高级着色语言)或者ASM(汇编语言)实现各种计算操作。此时就有人想到,既然GPU的可编程如此强大。那能不能用GPU来处理别的应用甚至是代替CPU?在这样想{去的驱动及尝试下。GPU历史翻开了崭新的一页――GPGPU。

对GPGPU进行深入研究是从2003年开始的,在那年的SIGGRAPH 2003大会上许多业界泰斗级人物发表了关于使用GPU进行各种运算的设想和实验模型。GPU恐怖的浮点运算能力和数据流吞吐量使得人们希望用GPU来加速运算,和CPU相比,进入DirectX 10时代统一VS和PS架构后,GPU要进一步提升浮点性能变得相当简单(不断增加Streaming Processor),而CPU要提升浮点性能则比较困难。如果能让GPU实现科学计算、有限元分析等浮点运算密集的应用,那整个计算工业将会迎来一场深刻的变革。

从GPGPU到CUDA,通用计算的飞跃

光看GPGPU远超CPU的浮点运算能力的确很有诱惑力,但真正应用却难于登天。在过去的5年里,许多基于GPGPU的项目最终流产。究其原因,就在于专为显卡设计的图形API限制太大,要通过这样的API来执行其它应用,不仅算法和程序会变得极端复杂,还将耗费:kit的额外运算开销。

在GPU进入DirectX 10时代以后,统一渲染架构在编程灵活性上获得了进一步的提升,而nvidia也同时意识到,要破解GPGPU应用的紧箍咒,必须抛弃原有的DirectX或者OpenGL等专为图形设计的API才能在合理的资源下释放GPU通用计算的威力,CUDA(Compute Unified Device Architecture,统一计算设备架构)因此应运而生。

我们可以把CUDA简单地看作是专为NVIDIA GPU设计的C语言开发环境。和以往的GPGPU需要程序员自行开发“迂回”的实现架构不同,CUDA在问世初期就拥有了完整而直接的开发程序。NVIDIA给开发者提供的CUDA套件包括TnVCC C语言编译器、适用于GPU的CUDAFFT和BLAS库、CUDA分析器、GDB调试器以及CUDA运行时(CUDA runtime)驱动程序,除此以外CUDA还拥有详尽的编程指南和大量范例供开发者参考。在CUDA的帮助下,开发者只需要专注于自己所开发的应用,剩下的GPU实现部分将由NVIDIA的编译器自行完成,完全无需像普通GPGPU应用那样针对每一款显卡设计各种复杂的算法。另外,CUBA的运行时驱动程序还被NVIDIA加入在全系列Forceware显卡驱动中,只要目标用户使用的是NVIDIA GeForce 8系列或以上显卡,用CUDA编写的程序就能在上面正常运行。

那究竟CUDA上的编程模型和普通CPU上的C语言编程模型有什么区别呢?其实和CPU相比,DirectX 10时代的GPU有着远超前者的并行性,但却在单线程的处理方面不如CPU。所有通过GPU处理的计算必须采用简单的线程,并通过海量并行来弥补简单线程带来的损失。由于在处理过程中线程就像水管那样一通到底,所以我们把这样的计算称为流计算(Streaming Process)。如果将为CPU设计的编程模型用到GPU上,那你绝对会感受到什么叫痛苦――在GPU上习以为常的分支预测、乱序执行等功能通通欠奉,而GPU恐怖的并行能力和惊人的带宽你也无法用上。CUDA正是解决GPU和CPU之间的差异构建出来的编程模型,在CUDA上首先被强调的就是海量并行――GeForce8800GTX显卡中有128个Streaming Processor以及强大的线程调度能力,所PACUDA允许开发者在G80上同时建立12288条活动线程,如此恐怖的并行能力即便和处理器集群相比也不逞多让。

由于GPU驱动程序构建在操作系统之上,所以在调用GPU进行海量并行计算的时候,还无法离开CPU的帮助。在CUDAeeNVIDIA采用了更为高效的架构来让CPU和GPU协同工作。在一个CUDA程序运行的时候,能被GPU执行的应用被NVIDIA称作内核,整个内核将会由成千上万条简单线程组成,并交由GPU进行处理。无法并行化的应用则由CPU完成。由于CUDA中单个线程极为简单轻量,所以每个线程在创建时的性能开销极小。在GPU运行通用计算的内核中,所有的线程都采用相同的代码,但却有各自的ID用于内存定址和控制决策。为了提供线程之间的协作能力并且降低显存带宽消耗,CUDA还会自动把多个线程合并成一个线程块,处于相同块中的线程能够相互协作共享内存,而不同块中的线程则无法协作。这样的线程块设计还让基于CUDA的程序能够在任意数量Streaming Processor的GPU中透明伸缩,而无需程序员的干预。根据NVIDIA提供的资料,每个线程块只能在一一个流式多处理器(SM)上执行(G80的128个SP被分成了16个SM),而多个线程块则可以同时驻留在一个SM上。

经过了CUDA对线程、线程块的定义和管理,我们不难发现在支持CUDA的GPU内部实际上已经成为了一个迷你网格计算系统。在内存访问方面,整个GPU可以支配的存储空间被分成了寄存器(Register)、全局内存(ExternalDRAM)、共享内存(Parallel Data Cache)三大部分。其中寄存器和共享内存集成在GPU内部,拥有极高的速度,但容量很小。共享内存可以被同个线程块内的线程所共享,而全局内存则是我们熟知的显存,它在GPU外部,容量很大但速度较慢。经过多个级别的内存访问结构设计,CUDA已经可以提供让人满意的内存访问机制,而不是像传统GPU那样需要开发者自行定义。

毫不夸张的说,在CUDA的帮助下普通程序员只要学习一点点额外的GPU架构知识,就能立刻用熟悉的C语言释放GPU恐怖的浮点运算能力,随着GeForce 280GTX的问世,通过CUDA所能调度的运算力已经非常逼近万亿次浮点运算(GeForce 280GTX单卡浮点运算能力为933GFLOPS)。而在此之前要获得万亿次的计算能力至少需要购买价值几十万元的小型机。

CUDA能做什么?

早在GeForce 8800GTX问世不久,NVIDIA就宣布了针对高性能计算领域的Tesla流处理器。而当我们拆开Tesla之后就能发现,它采用了GeForee 8800GTX/Quadro FX 5600完全一致的架构。那究竟 CUDA加上GPU能够带来什么?答案相当简单;海量的计算能力。

在分子动力学领域,CUDA加上GeForce 8800GTX获得了较CPU快240倍的运算速度。与此同时,在模拟脑电波、视觉和嗅觉感官计算领域,CUDA~tzCPU和GPU协同工作获得了130倍的性能提升。而在金融行业,NVIDIA和财务分析软件厂商Hanweck合作在其股票和期权分析软件中加入了GPU加速功能,在GPU的帮助下只要不到1秒钟就完成了对所有美国上市股票的期权评估和隐含波动分析。

另外,Adobe和NVIDIA公司将联手打造基于CUDA并针对Photoshop进行GPU加速的产品。预计Photoshop CS4上市后,打开一张4.42亿像素的图片只要几秒钟。这样的速度甚至和普通电脑打开500万像素数码照片的速度相当。除此之外。在对超大图片进行缩放、旋转时,Photoshop CS4也不再“卡壳”。以往最让人头痛的全景图拼合,在GPU的帮助下也能在瞬间完成。Photoshop CS4另一个让人印象深刻的新功能是不但可以导入3D模型。还能在其表面添加文字和图画,并且就像直接渲染在模型表面一样自然。根~Adobe透露的消息,Photoshop CS4将会在2008年10月问世,所有版本Photoshop CS4都将会提供对CUDA以及NVIDIAGPU的支持。

对于理工和金融科学生来说,Matlab是必不可少的计算工具。如今Matlab同样加入了对CUDA的支持。在NVlDIA官方网站上已经提供对全系列Matlab的插件下载,在我们安装好该插件之后,Marlab就能随时调用GPU进行计算,从而获得17倍的性能提升。

未来,CPU与GPU的争夺

在问世的初期,CUDA就已经获得了业界大量支持,由于许多浮点密集型应用大多在尖端科学领域,所以普通用户只能从Photoshop和Matlab等软件中感受到GPU的威力。今天已经有许多研究人员致力于借助GPU完成视频编码、音频处理等应用。也许过不了多久,就会有越来越多的程序加入通用计算的行列。

凭借强大的浮点运算能力,GPU和CPU已经在机箱内部展开了地位上的较量。Intel和NVIDIA甚至为此进行了多轮的唇枪舌战。NVIDIA认为未来CPU只需要运行好操作系统就可以了,大部分多媒体应用都可以让GPU来完成。而Intel则表示GPU的应用范围依然较小,只有CPU才是PC内部的核心所在。虽然双方争持不下,但有一点我们是可以肯定的,那就是PC的未来将会因为GPU通用计算的普及而发生历史性的变化。