CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员现在可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序于是就可以在支持CUDA™的处理器上以超高性能运行。将来还会支持其它语言,包括FORTRAN以及C++。
简介 计算行业正在从只使用CPU的“中央处理”向CPU与GPU并用的“协同处理”发展。为打造这一全新的计算典范,NVIDIA®(英伟达™)发明了CUDA(Compute Unified Device Architecturem,统一计算设备架构)这一编程模型,是想在应用程序中充分利用CPU和GPU各自的优点。现在,该架构现已应用于GeForce®(精视™)、ION™(翼扬™)、Quadro以及Tesla GPU(图形处理器)上,对 应用程序 开发人员来说,这是一个巨大的市场。
在消费级市场上,几乎每一款重要的消费级视频应用程序都已经使用CUDA加速或很快将会利用CUDA来加速,其中不乏Elemental Technologies公司、MotionDSP公司以及LoiLo公司的产品。
在科研界,CUDA一直受到热捧。例如,CUDA现已能够对AMBER进行加速。AMBER是一款分子动力学模拟程序,全世界在学术界与制药企业中有超过60,000名研究人员使用该程序来加速新药的探索工作。
在金融市场,Numerix以及CompatibL针对一款全新的对手风险应用程序发布了CUDA支持并取得了18倍速度提升。Numerix为近400家金融机构所广泛使用。
CUDA的广泛应用造就了GPU计算专用Tesla GPU的崛起。全球财富五百强企业现在已经安装了700多个GPU集群,这些企业涉及各个领域,例如能源领域的斯伦贝谢与雪佛龙以及银行业的 法国巴黎银行 。
随着 微软 Windows 7与苹果Snow Leopard 操作系统 的问世,GPU计算必将成为主流。在这些全新的操作系统中,GPU将不仅仅是图形处理器,它还将成为所有应用程序均可使用的通用并行处理器。
随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化。在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的。
目前只有G80、G92、G94、G96、GT200、GF100平台(即Geforce 8~Gecorce GTX480)的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功能的GPU(图形处理器)的C语言开发环境。CUDA开发环境包括:
· 适用于GPU(图形处理器)的CUDA FFT和BLAS库
· 适用于GPU(图形处理器)的gdb调试器(在2008年3月推出alpha版)
· CUDA运行时(CUDA runtime)驱动程序(目前在标准的NVIDIA GPU驱动中也提供)
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 层面,因而提高性能。
所支持的OS(operating system)
CUDA目前支持linux和Windows操作系统。进行CUDA开发需要依次安装驱动、toolkit、SDK三个软件。在安装目录/C/src目录下有很多的例程可以进行学习。
英伟摩达(NVIDIA摩机社区): http://www.nvmod.cn
http://cuda.csdn.net/zone_intro.html
http://live.csdn.net/Issue612/livePlay.aspx
http://www.nvidia.cn/object/what_is_cuda_new_cn.html
《大规模并行处理器编程实战》(英伟达官方网站推荐书籍)
《CUDA范例精解》(英伟达官方网站推荐书籍)
● CUDA带给GPU行业无限可能
2007年可以说是GPU发展史上翻天覆地的一年,在这一年微软推出了DirectX 10 API标准,将传统的Pixel Shader(顶点着色器)、Vertex Shader(像素着色器)和Geometry Shader(几何着色器),三种硬件逻辑被整合为一个全功能的统一着色器Shader。
这种API发展思路背后是微软和NVIDIA、AMD对于整个GPU发展历程的思考与转型。它标志着微软开始支持GPU走向更强的可编程性,也标志着Intel等传统CPU制造厂商在未来几年将要面对GPU的强硬挑战,越来越多的高性能计算机和超级计算机已经开始以GPU作为其运算能力提升的重要配件。
2007年同样是NVIDIA值得回忆的一年,NVIDIA公司在这一年正式推出了CUDA整套方案,它是一个完整的通用计算产品。CUDA是Compute Unified Device Architecture(统一计算架构)的简称,是建立在GPU基础之上的通用计算开发平台,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。
简单分析可知,CUDA是一种以C语言为基础的平台,主要是利用显卡强大的浮点运算能力来完成以往需要CPU才可以完成的任务。这种整套方案的提出意味着程序员再也不用去钻研繁杂的底层汇编程序,而是在C语言的基础上稍加学习就能掌握CUDA并通过它来调用GPU强大的浮点运算能力。
这一版本的CUDA大幅度降低了编程难度,同时提升了GPU的编程和执行效率。CUDA 4.0主要的功能能够在Fermi架构的最新GPU上被发挥出来,同时它可以让G80、G92、GT200架构的GPU也拥有编程方式上的飞跃。
● GPU统一虚拟寻址
在2011年2月28日,NVIDIA发布了最新版本的CUDA工具包——CUDA 4.0。借助该工具包,开发人员能够开发出在GPU上运行的并行应用程序。本次NVIDIA历经两年时间发布了CUDA 4.0版本,这一版本为我们带来了3个核心的编程与执行方式提升,它们分别是:
1、统一的虚拟寻址;
2、更直接的GPU间通信;
3、增强型C++模板库。
这3个关键性提升让更多开发人员能够利用GPU计算,它们也成为CUDA 4.0的核心提升之处。接下来我们通过NVIDIA官方公布的资料来简单分析CUDA 4.0的不同之处。
首先提出的是“GPU统一虚拟寻址”概念,我们第一次见到这一概念在Fermi架构发布的报道中,Fermi架构带领GPU全面走向高性能计算的重要表现就在于存储体系的结构完善和GPU统一的虚拟寻址,结构部分中关村在线显卡频道之前进行了大量分析,细心的读者肯定收藏了我们的技术分析类文章。
Fermi的发布彻底统一了GPU寻址空间,将不同的寻址简化为一种指令,这在以前的的GPU中是不敢想象的,内存地址取决于存储位置:最低位是本地,然后是共享,剩下的是全局。这种统一寻址空间也是支持C++的必需前提。
本次CUDA 4.0版本的发布可以让多个GPU以及CPU统一调用GPU显存以及CPU内存,并将处理器(CPU+GPU)和存储器(内存+显存)视为统一整体。在最大显存为6GB的Tesla产品中,多CPU和多GPU融合之后可以为整个系统带来大容量存储设备并且进行统一寻址。
GPU通信和C++模板库
● GPU通信和C++模板库
多GPU通信在以前的CUDA版本中代价很大,只有专业的并行编程环境才能驱动多款GPU在同一系统内执行一个任务,而目前桌面级应用中,如果用户的多块显卡同时存在于系统中,一个CUDA加速程序往往只能调用其中一个GPU核心。
虽然我们看到GPU在图形操作时可以有SLI速力或者CF交火能力,也有DirectX 提出的多线程渲染技术,但是高并行度的GPU通用计算领域在PC桌面级应用中反倒不能实现多款GPU联合加速。
旧版的GPU Direct 1.0主要用于应用程序在网络间通信,新版的GPU Direct 2.0则转入节点内通信,支持P2P内存访问、传输和同步,代码更少,编程效率更高。在此之前,同一节点内的不同GPU互相访问,需要绕道系统内存并进行两次拷贝。就不用理会系统内存了,不同GPU可以直接进行传输,只需要一个统一的存储体系协议NVIDIA就搞定了整个问题。
说到GPU支持C++编程大家一定不会陌生,在Fermi架构发布之时,C++模板库模板库就已经被NVIDIA不断升级。Fermi是首款支持第二代PTX指令的GPU架构,我们知道PTX 2.0使得GPU具备更强的可编程性、更精确和提供更高的性能。
通过上图可知,Thrust C++模板化算法与数据结构提供了强大的开源C++并行算法和数据结构。类似C++ STL标准模板库;可在编译时自动选择最快的代码路径,在多核心CPU与GPU之间分配工作。
C/C++语言中所有变量和函数都是通过指针才能确定对象,这样存在编译时分离的寻址空间无法确定指针的位置而导致无法支持C/C++语言。PTX 2.0最为突出的地方在于它提供的统一寻址空间的意义,将GPU当成“共享地址空间”的并行计算机。大量的算法是基于共享地址空间平台的,这样能够显著推动GPU并行计算的发展。
CUDA 4.0引领行业如何发展
● CUDA 4.0引领行业如何发展
2011年2月28日,NVIDIA官方发布了CUDA 4.0以及全新计算开发包的各项特性,而3月5日NVIDIA正式发布了GPU通用计算开发包的CUDA 4.0 RC候选版,并提供给开发人员下载使用。
从官方公布的资料看来,NVIDIA的确是早有打算并雄心勃勃进入并行计算市场,目前NVIDIA拥有了从Tegra到Tesla的整套芯片产品线。而这条产品线从节能高效到高性能计算全面涵盖,这的确是一家处于产业链上游的“超级”计算芯片公司。
CUDA从发布开始,到目前已经到了4.0版,从NVIDIA提出CUDA这个概念,已经有将近四年的时间,在最近一年时间CUDA发展迅速,主要是Fermi架构推出之后GPU可编程性急剧提升,GPU和CPU的差距已经越来越近,两者关系也越来越紧密。
上图描述了NVIDIA CUDA发布以来,从1.0版本官方大力宣传和爱好者尝试,到2.0版专用领域开始应用CUDA进行编程开发,3.0版本已经引来整个行业的关注,大量软件开始基于CUDA进行基于GPU的加速开发,到今天推出4.0版本继续降低开发难度提升开发效率。
除了上述叙述之外,我们通过资料得到CUDA 4.0架构版本还包含大量其它特性与功能,其中包括:
1、MPI与CUDA应用程序相结合——当应用程序发出MPI收发调用指令时,例如OpenMPI等改编的MPI软件可通过Infiniband与显卡显存自动收发数据。
2、GPU多线程共享——多个CPU主线程能够在一颗GPU上共享运行环境,从而使多线程应用程序共享一颗GPU变得更加轻松。
3、单CPU线程共享多GPU——一个CPU主线程可以访问系统内的所有GPU。 开发人员能够轻而易举地协调多颗GPU上的工作负荷,满足应用程序中“halo”交换等任务的需要。
4、全新的NPP图像与计算机视觉库——其中大量图像变换操作让开发人员能够快速开发出成像以及计算机视觉应用程序。
5、全新、改良的功能
Visual Profiler中的自动性能分析功能
Cuda-gdb中的新特性以及新增了对MacOS的支持
新增了对C++特性的支持,这些特性包括新建/删除以及虚拟等功能
全新的GPU二进制反汇编程序
目前CUDA能够有效利用GPU强劲的处理能力和巨大的存储器带宽进行图形渲染以外的计算,广泛应用于图像处理、视频传播、信号处理、人工智能、模式识别、金融分析、数值计算、石油勘探、天文计算、流体力学、生物计算、分子动力学计算、数据库管理、编码加密等领域,并在这些领域中对CPU获得了一到两个数量级的加速,取得了令人瞩目的成绩。
CUDA基本介绍
http://wenku.baidu.com/view/168a5250f01dc281e53af050.html
程序设计方法学综述
程序设计方法学是计算机科学的一个分支学科,主要讨论程序的性质以及程序设计的理论和方法的学科,起源于20世纪70年代初期软件危机的出现。发展极为迅速,目前已渐趋成熟。
一、程序设计方法学的发展过程与历史现状。
程序设计方法学的发展过程与软件的发展过程以及语言的发展过程都存在密切的关系。
一般情况下,软件的发展分为三个阶段:第一阶段,开创阶段。在1955——1965年,计算机软件刚刚起步,高级语言的作用还没有被接受,机器语言和汇编语言仍是程序员的主流编程语言。在这个阶段,程序设计完全是一些专家才能完成的任务,他们能使庞大的机器按照预想执行,程序设计被看作是一门艺术,还没有上升到方法学的高度。第二阶段,稳定阶段。1965——1985年,像科学计算语言FORTRAN、商务计算语言COBOL这样的高级语言开始被人们所接受,软件也不再是随硬件附带的赠品,逐渐成为一个独立的商品,具有其自身的价值。这个时期软件设计方法的主流是结构化分析和设计,以结构化分析、结构化评审、结构化设计以了结构化测试为特征。随着软件应用价值的挖掘,其规模和复杂性不断增加,软件编制的工作量加大,常常需要几百到几千人年。按照原有的手工方式研制软件周期长,可靠性差、维护困难,软件项目失败的案例屡见不鲜,具体表现为软件开发成本和进度的估计常常很不准确;用户对“已完成的”软件系统不满意的现象经常发生;软件常常是不可维护的;软件常常是不可管理的;软件在计算机系统总成本中所占的比例逐年上升;软件开发生产率提高的速度远远跟不上计算机应用迅速及深入普及的速度。这个现象就是人们通常所说的“软件危机”。软件危机的出现引起人们对程序设计方法学的重视。在这个时期,结构化程序设计的理论和方法成为这个时期软件开发的主流。在1969年程序设计方法学作为一门学科诞生。在这个时期的程序设计方法学就是指结构化程序理论、模块化与逐步求精,以及有关结构化程序正确性证明技术、形式推导技术和变换技术。第三阶段,发展阶段。1985年至今,软件作用和价值牢固地树立起来了。软件的发展速度已超过硬件产业,各种软件理论、技术、方法层出不穷,如面向对象的程序设计方法和理论、类型系统理论、软件复用、设计模式理论、统一建模理论等。可以说在20世纪90年代以后,面向对象程序设计方法学成为程序设计的主流。围绕着面向对象理论产生出了各种不同的程序设计方法、概念、理论和技术。但都没能达到在程序设计方法学的高度将它们统一起来,这就是目前程序设计方法学的发展现状。
程序设计方法学的发展也是与程序设计语言的发展历程密不可分的。如FORTRAN语言的产生使得人们从机器语言和汇编语言走向高级语言,开始了结构化程序设计方法的历程,而PASCAL语言和C语言的成熟标志着结构议成熟。LISP语言的产生标志人们开始函数式程序设计方法的历程。PROLOG语言的产生标志着逻辑式程序设计方法的产生。Simula的产生开始了面向对象程序设计方法学的研究,而C++,JAVA的应用标志着面向对象程序设计方法的成熟。
综上所述,程序设计方法学的主体应用大致经历了:手工作坊式和程序设计→结构化程序设计方法→模块化程序设计方法→面向对象程序设计方法,此外,还有逻辑型程序设计方法、函数型程序设计方法、并行程序设计方法等。