CUDA:领导GPU高性能计算的革命
1999年NVIDIA GeForce图形处理器的发布,实现了顶点的矩阵变换和光照计算,真正意义上的GPU宣告诞生。随着GeForce 3开始引出可编程特性,能将图形硬件的流水线作为流处理器来解释,基于GPU的通用计算也开始出现。
到了Nvidia GeForce6800这一代GPU,功能相对以前更加丰富、灵活。顶点程序可以直接访问纹理,支持动态分支;象素着色器开始支持分支操作,包括循环和子函数调用,TMU支持64位浮点纹理的过滤和混合,ROP(象素输出单元)支持MRT(多目标渲染)等。象素和顶点可编程性得到了大大的扩展,访问方式更为灵活,这些对于通用计算而言更是重要突破。
G80计算架构 |
真正的革命来自于2006年,NVIDIA在这一年推出了基于DX10统一渲染体系的旗舰图形处理器G80,当人们为其强悍的3D效能惊叹时,有谁又会想到NVIDIA这次会给那些GPU通用运算的支持者带来的更加目瞪口呆的变革!
G80包含了128个处理器(最新的G200包含了240个处理器),在某些大规模并行计算的应用上,相对于CPU来说性能提高可达100倍以上。现代的GPU计算能力已经远远的超过了CPU和其他的处理器。但是如此强大的计算能力如果只能应用在图形方面,对于计算资源来说是一个极大的浪费
◆ GPGPU与GPU计算
为了能够在图形计算之外的更多领域发挥GPU强大的计算功能,人们2002年就开始研究如何能够利用GPU完成通常意义上的数据运算,这被称之为GPGPU(General-Purpose computing on Graphics Processing Units,基于GPU的通用计算)。
由于第一代GPU的计算是基于矢量的运算(可以理解为基于数组的计算),因此第一代的GPGPU采取的技术方案是先将需要处理的计算问题转化为能够用矢量表示的问题,然后通过例如DirectX或者OpenGL这样的图形API完成计算取回结果。由于这些图形API会使用GPU来完成相应的计算,因此也就通过这种间接的方式实现了GPGPU。但是这种方式存在着很大的不便。
它的问题在于芯片设计本身是为了图形而进行设计的,所以是强制一个本为图形设计的芯片之上的进行通用用途的计算。而且在这种通用用途的GPU计算当中,没有办法用高级程序语言比如C、C++语言进行编程。
这就是为什么在2004年的时候,NVIDIA就专门请了相关硬件方面的设计师以及软件方面的设计师对于GPU进行重新的完全不同的以前的设计,它既适用于图形,也是适用于计算的。
随着统一渲染架构的诞生,GPU本身的计算方式由基于矢量计算转为了基于标量的并行计算。当摆脱了架构和计算方式所带来的限制之后,GPU所能处理的问题由图形领域扩展到了通用计算领域。而在开发领域,需要有一种灵活的开发方式,能够让用户直接使用GPU的计算能力,而CUDA正是为此而诞生。
这就是为什么现在可以在C语言的环境当中,也就是所说的CUDA这个环境当中对于GPU进行编程,而这,也就是我们现在所说的GPU计算
◆ GPU是并行计算的高手
仅仅几年的时间,可编程图像处理器单元已经发展成为绝对的计算主力,由于具有由高内存带宽驱动的多个核心,今天的GPU为图像和非图像处理提供了难以置信的资源。 #p#page_title#e#
GPU的浮点运算能力是CPU的十数倍 |
发展背后的主要原因是GPU是特定于计算密集的、高并行的计算,而这正是图像渲染所需要的,因此GPU设计了更多的晶体管专用于数据处理,而非数据高速缓存和流控制。
GPU相比CPU拥有更多的处理单元 |
GPU的处理核心SP基于传统的处理器核心设计,能够进行整数,浮点计算,逻辑运算等操作,从硬体设计上看就是一种完全为多线程设计的处理核心,拥有复数的管线平台设计,完全胜任每线程处理单指令的工作。
GPU内的线程分成多种,包括像素、几何以及运算三种不同的类型,在三维图像处理模式下,大量的线程同时处理一个shader program以达到最大化的效率,所以像GTX 200 GPU的核心内很大一部分面积都作为计算之用,和CPU上大部分面积都被缓存所占据有所不同,大约估计在CPU上有20%的晶体管是用作运算之用的,而(GTX 200)GPU上有80%的晶体管用作运算。GPU处理的首要目标是运算以及数据吞吐量,而CPU内部晶体管的首要目的是降低处理的延时以及保持管线繁忙,这也决定了GPU在密集行计算比起CPU来更有优势
具体来说,GPU专用于解决数据并行计算(同一程序在许多数据元素上并行执行)、具有高运算密度(算术运算与内存操作的比例)的问题。因为同一程序为每个数据元素执行,所以对高级流控制具有较低的要求;又因为在许多数据元素上执行并具有高运算密度,所以内存访问延迟可以使用计算而非大的数据高速缓存来隐藏。
数据并行处理将数据元素映射到并行处理线程。处理大型数据集合(比如数组)的许多应用程序可以使用数据并行编程模型来加速计算。在3D渲染中,大型像素和顶点集合映射到并行线程。同样的,图像和媒体处理应用程序,比如渲染图像的后期处理、视频编码和解码、图像扩展、立体视觉、模式识别,可以将图像块和像素映射到并行处理线程。事实上,图像渲染和处理以外的许多算法也是可由数据并行处理来加速,范围涉及一般的信号处理或物理模拟,直至财务计算或计算生物学。
但是,直到现在,获得GPU中的所有计算能力并将其有效用于非图像应用程序中仍然是一个难题,正如前面所说的困难,迫切需要一种新颖的硬件和编程模型,让GPU的计算能力得以完全发挥,并将GPU暴露为一种真正通用的数据并行计算设备。
GPU计算,并不是说不再需要CPU了。
◆ GPU+CPU异构运算
实际上,在GPU计算中CPU和GPU之间是相连的,而且是一个异构的计算环境。这就意味着说你的应用程序当中,顺序执行这一部分的代码是在CPU里面进行执行的,而并行的也就是计算密集这一部分是在GPU里面进行。
到底什么是顺序,什么是并行?用简单例子说,假设每人手中都有一瓶水,这里有一个桶,要把这个桶装满,顺序的话,就是一个人来了以后另外一个人再过来; 并行的话,所有人把水同时往桶里倒,这样的话,显然通过并行的方式速度会快很多。
而且这里还有另外一个区别,现在CPU里面可能是有双核或者是四核,根据它们的发展路径,下一站可能是八核。但现在GPU当中核心的数量是以百来计算的,在CPU中,我们说的是Mutli-Core,大概就是多核的意思;但是GPU里面用的是Many-Core,意思是群核。
如果大家一同到这里往水桶里面倒水的话,就是一种并行;但如果只是一声令下,所有人都到前面去到水,可能场面的秩序会很混乱,因此,在并行运算当中,需要对它进行控制,使它有秩序。就像一支部队需要一名指挥官一样来保证这个部队能够有序地服从命令。而从这个意义上来说,CUDA就像指挥官一样,通过使用CUDA,这些程序能够被有效、高效地使用。
实际上在并行运算当中,数据是被分为一块一块地同时执行。运算的结果也是同顺序计算相同的,是按照一种并行的方式进行表达的。
异构运算(heterogeneous computing)的想法是这样的,通过使用计算机上的主要处理器,如CPU以及GPU来让程序得到更高的运算性能。一般来说,CPU由于在分支处理以及随机内存读取方面有优势,在处理串联工作方面是好手。在另一方面,GPU由于其特殊的核心设计,在处理大量有浮点运算的并行运算时候有着天然的优势。完全使用计算机性能实际上就是使用CPU来做串联工作,而GPU负责并行运算,简单来讲,异构运算就是“使用合适的工具做合适的事情”。
那么什么程序是以串联工作为主而什么程序又是以并行的运算为主呢?其实只有很少很少的程序使用纯粹的串联或者并行的,大部分程序同时需要两种运算形式。编译器、文字处理软件、浏览器、e-mail客户端等都是典型的串联运算形式的程序。而视频播放,视频压制,图片处理,科学运算,物理模拟以及3D图形处理(Raytracing及光栅化)这类型的应用就是典型的并行处理程序。
◆ CUDA:一种在GPU上进行计算的新架构
前面我们提到过CUDA,那CUDA到底是何方神圣呢?
它是我们迫切需要的新颖的硬件和编程模型,能让GPU的计算能力得以完全发挥,并将GPU暴露为一种真正通用的数据并行计算设备。
CUDA表示Compute Unified Device Architecture(统一计算设备架构),是NVIDIA为自家的GPU编写了一套编译器及相关的库文件。作为一种新型的硬件和软件架构,用于将GPU上作为数据并行计算设备在GPU上进行计算的发放和管理,而无需将其映射到图像API。
CUDA提供了硬件的直接访问接口,不必依赖图形API |
CUDA可用于GeForce 8系列、Tesla解决方案和一些Quadro解决方案,操作系统的多任务机制负责管理多个并发运行的CUDA和图像应用程序对GPU的访问。
CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。CUDA是业界的首款并行运算语言,而且其非常普及化,目前有高达8千万的PC用户可以支持该语言。
CUDA的特色如下,引自NVIDIA的官方说明:
1、为并行计算设计的统一硬件软件架构。有可能在G80系列上得到发挥。
2、在GPU内部实现数据缓存和多线程管理。这个强,思路有些类似于XB360 PS3上的CPU编程。
3、在GPU上可以使用标准C语言进行编写。
4、标准离散FFT库和BLAS基本线性代数计算库。
5、一套CUDA计算驱动。
6、提供从CPU到GPU的加速数据上传性能。瓶颈就在于此。
7、CUDA驱动可以和OpenGL DirectX驱动交互操作。这强,估计也可以直接操作渲染管线。
8、与SLI配合实现多硬件核心并行计算。
9、同时支持Linux和Windows。
◆ 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对于GPU产品线还涵盖了从笔记本电脑到高性能多GPU的系统中。也就是说,对于普通用户来讲,我们使用的普通笔记本或者台式电脑,只要拥有一块NVIDIA的GeForce 8以上级别的显卡都能够支持CUDA。
CUDA-enabled GPU的家族还在不断地扩大之中,随着NVIDIA新一代GPU的发布,更多的产品也将加入到这个行列中来。
软件方面,对于普通的应用者来说,只要安装了一款能够支持CUDA的驱动程序,就可以了。接下来需要做的就是使用那些能够支持CUDA的软件。随着越来越多的软件开发者加入CUDA的行列,日后能够支持CUDA的软件将会逐渐完善起来。
◆ CUDA的本质
CUDA的本质是,NVIDIA为自家的GPU编写了一套编译器NVCC极其相关的库文件。CUDA的应用程序扩展名可以选择是.cu,而不是.cpp等。
NVCC是一个预处理器和编译器的混合体。当遇到CUDA代码的时候,自动编译为GPU执行的代码,也就是生成调用CUDA Driver的代码。如果碰到Host C++代码,则调用平台自己的C++编译器进行编译,比如Visual Studio C++自己的Microsoft C++ Compiler。然后调用Linker把编译好的模块组合在一起,和CUDA库与标准CC++库链接成为最终的CUDA Application。由此可见,NVCC模仿了类似于GCC一样的通用编译器的工作原理(GCC编译CC++代码本质上就是调用cc和g++)。
CUDA在执行的时候是让host里面的一个一个的kernel按照线程网格(Grid)的概念在显卡硬件(GPU)上执行。每一个线程网格又可以包含多个线程块(block),每一个线程块中又可以包含多个线程(thread)。
以军队来打比方,每一个线程,就相当于每一个士兵,当要执行某一个大的军事任务的时候,大将军(Host)发布命令,把这次行动分解成一个一个的子任务(kernel_1,kernel_2……kernel_M),每个子任务由不同的统领(Grid)负责,各统领又把任务分成一部分一部分,划分给手下的小头目(Block),这些任务就由小头目下的士兵(Thread)去执行完成。
通过CUDA编程时,将GPU看作可以并行执行非常多个线程的计算设备(compute device)。它作为主CPU的协处理器或者主机(host)来运作:换句话说,在主机上运行的应用程序中数据并行的、计算密集的部分卸载到此设备上。
经过了CUDA对线程、线程块的定义和管理,在支持CUDA的GPU内部实际上已经成为了一个迷你网格计算系统。在内存访问方面,整个GPU可以支配的存储空间被分成了寄存器(Register)、全局内存(External DRAM)、共享内存(Parallel Data Cache)三大部分。其中寄存器和共享内存集成在GPU内部,拥有极高的速度,但容量很小。共享内存可以被同个线程块内的线程所共享,而全局内存则是我们熟知的显存,它在GPU外部,容量很大但速度较慢。经过多个级别的内存访问结构设计,CUDA已经可以提供让人满意的内存访问机制,而不是像传统GPGPU那样需要开发者自行定义。
在CUDA的帮助下普通程序员只要学习一点点额外的GPU架构知识,就能立刻用熟悉的C语言释放GPU恐怖的浮点运算能力,通过CUDA所能调度的运算力已经非常逼近万亿次浮点运算(GeForce 280GTX单卡浮点运算能力为933GF LOPS)。而在此之前要获得万亿次的计算能力至少需要购买价值几十万元的小型机。
◆ CUDA的应用领域与发展前景
由于GPU的特点是处理密集型数据和并行数据计算,因此CUDA非常适合需要大规模并行计算的领域。目前CUDA除了可以用C语言开发,也已经提供FORTRAN的应用接口,未来可以预计CUDA会支持C++、Java、Python等各类语言。虽然现在更多的应用在游戏、图形动画、科学计算、地质、生物、物理模拟等领域,但是由于GPU本身的通用特性和CUDA提供的方便的开发环境,我们可以放开思维的束缚,想象几种可能的应用场景:
◇ 搜索引擎中的排序、文本分类等相关算法的应用
◇ 数据库、数据挖掘
◇ 电信、金融、证券数据分析
◇ 数理统计分析
◇ 生物医药工程
◇ 导航识别
◇ 军事模拟
◇ 无线射频模拟
◇ 图像语音识别
这些领域内的计算都是属于大规模的数据密集型计算,因此我们完全有理由相信,在CUDA的驱动下,GPU能够在这些领域建立一个属于自己的新时代
◆ CUDA应用举例:实时的裸眼立体医疗成像系统
在成像技术中,一个非常有趣的领域就是裸眼立体成像技术,它无需特殊眼镜就能显示三维立体图像。这种有趣的技术不仅有着娱乐方面的应用潜力,也可作为多种专业应用程序的实用技术。东京大学信息科学与技术研究生院机械信息系的Takeyoshi Dohi教授与他的同事研究了NVDIA的CUDA并行计算平台之后认为,医疗成像是这种平台非常有前途的应用领域之一。
自2000年以来,这所大学的研究小组已经开发出一种系统,通过CT或MRI扫描实时获得的活体截面图被视为体纹理,这种系统不仅能够通过体绘制再现为三维图像,还可作为立体视频显示,供IV系统使用。该系统为实时、立体、活体成像带来了革命性的变化。但是,它的计算量极其庞大,仅体绘制本身就会带来极高的处理工作量,况且此后还需要进一步处理来实现立体成像。对于每一个图像帧,都有众多角度需同时显示。将此乘以视频中的帧数,您会看到令人震惊的庞大计算数量,且必须在很短的时间内高度精确地完成这样的计算。
在2001年的研究中,使用了一台Pentium III 800 MHz PC来处理一些512 x 512解析度的图片,实时体绘制和立体再现要花费10秒钟以上的时间才能生成一帧。为了加速处理,研究小组尝试使用配备60块CPU的UltraSPARC III 900 MHz机器,这是当时性能最高的计算机。但可以得到的最佳结果也不过是每秒钟五帧。从实用的角度考虑,这样的速度还不够快。
研究人员使用NVIDIA GPU GeForce 8800 GTX开发了一个原型系统。在使用CUDA的GPU上运行2001年研究所用的数据集时,性能提升到每秒13至14帧。UltraSPARC系统的成本高达数千万日元,是GPU的上百倍,而GPU却交付了几乎等同于其三倍的性能,研究人员为此感到十分惊讶。不仅如此,根据小组的研究,NVIDIA的GPU比最新的多核CPU至少要快70倍。另外,测试显示,对于较大规模的体纹理数据,GPU的性能更为突出。
目前,这支研究小组正运用NVDIA最新的桌面端超级计算机Tesla D870,针对使用CUDA的Tesla优化目前的IV系统。这一举措有望使性能获得更大幅度的提升效果。
◆ CUDA应用举例:Photoshop图形处理加速
Adobe Photoshop是业界最常用最强大的图像处理软件,从CS3版本开始,它支持3D图形处理。而最新的CS4版本是首个正式支持GPU加速功能图像处理软件,现在只要大家拥有一片GeForce或Quadro显卡,就可以体验实时高效的GPU加速操作,常用的处理包括图像缩放、图像旋转、图像移动等等。加速这些常用操作会令用户大大提升工作效率,让我们轻松愉快地沉醉于创作之中。
GPU加速的图片快速缩放:
通过GPU加速,Photoshop CS4用户可以快速流畅的放大图片,给用户一个舒适的操作环境 |
普通缩放:
对比没有使用GPU加速的图片缩放操作,就可以感受到两者之间的巨大差别,想象一下这样子的操作是多么的不爽和郁闷 |
◆ CUDA应用举例:金融业LIBOR
金融行业的研究人员也采用了金融计算研究用途的GPU。上图选自一名在GPU性能研究方面已经获得卓越成就的牛津大学的研究人员。即便与专门的加速设备比较时,GPU也能提供远比一个单独CPU或CPU加上加速器高得多的性能。
◆ CUDA应用举例:VMD/NAMD分子动力学
NAMD MD是一个重要的医学应用程序类别。分子动力学是一种用于生物学研究的基本工具。之前,伊力诺依州立大学的研究人员在它们的网站上发布了一款 GPU加速版的视觉分子动力学工具,而最近,又发布了一款纳米级分子动力学工具。该工具可以从他们的网站上免费下载。NAMD MD是将并行计算应用于生物学中的基本工具的一个典型案例。
◆ CUDA应用举例:N体天体物理学
第一个利用GPU的科学领域是天体物理学,去年11月,天体物理学家举行了第一次GPU加速天体物理学应用软件的研究会议。上图为研究人员利用GPU在一台普通的PC上模拟2百万个粒子,GPU强大的并行计算能力帮助这位研究人员做到了这一点。
◆ CUDA应用举例:Manifold 8地理信息
CUDA作为第一款标配应用软件用于地理信息系统(GIS)处理。该软件可制作出一幅地图,并叠加上人口信息,如该区域居民的年龄、住房类型、公路的数量等等 所有描述居住区的信息。规划人员使用GPU可以正确设计道路、房屋以及各种服务的位置,打造更加高效的城市。
◆ CUDA应用举例:视频转换加速
利用CUDA实现GPU计算来为应用程序提速,Badaboom就是很好的一例,这是一款CUDA开发的视频转换软件,可以把mpeg2的视频转换为ipod或者iphone这样的所使用的H.264视频格式。
GPU也可以给视频转换提速,处理速度达到80FPS左右,耗时37秒 |
选取一段码率较高的MPEG2视频,可以看到GTX 280的处理速度达到了80FPS左右,如果码率较小,还可以达到100FPS以上甚至更高。328MB的MPEG2视频转换成17.4MB的iPhone可用的MP4视频(640*365),只用了37s。而同样平台下用CPU进行计算,得到的结果是耗时107s,几乎是用GTX 280转换耗时的三倍。
◆ CUDA应用举例:Folding@home
利用GTX 280的并行计算能力模拟蛋白质折叠 |
Folding@home是美国史丹佛大学推动的分散式运算计划,目的在于使用联网式的计算方式和大量的分布式计算能力来模拟蛋白质折叠的过程,并指引对由折叠引起的疾病的一系列研究。NVIDIA的CUDA显卡也加入了Folding@home计划,目前全球有8000万块CUDA显卡(GeForce 8及以上及Quadro和Tesla系列),平均拥有100GFLOPS的浮点运算能力,如果这其中有0.1%参与Folding@Home,就能够为该计划带来7PFLOPS的运算能力,远远高于全世界最强大的超级计算机(运算能力不足1PFLOPS)。
◆ CUDA:主导GPU计算的革命
GPU超强的计算能力让它在通用计算领域大有可为,而CUDA则让它变成可能,简单易用的开发环境让CUDA主导起GPU计算的革命。
正如NVIDIA首席科学家David Kirk所说:“我认为CUDA已经取得了空前成功,它的接受程度令人吃惊。这也表明了人们希望对整台电脑进行编程的浓厚兴趣。过去人们往往是编写一个C程序来控制CPU,再编写一个图形程序来控制GPU。你一定想通过编写一个程序来控制CPU和GPU。因此我坚信,将来CUDA将变得无处不在。如果要对CPU和GPU进行编程并管理系统中的所有资源,那就没有理由不用CUDA。”
GPU正逐渐将并行计算推向主流,并行计算与异构处理器系统的“联姻”将是大势所趋。而主导这场变革的就是CUDA。随着越来越多的开发者加入到CUDA怀抱,支持CUDA的软件必将渗透到我们生活的方方面面,亿万次的计算能力是我们充满期待最好的诠释。
◆ CUDA Q&A
让我们来听听NVIDIA亚太区技术市场经理邓培智先生是如何看待GPGPU和CUDA的。
Q:CUDA和GPGPU在概念上有何不同?
A:GPGPU其实是一个比较宽泛的概念,它的计算还是通过API送入GPU的。传统的GPGPU应用往往要了解OpenGL编程或者DirectX编程;而现在基于CUDA平台,如果你的应用不涉及OpenGL或者DirectX的话就可以不用理会那些API。换句话说,以前的GPGPU进行通用计算是通过把这些问题转换成为图形计算送到GPU中完成的,而现在基于CUDA则可以直接调用GPU的计算资源,成为高性能计算的软件开发环境。
Q:CUDA是面向什么样的人群的?能够解决什么问题?
A:简单地讲,CUDA是用于GPU计算的开发环境,其核心则是一个C的编译器。CUDA对于非图形的计算并没有什么限制,不过它还是相对比较适合高度并行的计算,毕竟这是它的长处。我们讲高度并行,也就是说同时运行相当多个线程。相对于CPU来讲,双核的CPU也许几个线程就能充满它整个的计算单元,然而CUDA-enabled GPU却能够容纳上千个线程。所以常遇到的高性能计算领域的问题就特别适用于CUDA,而之前我们也许只能使用集群的方式来进行计算。
Q:听起来很不错!那基于CUDA的GPGPU应用能够完成通常意义上的所有计算吗?
A:是这样的,就像我们刚才说的那样,CUDA还是主要去做那些能够分成很多个独立线程的数值计算。比如说矩阵的乘法计算,矩阵相对应的元素的计算是没有什么联系的,可以很多个线程同时送入很多个处理器进行并行处理,这就非常适合于用CUDA来解决。当然并不是所有的事情CUDA都能够很好地解决,比如像操作系统这样复杂的指令和纷繁的分支循环而又用很少的线程来处理,这显然就不是CUDA的强项了。高度并行的计算是CUDA的技术特性之一。
Q:我们都知道,以前的GPU是不能处理类似于逻辑控制的指令的?现在的GPU芯片的发展情况是如何的呢?
A:现在是完全可以的。其实从我们的GeForce6一代开始,就能够支持比较复杂的控制指令,比如条件转移、分支、循环和子程序调用等。而到了GeForce8这一代,我们的程序控制能力又增强了很多,支持的程序长度也得到了更大的扩展,也就是说利用GPU还是可以写一些比较复杂的程序。
Q:GPU里面包含的128个stream processor的计算能力跟CPU相比如何呢?
A:其实,GPU的stream processor个数是不能和CPU现在拥有的内核数量作类比的。CPU的每一个核心都是一个完整的CPU,而GPU中的每个stream processor并不完全是这样,它有一个组织方式,比如每8个stream processor组成一个Stream Multiprocessors (SM),每两个SM组成一个PTC。而指令的执行,我们GPU计算是基于线程的,每几十个线程组成一个我们叫做warps,这些线程在每个warps里面都工作在SIMD(单指令多数据)的方式。
Q:GPU中谈的线程和CPU中的线程似乎有些不太一样,区别在哪里呢?
A:GPU中的线程是一种非常轻量级的线程,创建线程的开销非常小,比如说一个顶点计算中要做一个两个矩阵的乘法运算,每个元素的相乘操作都会作为一个线程的任务提交到GPU中。而CPU中的线程所做的就比这个要多得多了,除了数据计算还可能会包含大量逻辑控制方面的指令。
Q:CUDA已经发布了1.1版本吗?相对于1.0有什么变化?
A:对。主要是做了一些小的升级,改变了对C语言的支持的改进,增加了对新的指令和格式的支持等等,功能上没有什么太大的变化。不久也将会发布一个GPU的Debugger,以后将会支持新的C语言的版本,现在是支持到VC7.1和VC8.0,也就是Visual Studio .Net和Visual Studio 2005,以后会支持Visual Studio 2008,还会增加对Vista的支持,值得一提的是,今年会增加对双精度的支持。而且CUDA的驱动程序也整合到了显卡的驱动程序里面。
Q:所谓的支持这些开发环境,指的是CUDA的编译器nvcc可以和这些开发环境联立起来编译项目?
A:对,你说的很对,就是指编译器能够和VC协同工作。实际上我们的编译器nvcc会把CPU code和GPU code分开,CPU code还需要使用传统的编译器编译,而GPU code就能通过nvcc编译成GPU的代码。
Q:如果开发人员想建立一个CUDA的开发环境,只能使用NVIDIA的GPU吗?
A:对,现在来看是这样的。因为其他公司的GPU的架构我们也不清楚,而且也不一定适应大规模的计算。我们NVIDIA的GPU考虑到要进行计算,每一个stream processor都采用标量架构,而有的公司则是使用矢量计算,可能在效率上会存在一些问题;再说CUDA的运行需要显卡驱动的支持,我们也不可能要求其他厂商的驱动支持我们的CUDA。
退一步说,我们的显卡市场占有率还是比较高的,大致在60%左右,所以应该造成的影响不会太大。况且CUDA都使用在中高端领域,而在中高端市场我们则有更高的市场占有率,绝大部分的用户都在使用NVIDIA的GPU,所以绝大部分的用户都可以使用CUDA。
Q:从已经实现的案例中,CUDA通常都应用在哪些领域呢?
A:从高层的应用角度分析,那就很多了。比如有限元的计算、神经元的研究计算、地质分析等等科学研究的领域;比如游戏中的物理模拟等问题。当然目前GPU计算的应用还是处于一个早期的阶段,大部分CUDA应用都是专业人员和相关的程序员在开发,我们希望以后会有实际的基于CUDA的程序,更多的程序员能够加入进来,并且开发一些可以给大家日常应用带来好处的程序,只要有支持CUDA的GPU就能够利用到GPU计算的好处。
Q:把现有的软件,当然都是使用CPU计算的,移植到CUDA平台使用GPU的计算能力来加速的话需要多大的工作量?
A:这个就要看情况了。如果说以前在单个CPU上跑的应用,可能在并行性上没有太多的考虑,要想使用CUDA来利用GPU计算的资源,就要改写程序中的计算部分,以便于更好地利用GPU的能力,毕竟CUDA非常适用于大规模的高度并行的高性能计算。所以最好还是在程序一开始编写的时候就用CUDA这种模式编写,如果移植以前的程序可能还是会涉及到很多其他的问题。
Q:你认为很多初次接触CUDA的人对于CUDA是否会有一些理解有误的地方?
A:这是个好问题,显然他们在这里存在几个常见的误解。
第一,可能有人认为“有了GPU之后CPU就不需要了”,显然GPU和CPU还是做不同的工作的,GPU的计算主要集中在高效率低成本的高性能并行计算;
第二,有人觉得“有GPU做计算CPU就不需要很强大”,但事实上在一个系统里面,一个高效的GPU配合一个高效的CPU,整体的效率还是会有明显提升的,这些都是明显的误解;
第三,也许不叫误解,应该是更多的人对于CUDA的应用范围不是很了解。其实说穿了,CUDA适合于并行计算,大规模的并行计算,成千上万的线程的并行计算