第二期有奖讨论:CUDA你知道多少

CUDA是NVIDIA近来力推的东西,简单的说,CUDA可以认为是一种以C语言为基础的平台,主要是利用显卡强大的浮点运算能力来完成以往需要CPU才可以完成的任务。CPU的特点是什么都能干,但不够专,运算能力不高,而显卡则很专,专门运算图形方面的浮点运算,能力比CPU强10倍以上。但显卡的应用范围狭窄,所以NVIDIA为了让它的显卡在电脑中有更高的地位,就搞了这么个CUDA。
想用CUDA,必须是NVIDIA的显卡,而且要是GEFORCE 8以后的显卡。平常没什么用,只是在转换视频格式,以及看高清时有点作用。暂时CUDA的作用范围仍然比较狭窄,就看NVIDIA能把它如何发展了。

CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台。

随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化。在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的。

目前只有G80平台的NVidia显卡才能使用CUDA,工具集的核心是一个C语言编译器。G80中拥有128个单独的ALU,因此非常适合并行计算,而且数值计算的速度远远优于CPU。

CUDA的SDK中的编译器和开发平台支持Windows、Linux系统,可以与Visual Studio2005集成在一起。

目前这项技术处在起步阶段,仅支持32位系统,编译器不支持双精度数据等问题要在晚些时候解决。Geforce8CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。

怎么说GPU还是不能替代CPU的吧~
发展成互补也不错!

在2006年11月份, NVIDIA 引入了CUDA™概念, 一个通用并行计算架构—含有新的并行编程模型和指令架构– 其使得将NVIDIA GPU中的并行计算引擎的能力得以提升从而利用该架构能比在传统CPU上更加高效的解决许多复杂计算问题。

CUDA 的软件环境使得开发者能够使用C作为高级语言来进行CUDA编程。如图1-3所示,其他的语言或者应用程序接口(API)在未来也会被支持,诸如 FORTRAN, C++, OpenCL, 以及 Direct3D 11 Compute。
多核 CPU 和多核 GPU 的出现意味着并行系统已成为主流处理器芯片。此外,根据摩尔定律,其并行性将不断扩展。这带来了严峻的挑战,我们需要开发出可透明地扩展并行性的应用软件,以便利用日益增加的处理器内核数量,这种情况正如 3D 图形应用程序透明地扩展其并行性以支持配备各种数量的内核的多核 GPU。

CUDA 是一种并行编程模型和软件环境,用于应对这种挑战,同时保证熟悉 C 语言等标准编程语言的程序员能够迅速掌握 CUDA。

CUDA 的核心有三个重要抽象概念:线程组层次结构、共享存储器、屏蔽同步(barrier synchronization),可轻松将其作为 C 语言的最小扩展级公开给程序员。

这些抽象提供了细粒度的数据并行化和线程并行化,嵌套于粗粒度的数据并行化和任务并行化之中。它们将指导程序员将问题分解为更小的片段,以便通过协作的方法并行解决。这样的分解保留了语言表达,允许线程在解决各子问题时协作,同时支持透明的可伸缩性,使您可以安排在任何可用处理器内核上处理各子问题:因而,编译后的 CUDA 程序可以在任何数量的处理器内核上执行,只有运行时系统需要了解物理处理器数量。

可伸缩的编程模型允许CUDA架构能够在处理器的数目以及内存分配上具备很大的市场跨度:从高端狂热玩家的 GeForce GTX 280 GPU 以及专业的Quadro 和 Tesla 计算产品到主流的价格便宜的GeForce GPU。

CUDA是什么?很多人认为它是一个由NVIDIA设计的一种新软件或者新API,其实CUDA是一种硬件架构,也就是说目前NVIDIA的GeForce产品全都基于CUDA架构设计。CUDA架构最主要的包含两个方面:一个是ISA指令集架构;第二硬件计算引擎。实际上它就是硬件和指令集,这两个方面是CUDA的架构。

 NVIDIA GPU的架构就是CUDA的架构,举例来说,你可以把它看成是跟Intel的X86或者IBM的Cell,他们都是CPU架构,而CUDA架构是基于GPU的架构。

 CUDA的GPU架构和CPU架构很类似,比如X86是包含一套指令集和执行X86各种各样的CPU,而对于CUDA也是一样的,NVIDIA有一套指令集ISA,还有各种各样执行指令集和各种各样的硬件引擎。另外CUDA到目前为止,它包含了一个C语言的编译器,就是在CUDA上面的C语言,CUDA这个架构还可以支持其他的API,包括OpenCL或者DirectX,同时以后NVIDIA的CPU还支持其他语言,包括Fortran、Java、Python等各种各样的语言,可以说这种架构是原生的,专门为计算接口而建造的这样的一个架构。CUDA硬件架构包括指令集都是非常适合于并行计算,为异构计算而设计的一整套架构。

CUDA是NVIDIA近来力推的东西,简单的说,CUDA可以认为是一种以C语言为基础的平台,主要是利用显卡强大的浮点运算能力来完成以往需要CPU才可以完成的任务。CPU的特点是什么都能干,但不够专,运算能力不高,而显卡则很专,专门运算图形方面的浮点运算,能力比CPU强10倍以上。但显卡的应用范围狭窄,所以NVIDIA为了让它的显卡在电脑中有更高的地位,就搞了这么个CUDA。想用CUDA,必须是NVIDIA的显卡,而且要是GEFORCE 8以后的显卡。平常没什么用,只是在转换视频格式,以及看高清时有点作用。暂时CUDA的作用范围仍然比较狭窄,就看NVIDIA能把它如何发展了。
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员现在可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序于是就可以在支持CUDA™的处理器上以超高性能运行。将来还会支持其它语言,包括FORTRAN以及C++。
目前,支持CUDA的GPU销量已逾1亿,数以千计的软件开发人员正在使用免费的CUDA软件开发工具来解决各种专业以及家用应用程序中的问题。这些应用程序从视频与音频处理和物理效果模拟到石油天然气勘探、产品设计、医学成像以及科学研究,涵盖了各个领域。目前市面上已经部署了超过一亿颗支持CUDA的GPU,数以千计的软件开发人员正在使用免费的CUDA软件工具来为各种应用程序加速。

CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动(表2)。
开发库是基于CUDA技术所提供的应用开发库。目前CUDA的1.1版提供了两个标准的数学运算库——CUFFT(离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员在开发库的基础上可以快速、方便的建立起自己的计算应用。此外,开发人员也可以在CUDA的技术基础上实现出更多的开发库。
运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。基于CUDA开发的程序代码在实际执行中分为两种,一种是运行在CPU上的宿主代码(Host Code),一种是运行在GPU上的设备代码(Device Code)。不同类型的代码由于其运行的物理位置不同,能够访问到的资源不同,因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分,基本上囊括了所有在GPGPU开发中所需要的功能和能够使用到的资源接口,开发人员可以通过运行期环境的编程接口实现各种类型的计算。
由于目前存在着多种GPU版本的NVIDIA显卡,不同版本的GPU之间都有不同的差异,因此驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能的。目前基于CUDA开发的应用必须有NVIDIA CUDA-enable的硬件支持,NVIDIA公司GPU运算事业部总经理Andy Keane在一次活动中表示:一个充满生命力的技术平台应该是开放的,CUDA未来也会向这个方向发展。由于CUDA的体系结构中有硬件抽象层的存在,因此今后也有可能发展成为一个通用的GPGPU标准接口,兼容不同厂商的GPU产品
CUDA的出现,使一直孤军奋战的CPU终于有了工作伙伴,提高运行速度不再是无限压榨CPU的最高速度,在几百个辛勤的“小弟”的帮助下,CPU从抹桌洗碗的孤单打工族,摇身一变成了部门总管,哪里有工作,指挥小弟们一拥而上。有了CUDA,几乎已到极限的运行速度再提高几百倍不是梦,计算机业似乎踏入了一个全新的领域。
但对于这种速度的提升,前途却不是那么坦荡,开发人员现在可以用C语言编写程序,利用GPU来协助CPU处理数据,听起来似乎万事俱备,但其复杂度却不是C语言编写程序可比的,CUDA编程语言几百页的说明要烂熟于心,这已经不是易事,缺乏专业的开发工具,使编程的第一步难上加难,不管是WINDOWS还是LINUX,在安装了对应的驱动,SDK,工具包之后,还要配合别的软件以及修改N多注册表项,一个字节的修改错误导致的出错提示,让初学者们已经搜尽百度。高手们不断的写出模式包,安装教程,说明,却又被软件版本不断淘洗,某个模式包对应某个版本,某种修改对应某个版本的工具包……
用CUDA编写程序时,又被各种数字的乘法搞晕,栅格中的几行几列,乘以几加几,全部要用编程员的大脑计算,检验起来更是头大如斗,从LOCAL到SHARED,各种不同的缓存速度又不同,可以处理的数据也不同……
开发环境的简化,需要大量程序员的努力,但这种大量努力的前提,是GPU技术的需求性的提高。利用GPU提高运算速度是可行的,但必须是大量单调却统一的计算工作,再分配给所有GPU并发执行,所以提速几百倍只限于一部分工作,而且需要很好的统筹安排,这也要耗费CPU的传统能力和程序员的脑细胞。

CUDA是NVIDIA近来力推的东西,简单的说,CUDA可以认为是一种以C语言为基础的平台,主要是利用显卡强大的浮点运算能力来完成以往需要CPU才可以完成的任务。CPU的特点是什么都能干,但不够专,运算能力不高,而显卡则很专,专门运算图形方面的浮点运算,能力比CPU强10倍以上。但显卡的应用范围狭窄,所以NVIDIA为了让它的显卡在电脑中有更高的地位,就搞了这么个CUDA。
想用CUDA,必须是NVIDIA的显卡,而且要是GEFORCE 8以后的显卡。平常没什么用,只是在转换视频格式,以及看高清时有点作用。暂时CUDA的作用范围仍然比较狭窄,就看NVIDIA能把它如何发展了。

CUDA是NVIDIA近来力推的东西,简单的说,CUDA可以认为是一种以C语言为基础的平台,主要是利用显卡强大的浮点运算能力来完成以往需要CPU才可以完成的任务。CPU的特点是什么都能干,但不够专,运算能力不高,而显卡则很专,专门运算图形方面的浮点运算,能力比CPU强10倍以上。但显卡的应用范围狭窄,所以NVIDIA为了让它的显卡在电脑中有更高的地位,就搞了这么个CUDA。想用CUDA,必须是NVIDIA的显卡,而且要是GEFORCE 8以后的显卡。平常没什么用,只是在转换视频格式,以及看高清时有点作用。暂时CUDA的作用范围仍然比较狭窄,就看NVIDIA能把它如何发展了。
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员现在可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序于是就可以在支持CUDA™的处理器上以超高性能运行。将来还会支持其它语言,包括FORTRAN以及C++。
目前,支持CUDA的GPU销量已逾1亿,数以千计的软件开发人员正在使用免费的CUDA软件开发工具来解决各种专业以及家用应用程序中的问题。这些应用程序从视频与音频处理和物理效果模拟到石油天然气勘探、产品设计、医学成像以及科学研究,涵盖了各个领域。目前市面上已经部署了超过一亿颗支持CUDA的GPU,数以千计的软件开发人员正在使用免费的CUDA软件工具来为各种应用程序加速。

  • -!好多垃圾信息。。
    比较关注GPU可以加速图形、数值计算方面的应用。。相信cad,cae,cfd等厂商关注比较多吧。。。现在计算个算例要很久的时间,如果加速明显,前景还是很光明地。。。

CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
CUDA特别适用于中等粒度的并行计算,比较适合的领域包括:有限元,信号处理,神经网络以及人工智能。
开头所说的用于病毒扫描,我觉得更合适的说法是病毒特征码扫描,很适合CUDA的场景(这个其实和GFW差不多,GFW今后可能是CUDA单一的最大用户)
另外,人工智能更是CUDA的大好应用场景(NVidia应该利用CUDA编写国际象棋程序,一台至强,配4张NVidia的加速卡,性能应该可以深蓝叫板)
CUDA平台是透过运用显卡内的Unified Shader Processor进行数学运算,透过这项技术,应用软件可利用显卡强大的浮点处理能力进行运算,相较现时最快的处理器仍有十数倍的优势。CUDA平台支援C语言及在科学研究常用的Fortran语言,透过驱动程式的API接口,达成平行运算,若用户拥有超过两张或以上支援CUDA平台的显卡,驱动程式将透过PCI Express总线自动分配工作至不同GPU上,进一步提升效能。
另外,数据库服务器和搜索引擎,我觉得可以用CUDA的概念进行一下改造,或许有更好的性能。

CUDA(Compute Unified Device Architecture),是显卡厂商NVidia推出的运算平台。
随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化,在计算上已经超越了通用的CPU,如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的。
由于GPU的特点是处理密集型数据和并行数据计算,因此CUDA非常适合需要大规模并行计算的领域,目前CUDA除了可以用C语言开发,也已经提供FORTRAN的应用接口,未来可以预计CUDA会支持C++、Java、Python等各类语言,可广泛的应用在图形动画、科学计算、地质、生物、物理模拟等领域。
CUDA是NVIDIA近来力推的东西,简单的说,CUDA可以认为是一种以C语言为基础的平台,主要是利用显卡强大的浮点运算能力来完成以往需要CPU才可以完成的任务。CPU的特点是什么都能干,但不够专,运算能力不高,而显卡则很专,专门运算图形方面的浮点运算,能力比CPU强10倍以上。但显卡的应用范围狭窄,所以NVIDIA为了让它的显卡在电脑中有更高的地位,就搞了这么个CUDA。
想用CUDA,必须是NVIDIA的显卡,而且要是GEFORCE 8以后的显卡。平常没什么用,只是在转换视频格式,以及看高清时有点作用。暂时CUDA的作用范围仍然比较狭窄,就看NVIDIA能把它如何发展了。

CUDA:Compute Unified Device Architecture
显卡厂商NVidia推出的运算平台。
随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化。在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此N卡厂商推出CUDA,让显卡可以用于图像计算以外的目的。
目前只有G80平台的N卡才能使用CUDA,工具集的核心是一个C语言编译器。G80中拥有128个单独的ALU,因此非常适合并行计算,而且数值计算的速度远远优于CPU。
CUDA的SDK中的编译器和开发平台支持Windows、Linux系统,可以与Visual Studio2003集成在一起。
目前这项技术处在起步阶段,仅支持32位系统,编译器不支持双精度数据等问题要在晚些时候解决。当然还有就是Geforce8系列显卡高昂的价格问题了。
CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动(表2)。
开发库是基于CUDA技术所提供的应用开发库。目前CUDA的1.1版提供了两个标准的数学运算库——CUFFT(离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员在开发库的基础上可以快速、方便的建立起自己的计算应用。此外,开发人员也可以在CUDA的技术基础上实现出更多的开发库。

CUDa 工具包是一种针对支持CUDA功能的GPU(图形处理器)的C语言开发环境CUDA的出现,使一直孤军奋战的CPU终于有了工作伙伴,提高运行速度不再是无限压榨CPU的最高速度,在几百个辛勤的“小弟”的帮助下,CPU从抹桌洗碗的孤单打工族,摇身一变成了部门总管,哪里有工作,指挥小弟们一拥而上。有了CUDA,几乎已到极限的运行速度再提高几百倍不是梦,计算机业似乎踏入了一个全新的领域。
但对于这种速度的提升,前途却不是那么坦荡,开发人员现在可以用C语言编写程序,利用GPU来协助CPU处理数据,听起来似乎万事俱备,但其复杂度却不是C语言编写程序可比的,CUDA编程语言几百页的说明要烂熟于心,这已经不是易事,缺乏专业的开发工具,使编程的第一步难上加难,不管是WINDOWS还是LINUX,在安装了对应的驱动,SDK,工具包之后,还要配合别的软件以及修改N多注册表项,一个字节的修改错误导致的出错提示,让初学者们已经搜尽百度。高手们不断的写出模式包,安装教程,说明,却又被软件版本不断淘洗,某个模式包对应某个版本,某种修改对应某个版本的工具包……
用CUDA编写程序时,又被各种数字的乘法搞晕,栅格中的几行几列,乘以几加几,全部要用编程员的大脑计算,检验起来更是头大如斗,从LOCAL到SHARED,各种不同的缓存速度又不同,可以处理的数据也不同……
开发环境的简化,需要大量程序员的努力,但这种大量努力的前提,是GPU技术的需求性的提高。利用GPU提高运算速度是可行的,但必须是大量单调却统一的计算工作,再分配给所有GPU并发执行,所以提速几百倍只限于一部分工作,而且需要很好的统筹安排,这也要耗费CPU的传统能力和程序员的脑细胞。
然而目前来讲,GPU并不是电脑的“制式武器”,只有NVIDIA的显卡支持此种技术,这使得有些初学者不得不用CPU来模拟GPU的功能,性能方面的数据完全无法参考。打开市场,让NVIDIA显卡成为电脑内必要的组成部分,成了一切进展的前提,由此推断,NVIDIA与两大CPU厂商合作,使其集成在主板上的可能性是很高的,也有可能与笔记本厂商合作,使大部分笔记本带有NVIDIA的显卡,使之有CUDA开发的可能。

NVIDIA和软件厂商Elemental Technologies合作推出基于CUDA架构的BadaBOOM Media Converter视频编码软件,一直以来显卡都是用来进行视频编码的解码操作,而CUDA(Compute Unified Device Architecture)术让显卡走向了通用计算的康庄大道。Elemental Tech的Sam Blackman声称编码一部2小时左右的高清视频,用一颗3G的四核Intel CPU(市价2000以上)需要5小时,而用一块不到1000块的9600GT只需50分钟,速度几乎是CPU的5倍。

CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
CUDA特别适用于中等粒度的并行计算,比较适合的领域包括:有限元,信号处理,神经网络以及人工智能。
开头所说的用于病毒扫描,我觉得更合适的说法是病毒特征码扫描,很适合CUDA的场景(这个其实和GFW差不多,GFW今后可能是CUDA单一的最大用户)
另外,人工智能更是CUDA的大好应用场景(NVidia应该利用CUDA编写国际象棋程序,一台至强,配4张NVidia的加速卡,性能应该可以深蓝叫板)
CUDA平台是透过运用显卡内的Unified Shader Processor进行数学运算,透过这项技术,应用软件可利用显卡强大的浮点处理能力进行运算,相较现时最快的处理器仍有十数倍的优势。CUDA平台支援C语言及在科学研究常用的Fortran语言,透过驱动程式的API接口,达成平行运算,若用户拥有超过两张或以上支援CUDA平台的显卡,驱动程式将透过PCI Express总线自动分配工作至不同GPU上,进一步提升效能。
另外,数据库服务器和搜索引擎,我觉得可以用CUDA的概念进行一下改造,或许有更好的性能。

使 用了CUDA的GPU计算通过标准的C语言将下一代NV GPU的总多计算特性结合到一起。在这之前的GPU是基于“流式着色程序”的,CUDA则使用C语言,通过“线程”来创建应用程序,这类似于CPU上的多 线程程序。相比较于仅能有很少线程同时工作的多核CPU的而言,NV GPU的特性可以让CUDA同时执行数千个线程,这将令我们的应用能处理更多的信息流。

CUDA所提供的最重要的创新在于,它使得 工作在GPU上的线程可以协作解决问题。在线程间通讯实现以后,CUDA将允许应用程序更加高效的执行。由NV GPUs的支持,CUDA有一个直接在GPU上的并行计算缓存,它用于保存频繁使用的信息。在GPU上保存信息可以让计算线程即刻得到共享数据而不是去漫 长的等待off-chip的DRAM上的数据。它能让用户实时的计算出复杂问题的答案。

CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台。
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 开发人员现在可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序于是就可以在支持CUDA™的处理器上以超高性能运行。 将来还会支持其它语言,包括FORTRAN以及C++。
随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化。在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的。
目前只有G80、G92、G94和GT200平台的NVidia显卡才能使用CUDA,工具集的核心是一个C语言编译器。G80中拥有128个单独的ALU,因此非常适合并行计算,而且数值计算的速度远远优于CPU。
CUDA的SDK中的编译器和开发平台支持Windows、Linux系统,可以与Visual Studio2005集成在一起。
Geforce8CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动(表2)。
开发库是基于CUDA技术所提供的应用开发库。目前CUDA的1.1版提供了两个标准的数学运算库——CUFFT(离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员在开发库的基础上可以快速、方便的建立起自己的计算应用。此外,开发人员也可以在CUDA的技术基础上实现出更多的开发库。
运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。基于CUDA开发的程序代码在实际执行中分为两种,一种是运行在CPU上的宿主代码(Host Code),一种是运行在GPU上的设备代码(Device Code)。不同类型的代码由于其运行的物理位置不同,能够访问到的资源不同,因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分,基本上囊括了所有在GPGPU开发中所需要的功能和能够使用到的资源接口,开发人员可以通过运行期环境的编程接口实现各种类型的计算。
由于目前存在着多种GPU版本的NVidia显卡,不同版本的GPU之间都有不同的差异,因此驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能的。目前基于CUDA开发的应用必须有NVIDIA CUDA-enable的硬件支持,NVidia公司GPU运算事业部总经理Andy Keane在一次活动中表示:一个充满生命力的技术平台应该是开放的,CUDA未来也会向这个方向发展。由于CUDA的体系结构中有硬件抽象层的存在,因此今后也有可能发展成为一个通用的GPGPU标准接口,兼容不同厂商的GPU产品
CUDA™ 工具包是一种针对支持CUDA功能的GPU(图形处理器)的C语言开发环境。CUDA开发环境包括:
· nvcc C语言编译器
· 适用于GPU(图形处理器)的CUDA FFT和BLAS库
· 分析器
· 适用于GPU(图形处理器)的gdb调试器(在2008年3月推出alpha版)
· CUDA运行时(CUDA runtime)驱动程序(目前在标准的NVIDIA GPU驱动中也提供)
· CUDA编程手册
CUDA开发者软件开发包(SDK)提供了一些范例(附有源代码),以帮助使用者开始CUDA编程。这些范例包括:
· 并行双调排序
· 矩阵乘法
· 矩阵转置
· 利用计时器进行性能评价
· 并行大数组的前缀和(扫描)
· 图像卷积
· 使用Haar小波的一维DWT
· OpenGL和Direct3D图形互操作示例
· CUDA BLAS和FFT库的使用示例
· CPU-GPU C—和C++—代码集成
· 二项式期权定价模型
· Black-Scholes期权定价模型
· Monte-Carlo期权定价模型
· 并行Mersenne Twister(随机数生成)
· 并行直方图
· 图像去噪
· Sobel边缘检测滤波器
· MathWorks MATLAB®
新的基于1.1版CUDA的SDK 范例现在也已经发布了。
技术功能
· 在GPU(图形处理器)上提供标准C编程语言
· 为在支持CUDA的NVIDIA GPU(图形处理器)上进行并行计算而提供了统一的软硬件解决方案
· CUDA兼容的GPU(图形处理器)包括很多:从低功耗的笔记本上用的GPU到高性能的,多GPU的系统。
· 支持CUDA的GPU(图形处理器)支持并行数据缓存和线程执行管理器
· 标准FFT(快速傅立叶变换)和BLAS(基本线性代数子程序)数值程序库
· 针对计算的专用CUDA驱动
· 经过优化的,从中央处理器(CPU)到支持CUDA的GPU(图形处理器)的直接上传、下载通道
· CUDA驱动可与OpenGL和DirectX图形驱动程序实现互操作
· 支持Linux 32位/64位以及Windows XP 32位/64位 操作系统
· 为了研究以及开发语言的目的,CUDA提供对驱动程序的直接访问,以及汇编语言级的访问
NVIDIA进军高性能计算领域,推出了Tesla&CUDA高性能计算系列解决方案,CUDA技术,一种基于NVIDIA图形处理器(GPU)上全新的并行计算体系架构,让科学家、工程师和其他专业技术人员能够解决以前无法解决的问题,作为一个专用高性能GPU计算解决方案,NVIDIA把超级计算能够带给任何工作站或服务器,以及标准、基于CPU的服务器集群
CUDA是用于GPU计算的开发环境,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。在CUDA的架构中,这些计算不再像过去所谓的GPGPU架构那样必须将计算映射到图形API(OpenGL和Direct 3D)中,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA的GPU编程语言基于标准的C语言,因此任何有C语言基础的用户都很容易地开发CUDA的应用程序。
由于GPU的特点是处理密集型数据和并行数据计算,因此CUDA非常适合需要大规模并行计算的领域。目前CUDA除了可以用C语言开发,也已经提供FORTRAN的应用接口,未来可以预计CUDA会支持C++、Java、Python等各类语言。可广泛的应用在图形动画、科学计算、地质、生物、物理模拟等领域。
2008年NVIDIA推出CUDA SDK2.0版本,大幅提升了CUDA的使用范围。使得CUDA技术愈发成熟
目前,支持CUDA的GPU销量已逾1亿,数以千计的软件开发人员正在使用免费的CUDA软件开发工具来解决各种专业以及家用应用程序中的问题。这些应用程序从视频与音频处理和物理效果模拟到石油天然气勘探、产品设计、医学成像以及科学研究,涵盖了各个领域。 目前市面上已经部署了超过一亿颗支持CUDA的GPU,数以千计的软件开发人员正在使用免费的CUDA软件工具来为各种应用程序加速。
CUDA 的核心有三个重要抽象概念: 线程组层次结构、共享存储器、屏蔽同步( barrier
synchronization),可轻松将其作为C 语言的最小扩展级公开给程序员。
CUDA 软件堆栈由几层组成,一个硬件驱动程序,一个应用程序编程接口(API)
和它的Runtime, 还有二个高级的通用数学库,CUFFT 和CUBLAS。硬件被设计成支持轻
量级的驱动和Runtime 层面,因而提高性能。

CUDA 让你可以一边使用熟悉的编程概念,一边开发可在GPU上运行的软件。

Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员。他在多个国家级的实验室进行大型并行运算的研究,并且是几个新创企业的合伙人。大家可以发邮件到rmfarber@gmail.com与他沟通和交流。

您是否有兴趣在使用高级语言(比如C编程语言)编程时,通过标准多核处理器将性能提升几个数量级?您是否期待拥有跨多个设备的伸缩能力?

很多人(包括我自己)都通过使用NVIDIA的CUDA(Compute Unified Device Architecture,即计算统一设备架构的简称)获得了这种高性能和可伸缩性,以编写廉价的多线程GPU程序。我特别强调“编程”是因为CUDA是为您的工作服务的架构,它不会“强迫”您的工作适应有限的一组性能库。使用CUDA,您可以发挥您的才能,设计软件以便在多线程硬件上获得最佳性能——并从中获得乐趣,因为计算正确的映射是很有意思的,而且软件开发环境十分合理和直观。

本文是这一系列文章的第一节,介绍了CUDA的功能(通过使用代码)和思维过程,帮助您将应用程序映射到多线程硬件(比如GPU)以获得较大的性能提升。当然,并不是所有问题都可以有效映射到多线程硬件,因此我会介绍哪些可以进行有效映射,哪些不能,而且让您对哪些映射可以运行良好有个常识性的了解。

“CUDA编程”和“GPGPU编程”并不相同(尽管CUDA运行在GPU上)。以前,为GPU编写软件意味着使用GPU语言编程。我的一个朋友曾将这一过程描述为将数据从您的肘部拉到眼前。CUDA允许使用熟悉的编程概念开发可以在GPU上运行的软件。通过将软件直接编译到硬件(例如,GPU汇编语言),可避免图形层API的性能开销,这样可以提供更出色的性能。

您可以任选一种CUDA设备。图1和图2分别显示了运行在一个笔记本和一个台式机的离散GPU上的CUDA 多体模拟(N-body simulation)程序。

CUDA真的可以将应用程序性能提高一到两个数量级——或者这只是一种夸张,而非现实呢?

CUDA是一种相当新的技术,但是在一些书中和网络上,已经有很多样例突出介绍了这种技术,在使用当前商用GPU硬件时对性能的极大提升。图表1和表2总结了NVIDIA和Beckman Institute网站上相关内容。CUDA的核心是,让程序员能够使数千线程保持忙碌的工作状态。目前这一代NVIDIA GPU能够有效地支持大量线程,因此它们可以将应用程序性能提高一到两个数量级。这些图形处理器的价位区别很大,几乎所有的人都使用得起。较新的主板将通过提供更大的内存带宽、异步数据传输、原子操作和双精度浮点计算等多项硬件技术改进,扩展CUDA的功能。随着技术的不断进步,CUDA软件环境将不断扩展,最终GPU和“多核”处理器之间的区别也会逐渐消失。作为程序开发人员,我们可以预计,具有成千上万活动线程的应用程序将变得很常见而且CUDA将会运行在多个平台上,包括一般用途的处理器。 应用程序样例
URL
应用程序加速

地震数据库(Seismic Database)
http://www.headwave.com
66x到100x

移动电话天线仿真(Mobile Phone Antenna Simulation)
http://www.acceleware.com
45x

分子动态学(Molecular Dynamics)
http://www.ks.uiuc.edu/Research/vmd
21x 到100x

神经元仿真(Neuron Simulation)
http://www.evolvedmachines.com
100x

MRI 处理(MRI processing)
http://bic-test.beckman.uiuc.edu
245x 到 415x

大气干扰运仿真(Atmospheric Cloud Simulation)
http://www.cs.clemson.edu/~jesteel/clouds.html
50x

表 1: NVIDIA总结,www.nvidia.com/object/IO_43499.html

GPU 性能结果, 2008年3月

GeForce8800GTX w/ CUDA 1.1, Driver 169.09

运算/算法
算法类
加速 vs. Intel QX6700 CPU

微荧光光解法(Fluorescence microphotolysis)
迭代矩阵(Iterative matrix) / 模板(stencil)
12x

对列表计算(Pairlist calculation)
粒子对距离测试(Particle pair distance test)
10x到11x

对列表更新(Pairlist update)
粒子对距离测试(Particle pair distance test)
5x 到15x

分子动态学非健合力运算(

Molecular dynamics nonbonded force calculation)
多体断电力运算(N-body cutoff force calculations)
10x 到20x

断电电子密度量(Cutoff electron density sum)

粒子-网W/断电(Particle-grid w/ cutoff)
15x 到23x

断电潜能总结(Cutoff potential summation)
粒子-网W/断电(Particle-grid w/ cutoff)
12x 到21x

直接库仑总结(Direct Coulomb summation)
粒子-网(Particle-grid w/ cutoff)
44x

表 2: Beckman Institute表格,自 www.ks.uiuc.edu/Research/vmd/publications/siam2008vmdcuda.pdf

在20世纪80年代,我还是Los Alamos National Laboratory的科研人员,当时我有幸使用了拥有多达65,536个平行处理器的Thinking Machines超级计算机。CUDA被证明是天生用于现代大量平行(即高线程)环境的框架。它的性能优势显而易见。我的一段生产代码,现在用CUDA编写并且运行在NVIDIA GPU上,与2.6-Ghz四核Opteron系统相比,具有明显的线形伸缩和几乎两个数量级的速度提升。

启用CUDA的图形处理器作为主计算机内的联合处理器运行。这意味着每个GPU都被认为有其自己的内存和处理元素,它们是与主计算机分开的。要进行有效的工作,数据必须在主计算机的内存空间和CUDA设备之间传输。因此,性能结果必须包括IO时间才更有意义。同事们喜欢将其称为“诚实的数据”,因为它们会更准确地反映将要交付生产的性能应用程序。

我坚持与现有技术相比,一到两个数量级的性能提升是一个巨变,可以在很大程度上改变运算的某些方面。例如,以前可能需要花费一年时间的运算任务现在只要几天就可以完成,几个小时的运算突然变得可交互了,因为使用新技术它们可以在几秒钟内完成,过去不易处理的实时处理任务现在变得极易处理。最后,它为具有正确技能集和能力的顾问和工程师们提供了良好的机会,使他们可以编写高线程(或大量平行)软件。对于您来说,这种计算能力又能给您的职业、应用程序或实时处理需求带来哪些好处呢?

开始不需要任何成本,您只需要从CUDA Zone 主页下载CUDA(查找”获取CUDA”)。然后,按照您的特定的操作系统安装指导操作。您甚至不需要图形处理器,因为你可以直接使用软件模拟器,在你的笔记本或者工作站上运行,开始工作。当然,使用启动CUDA的GPU,可以获得更好的性能。或许你的计算机应该有一个这样的GPU了。在CUDA Zone 主页上查看支持CUDA的GPU链接(支持CUDA的GPU包括共享的片上内存和线程管理)。

如果要购买一个新的图形处理器卡,我建议您依次阅读以下文章,因为我将探讨不同的硬件特性(如内存带宽、注册数量、原子操作等)将如何影响应用程序的性能。这样有助于您为应用程序选择恰当的硬件。另外,CUDA Zone论坛提供了关于CUDA各个方面的大量信息,包括购买哪些硬件。

安装完毕后,CUDA Toolkit将提供一个合理的C语言程序开发工具集,它包括:

· nvcc C编译器;

· GPU 的CUDA FFT和BLAS库

· 性能分析器

· alpha 版本(截至2008年3月)的GPU的gdb调试器

· CUDA运行时驱动程序(现在还可以在标准的NVIDIA GPU驱动程序中得到)

· CUDA编程手册

nvcc C编译器完成了将C代码转换成将运行在GPU或模拟器上的可执行程序的大部分工作。幸好,汇编语言编程不要求达到很高的性能。下面的文章将介绍从其它高级语言,包括C++、FORTRAN和Python使用CUDA的内容。我假设您熟悉C/C++。不需要有平行编程或CUDA经验。这与现有CUDA文档是一致的。

创建和运行CUDA C语言程序与创建和运行其它C编程环境的工作流是一样的。面向Windows和Linux环境的明确构建和运行说明在CUDA文档中。简言之,这一工作流就是:

a. 使用最喜欢的编辑器创建或编辑CUDA程序。注意:CUDA C 语言程序的后缀为.cu。

b. 使用nvcc编译程序创建可执行程序(NVIDIA提供了带有示例的完整makefiles。通常用于CUDA设备时您只需键入make,用于模拟器时只需键入make emu=1)。

c. 运行可执行程序。

表1是一个带您入门的简单CUDA程序。它只是一个简单的程序,调用CUDA API将数据移入和移出CUDA设备。并没有添加新内容,以免在学习如何使用工具构建和运行CUDA程序时发生混淆。在下一篇文章中,我将介绍如何开始使用CUDA设备执行一些工作。

moveArrays.cu

//

// demonstrates CUDA interface to data allocation on device (GPU)

// and data movement between host (CPU) and device.

#include <stdio.h>

#include <assert.h>

#include <cuda.h>

int main(void)

{

float *a_h, *b_h; // pointers to host memory

float *a_d, *b_d; // pointers to device memory

int N = 14;

int i;

// allocate arrays on host

a_h = (float *)malloc(sizeof(float)*N);

b_h = (float *)malloc(sizeof(float)*N);

// allocate arrays on device

cudaMalloc((void **) &a_d, sizeof(float)*N);

cudaMalloc((void **) &b_d, sizeof(float)*N);

// initialize host data

for (i=0; i<N; i++) {

a_h[i] = 10.f+i;

b_h[i] = 0.f;

}

// send data from host to device: a_h to a_d

cudaMemcpy(a_d, a_h, sizeof(float)*N, cudaMemcpyHostToDevice);

// copy data within device: a_d to b_d

cudaMemcpy(b_d, a_d, sizeof(float)*N, cudaMemcpyDeviceToDevice);

// retrieve data from device: b_d to b_h

cudaMemcpy(b_h, b_d, sizeof(float)*N, cudaMemcpyDeviceToHost);

// check result

for (i=0; i<N; i++)

assert(a_h[i] == b_h[i]);

// cleanup

free(a_h); free(b_h);

cudaFree(a_d); cudaFree(b_d);

试下这些开发工具吧。对初学者的一些建议:可以使用printf语句看看在模拟器下运行时(使用make emu=1构建可执行程序)GPU上会发生什么。还可以随意试验调试器的alpha版本。

图 1: 运行在使用了Quadro FX 570M的笔记本上的多体天体模拟程序。

图 2: 运行在使用了GeForce 8800 GTS 512MB的台式机上的多体天体模拟程序。

曾经装了winxp64 + nvidia driver19*.* + VS2008(sp1),感觉很卡,所以一直用cuda2.2.

最近装了win7,发现对190以上版本的驱动兼容性很好,就装了cuda2.3,本来想体验一下VS2010 beta2,

但是后来从微软工作人员处得知MSBuild还存在一些bug,无法正常使用cuda,并且暂时不能给我补丁,无奈

之下换回VS2008,不做傻乎乎吃螃蟹的人了。

在使用cuda2.3的时候,有时候可能会进行win32和x64的切换,我把几个常见问题罗列如下:

1、在VS2008里如何设置文件路径?

答:Tools》options》Projects and Solutions》VC++ Directories,右侧添加

win32 x64

Executable files C:\CUDA\bin C:\CUDA\bin64

Include files C:\CUDA\include C:\CUDA\include

Library files C:\CUDA\lib C:\CUDA\lib64

2、弹出错误fatal error LNK1112: module machine type ‘x64’ conflicts with target machine type ‘X86’

答:这是由于我使用的是64位toolkit,默认编译成64位的obj文件,所以在win32模式下会弹出此错误。

打开project的property pages,在CUDA Build Rules v2.3.0(因为已经勾选了cuda.rules)》

General》Extra Options里面填写–machine 32,意思是生成32位的obj文件。具体参数可参看

nvcc的说明文档。

3、我的win32模式虽然编译通过,但是运行时会出现the application was unable to start correctly(oxc000007b)的错误提示。

答:不知道路径设置在哪里有错误,原因是启动时找到的cudart.dll版本错误,将C:\CUDA\bin中的

cudart.dll拷贝到本工程的文件夹,即可正确运行。暂时猜测是运行了系统环境变量里的(待验证)。

4、错误或警告defaultlib ‘LIBCMT’ conflicts with use of other libs; use /NODEFAULTLIB:library

答:这是由于使用运行库的版本不一致导致的,解决方案也很简单,就是你引用的所有的库都要用同一版本,

例如/MT, 或/MTd等等。在project的property pages中,C/C++》Code Generation》Runtime

library 和 CUDA Build Rules v2.3.0》Hybird CUDA/C++》Runtime Library中的设置要一致。