标题：Nvidia CUDA
简介
计算行业正在从只使用CPU的“中央处理”向CPU与GPU并用的“协同处理”发展。为打造这一全新的计算典范，NVIDIA®（英伟达™）发明了CUDA并行计算架构，该架构现已应用于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）。不同类型的代码由于其运行的物理位置不同，能够访问到的资源不同，因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分，基本上囊括了所有在GPU开发中所需要的功能和能够使用到的资源接口，开发人员可以通过运行期环境的编程接口实现各种类型的计算。　由于目前存在着多种GPU版本的Nvidia显卡，不同版本的GPU之间都有不同的差异，因此驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层，提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能的。目前基于CUDA开发的应用必须有NVIDIA CUDA-enable的硬件支持，NVidia公司GPU运算事业部总经理Andy Keane在一次活动中表示：一个充满生命力的技术平台应该是开放的，CUDA未来也会向这个方向发展。由于CUDA的体系结构中有硬件抽象层的存在，因此今后也有可能发展成为一个通用的GPU标准接口，兼容不同厂商的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 层面，因而提高性能。　所支持的OS(operating system)　CUDA目前支持linux和Windows操作系统。进行CUDA开发需要依次安装驱动、toolkit、SDK三个软件。在安装目录/C/src目录下有很多的例程可以进行学习。