CUDA的应用与案例详解
曾经,笔者的一个从事网页设计工作的美工朋友给我讲过一个笑话,他们单位为了某大型宣传活动,准备设计一个巨型的条幅广告,而条幅广告的设计任务自然是他们美工的责任。不过,具体负责设计的不是我的朋友,而是他的几个同事。
根据我朋友的叙述,两位同事,同时为这个巨型的条幅广告进行设计,并且配备了单位最好的电脑来进行处理,但是,由于巨型的条幅广告尺寸过大,仅仅一个简单的渲染过程就要等待半个小时甚至最长长达一上午的时间。导致朋友的同事一天下来,仅仅能够进行简单的几部操作,而剩下的事情几乎全部是坐在电脑前等待……
可是,不知道读者是否能够想象得到,这些漫长的等待,如果使用拥有强大浮点运算能力的GPU来进行这些运算的话,仅仅需要几分钟甚至几秒钟,更甚至能够做到所见即所得的形式,这将会大幅度的提高工作时的工作效率。如果刚才我们所说的笔者朋友的同事能够拥有这样的设备的话,有可能这样一个巨型的条幅广告仅仅需要一个上午的时间就能够全部完成了。
◆CUDA,让你梦想成真:
CUDA,如今这个名词越来越多的出现在了我们的眼里。虽然说,目前来看,CUDA可能和我们目前的电脑应用并没有太明显的关系,不过相信随着未来越来越多的软件支持,CUDA最终将会走入我们每个人的电脑应用当中。前面我们说的那个例子,虽然现时来看并不太可能实现,不过,我们却很有可能在下一代的PhotoShop当中看到这一功能付诸实践。
『通过GPU加速,图像的渲染和处理将大大加快』
在Photoshop Creative Suite Next上通过GPU、物理加速的支持。Photoshop打开一个2GB、4.42亿像素的图像文件将非常简单,对图片进行缩放、旋转也不会存在任何延迟。这就是GPU的强大运算能力的体现,而想要实现这一功能,则需要借助于一个接口——CUDA。
◆CUDA是什么?
CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。
CUDA诞生的意义以及CUDA的应用领域
◆CUDA诞生的意义:
在传统的发展路线中,电脑显示卡一直在为游戏和3D应用程序服务,但是竞争的激烈、技术的飞速前进客观的成就了GPU的爆炸式发展。GPU的运算能力已经达到了非常高的水平,甚至在浮点运算能力上已经大幅度超越最高级别的处理器产品。
研究表明,从1993年开始,GPU的性能以每年2.8倍的速度增长,这个数字大大超过了PC其他子系统的发展速度。一块工作频率为3.0GHz的Pentium 4处理器,其晶体管数目为1.25亿个,即使算上SSE指令集的SIMD(单指令并发多数据流,这种情况是浮点吞运算下吐能力的最理想状况),也只有6GFlops的峰值浮点处理能力,而同期的一块NV40 GPU就有2.22亿个晶体管,峰值浮点运算能力很轻易超过40GFlops,而时间发展的今日,GPU的峰值浮点运算能力已经接近甚至超过了TFlops(1000GFlops)级别,GPU的性能可想而知
除此之外,GPU还拥有自己的独立子存储系统——显存,它拥有比系统主内存高得多的带宽。Intel曾经为它的Pentium 4 XE系列处理器所拥有的1066MHz前端总线所提供的8.6GB/S的带宽倍感自豪,而同期一块普通的GeForce 6800就拥有20GB/S以上的显存带宽。
于是,由这个问题就导致了两方面的考量:一、GPU拥有如此强大的性能,它能否为其它非游戏类的应用程序进行加速,发挥其性能的优势;二、GPU的浮点运算能力虽然强大,但是其架构一直是专有的,无法和目前的x86处理器相比拟,通过什么方法去使用GPU,通过什么方法去让应用程序利用GPU加速。
上述所讲就是NVIDIA最新的理论构想,那就是让GPU超越游戏,去拓展更为广阔的空间。而超越游戏,让GPU为其它应用程序服务,NVIDIA很早就进行了尝试,比如:NVIDIA早就与Adobe公司合作,为其Adobe Acrobat 8及Adobe Reader 8系列产品提供全新的页面显示着色技术,利用GPU来加速PDF格式下的绘图及显示功能,除了在效能上有所增进外,还可以利用GPU的可编程特性,进一步加强PDF文件中的2D内容展示效果,包括平移、卷动、缩放等,实际上Adobe Reader 8每一项运用到GPU的功能都有着显著的效能增进。使用者过去避免使用的一些应用,例如可进行极精细比例缩放的地图,现在都可以轻易地显示。
『早在G80时代NVIDIA就已经提出了CUDA的概念』
而想要实现这些功能,必然需要显卡与应用程序之间有一个良好的程序接口,这就是CUDA。其时早在G80时代,NVIDIA就提出了CUDA的概念,只不过因为那时候CUDA还未成型,所以没有公布,而现在,基于CUDA的应用程序越来越多,因此到了GTX200系列芯片的发布,CUDA才同时正式大范围的推广并介绍给普通消费者。
◆CUDA的应用范围:
由于GPU的特点是处理密集型数据和并行数据计算,因此CUDA非常适合需要大规模并行计算的领域。目前CUDA除了可以用C语言开发,也已经提供FORTRAN的应用接口,未来可以预计CUDA会支持C++、Java、Python等各类语言。虽然现在更多的应用在游戏、图形动画、科学计算、地质、生物、物理模拟等领域,但是由于GPU本身的通用特性和CUDA提供的方便的开发环境,我们可以放开思维的束缚,想象几种可能的应用场景:
搜索引擎中的排序、文本分类等相关算法的应用
数据库、数据挖掘
数理统计分析
生物医药工程
导航识别
军事模拟
无线射频模拟
图像语音识别
这些领域内的计算都是属于大规模的数据密集型计算,因此我们完全有理由相信,在CUDA的驱动下,GPU能够在这些领域建立一个属于自己的新时代。
应用开发很简单,CUDA的软硬件需求
CUDA是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备(通俗来讲,我们可以把它简单的看做是一个用途专一的CPU阵列),对所进行的计算进行分配和管理。
并且,CUDA最大的优势在于,无需像传统GPGPU那样必须将计算映射到API接口上(也就是显卡名词当中常见的OpenGL或者Direct 3D),开发人员只需要懂得C语言,就可以开始对CUDA的软件进行开发了。而对于用户而言,更加简单,只要安装好驱动程序,然后就可以运行基于CUDA开发的程序了。
◆硬件需求:
首先,我们来看看对于CUDA的卡发者和用户群来说,都需要哪些硬件设施。CUDA支持的GPU (CUDA-enabled GPU)包含GeForce、Quadro和Tesla三个系列:GeForce是NVIDIA公司面向消费市场的GPU产品;Quadro是面向专业图形市场的GPU产品;而Tesla则是专门面向GPU计算的产品,它不具备图形输出的功能,因此不能作为图形卡来使用。这三个产品面向不同的应用领域,因此建议在开发和部署CUDA应用的时候需要考虑到产品的应用决定采用不同的GPU。
NVIDIA的CUDA-enabled GPU具有一个完整的产品线,各种用户都可以从中选择到合适自己的产品。对于有高密度计算能力需求的用户来说,Quadro和Tesla则是必须的选择。诸如Quadro Plex 1000 Model S4和Tesla S870在一个1U高度的标准服务器机架机箱内装备了四个GPU,每个GPU具备128个stream processor以及1.5GB的存储器,每个1U装置总共具备512个stream processor和6GB存储器,非常适合于有高密度、大规模数据计算需求的用户。CUDA-enabled GPU的家族还在不断地扩大之中,随着NVIDIA新一代GPU的发布,更多的产品也将加入到这个行列中来。 #p#page_title#e#
另外,CUDA对于GPU产品线还涵盖了从笔记本电脑到高性能多GPU的系统中。也就是说,对于普通用户来讲,我们使用的普通笔记本或者台式电脑,只要拥有一块NVIDIA的GeForce 8以上级别的显卡都能够支持CUDA。
◆软件需求:
对于普通的应用者来说,对于软件方面,只要安装了一款能够支持CUDA的驱动程序,就可以了。接下来需要做的就是使用那些能够支持CUDA的软件。对于目前来说,能够支持CUDA的软件还是有些偏少,不过随着越来越多的软件开发者加入CUDA的行列,日后能够支持CUDA的软件将会逐渐完善起来。
而对于CUDA的开发者来说,开发CUDA的软件也非常简单。开发者只要会运用C语言编程,就能够顺利的学会CUDA。因为CUDA就是基于C语言为基础的,CUDA可以支持多种运行在Windows XP和Linux操作系统下的C开发系统诸如Microsoft Visual C++等。CUDA工具集的核其实心是一个C语言编译器,CUDA开发环境的具体内容包括:
· nvcc C语言编译器
· 适用于GPU(图形处理器)的CUDA FFT和BLAS库
· 分析器
· 适用于GPU(图形处理器)的gdb调试器(在2008年3月推出alpha版)
· CUDA运行时(CUDA runtime)驱动程序(目前在标准的NVIDIA GPU驱动中也提供)
· CUDA编程手册
除了编译器外,NVIDIA提供了一些非常实用的函数库。目前有两个数字计算库包含在已经发布的软件包里面,分别是CUDA FFT和CUDA BLAS子程序库。CUDA FFT是快速傅立叶变换(Fast Fourier Transform, FFT)的子程序库,快速傅立叶变换是信号处理之类应用的基本算法。BLAS是基本线性代数的子程序库,提供了高效率的线性代数计算子程序。CUDA FFT和BLAS都是针对GPU高度优化的高性能数学函数库,在CUDA程序中可以方便调用,节省大量的代码编写时间。
另外,CUDA所有软件包都可以从NVIDIA公司的网站上免费下载。NVIDIA还专门建立了一个针对CUDA的名为CUDA Zone社区,网址是 http://www.nvidia.com/object/cuda_home.html。它包含各种程序、文档的下载,并且有几个针对开发者的论坛,里面有专人为各位开发者进行服务,解答各种疑问。
除此以外,NVIDIA提供了开发指南和大量的第三方应用实例,所有这些资料均可以从NVIDIA CUDA Zone里面下载。
为何使用CUDA?CUDA都有哪些优势
首先要说明的一点是,CUDA尤其擅长的是某一方面,而并不是面面俱到。CUDA的开发是基于NVIDIA GPU平台的,因此发挥GPU的并行优势才是最主要的目的。
理论上讲,CUDA对于非图形的计算并没有什么限制,不过它还是相对比较适合高度并行的计算,毕竟这是它的长处。这里所谓的高度并行的数量级为上千个,相对于CPU来讲,双核的CPU也许几个线程就能充满它整个的计算单元,然而CUDA-enabled GPU却能够容纳上千个线程(也就是GPU中数百个SP单元的功力),所以常遇到的高性能计算领域的问题就特别适用于CUDA,而之前通常采用计算机集群的方式来进行计算。
而目前GPU已经发展到十分强大的地步,从GeForce6开始,就能够支持比较复杂的控制指令,比如条件转移、分支、循环和子程序调用等。而到了新一代的显卡,GPU的程序控制能力又增强了很多,支持的程序长度也得到了更大的扩展,也就是说利用GPU还是可以写一些比较复杂的程序。
当然CUDA也有其弱势的地方,其还是主要去做那些能够分成很多个独立线程的数值计算。比如说矩阵的乘法计算,矩阵相对应的元素的计算是没有什么联系的,可以很多个线程同时送入很多个处理器进行并行处理,这就非常适合于用CUDA来解决。当然并不是所有的事情CUDA都能够很好地解决,比如像操作系统这样复杂的指令和纷繁的分支循环而又用很少的线程来处理,这显然就不是CUDA的强项了。高度并行的计算是CUDA的技术特性之一。 #p#page_title#e#
『GPU的架构非常合适进行大规模的并行计算』
CUDA已经应用在很多领域,包括在通用计算中的一些GPU加速,游戏中的物理模拟等等,而在科学计算中,CUDA可发挥的功效就更大了。比如有限元的计算、神经元的研究计算、地质分析等等科学研究的领域;当然目前GPU计算的应用还是处于一个早期的阶段,大部分CUDA应用都是专业人员和相关的程序员在开发,随着CUDA的广泛推行,以后会有实际的基于CUDA的程序,更多的程序员能够加入进来,并且开发一些可以给大家日常应用带来好处的程序,只要有支持CUDA的GPU就能够利用到GPU计算的好处。
最后来说明一下某些读者对于CUDA的误解,可能有人认为“有了GPU之后CPU就不需要了”,这也是不对的。显然,GPU和CPU还是做不同的工作的,GPU的计算主要集中在高效率低成本的高性能并行计算,所以事实上在一个系统里面,一个高效的GPU配合一个高效的CPU,整体的效率还是会有明显提升的。
目前能够支持CUDA的应用软件介绍(一)在我们了解了CUDA的需求之后,对于本文的绝大多数读者来说,他们更想要了解的应该就是CUDA对于我们普通用户究竟是否有实际意义,并且,目前真的又能够支持CUDA的应用程序么?这些程序是否如同前面所描述的那么好?下面我们就先来简单了解一下目前常见的几款能够支持CUDA的应用软件:
◆ Google earth需要3D加速
Google earth是一款3D地图显示软件,它能够将地球上某一区域的地貌,以3D图像的形式展现出来。这款软件读者都很熟悉,早期的Google earth从2D起步,但是随着深入发展和商业应用,这款软件也进入了3D化,很显然,这类软件将会逐渐成为我们今后生活的必备软件。
在Google earth的设置界面,如果你拥有一个
当我们以最高画质量为限查找地图街景时,带有GPU的PC系统可以流畅地进行地图缩放。而同样的场景、同样的搜索速度、同样的处理器,在没有GPU加速时,运转速度简直无法忍受,在Fraps显示的速率上,使用GPU加速和不使用GPU加速情况下,速度落差达到了几十倍之巨,由此可见,GPU的作用和意义绝不仅限于游戏。
◆ 图片、视频都是3D的
Cooliris推出的Piclens插件可以让图片搜索变为3D模式,通过用GPU硬件加速来实现图片浏览。但就是这么一个实用的小插件,没有GPU也是不行的。鼠标滚轮就能让所有图片成为一面幕墙,这么有趣的功能没有GPU加速可是不行的哦。
浏览图片时GPU加速非常有意义,在使用普通集成显卡时,这个数值还不到24fp。当我们使用一块GeForce 9600GT进行GPU加速时,cooliris满速率运行可达60fps,但换用集成显卡时,这个数值还不到24fps,前后的差距至少达到了2.5倍。
目前能够支持CUDA的应用软件介绍(二)
◆ 连PDF都需要GPU加速
随着计算机的发展,图形、图像的显示成为越来越重要的工作。现在连阅读传统的PDF文件,都离不开GPU的加速了。早在2007年,Adobe就与NVIDIA展开合作,推出了支持GPU加速的PDF版本。
同样一个容量达到50MB的期刊读物电子版PDF文件,在使用传统方式打开时,读取时间为8秒。而使用GPU硬件加速功能时,打开时间不超过3秒,且在浏览时不会有拖沓感,PDF文件也变得流畅异常了。
◆ 图片浏览也向3D迈进—Google Picasa2
Google Picasa2是一款可帮助您在计算机上立即找到、修改和共享所有图片的软件。在使用NVIDIA显卡的电脑上使用Picasa软件,通过GPU加速,图片的拖放或文件夹切换,图片生成的速度都非常快。如果换用没有GPU加速的平台,搜索图片时生成速度可绝非一时一刻,前后对比,数倍的差异十分明显。
◆ PICTOMIO,华丽的3D图片浏览
Pictomio是一个类似于Picasa的图片浏览和管理软件,它提供了极其华丽3D图片浏览效果。如果PC中具备GPU,那么完全可以利用强大的GPU将浏览方式变更为3D模式,无缝缩放、渐变式切换,效果十分惊叹。但如果没有GPU,平面的交互效果实在是太过让人失望了。 #p#page_title#e#
GPU加速详细实例,Google Earth路线导航
下面,我们以目前不少人非常喜爱的Google Earth来举例,看看CUDA在Google Earth中能够起到怎样的作用。Google Earth是大家非常熟悉的三维地图软件。通过它您能看到全世界任何角落的三维地图(数据库中没有数据的地区当然除外喽),清晰得能看到街道上的小汽车!它带来的视觉震撼是绝无仅有的。
以下是一个很有趣的应用例子:由于Google Earth可以提供从某地到某地的一个线路查询,下面是一个从San Francisco的一个叫1 market street街道到San Francisco的线路指引,Google Earth还提供了三维的经过路线播放演示:
『线路是:从右上角到左下角』
『这个绿色标志地方是开始点』
『途中经过的两个拐弯点』
『最终到达终点』
整个从起点到终点都是3D显示周围的实物,其中包括耸立的建筑物、街道等等,如果有NVIDIA GPU的图形加速,可以让这个过程非常流畅。
实际检验GPU能力——视频编码:Badaboom
进行视频编码的操作我们平时经常用到,例如我们要将从网络上下载或者从DVD上获得的视频文件进行重新的编码压缩,才能传到我们手机、IPOD、iPhone以及PSP中观看。一般情况下视频编码完全是由CPU进行计算处理,CPU性能越强,编码速度越快。
不过在应用CUDA技术的GeForce GTX280上,我们可以使用GPU的强大性能来进行视频编码。经过实测,其速度要比CPU编码超出数倍。下面让我们来看一下对比测试。
下面我们先使用平时较为常用的Aimersoft iPhone视频转换器进行一次视频转换。视频源是MPEG2格式的720P的电影片段。目标是压缩成iPhone可用的640x480分辨率的H.264视频。
『CPU运算编码,耗时很长』
Aimersoft iPhone视频转换器进行视频编码完全依赖于CPU运算,在整个转换过程中我们花费了2分39秒。这样计算下来,如果要转换一部一个半小时的电影大约就要花费129分钟,等待时间相当长。
下面我们就来看看利用GeForce GTX280 GPU来进行硬件视频编码的性能。测试中我们使用了一款名为Badaboom的视频转换软件,其目前可以支持NVIDIA的GPU视频编码加速。
测试软件:Badaboom
相关介绍:Badaboom是一款视频转换软件,可以把Mpeg2等格式的视频转换为ipod或者iPhone这样的所使用的H.264视频格式。
『GTX280 GPU运算进行视频编码,比CPU耗时缩短6倍』
同样还是刚才那段视频,整个过程大约只花费了26秒时间,速度提升了6倍多,速度非常快。如果您是iPhone的用户,我想以后就无需再消耗长时间进行视频的压缩了。
实际检验GPU能力——科学计算:Folding@Home斯坦福大学的分布式计算系统非常有名,其开发了一套名为Folding@home的客户端软件,所有互联网电脑都可以通过这套软件模拟复杂的蛋白质折叠效应科学计算。
什么是Folding@home?
Folding@home是一个研究研究蛋白质折叠,误折,聚合及由此引起的相关疾病的分布式计算工程。我们使用联网式的计算方式和大量的分布式计算能力来模拟蛋白质折叠的过程,并指引我们近期对由折叠引起的疾病的一系列研究。(摘自Folding@home中文网)
安装上CUDA版本的Folding@home后,我们现在开启显示窗口,可以看到当前计算的即时速度。使用GeForce GTX280时,大约显示的速度为500多ns/day。而如果使用CPU,速度大概只有4ns/day左右,可以看到GTX280的科学运算能力非常强。
我们进行一次完整的计算来看看GeForce GTX280的计算速度,同时我们还同AMD 四核羿龙CPU以及ATI Radeon HD3870进行的对比。
从速度成绩中可以看到GeForce GTX280的领先幅度很大。GPU的强大的性能展现出来,CPU完全落后。