NVIDIA显卡支持CUDA
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CUDA
CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
关于NVIDIA CUDA技术
NVIDIA CUDA技术是当今世界上唯一针对NVIDIA GPU(图形处理器)的C语言环境,为支持CUDA技术的NVIDIA GPU(图形处理器)带来无穷的图形计算处理性能。凭借NVIDIA CUDA技术,开发人员能够利用NVIDIA 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提供对驱动程序的直接访问,以及汇编语言级的访问。
使用了CUDA的GPU计算通过标准的C语言将下一代NV GPU的总多计算特性结合到一起。在这之前的GPU 是基于“流式着色程序”的,CUDA则使用C语言,通过“线程”来创建应用程序,这类似于CPU上的多线程程序。相比较于仅能有很少线程同时工作的多核CPU的而言,NV GPU的特性可以让CUDA同时执行数千个线程,这将令我们的应用能处理更多的信息流。
CUDA所提供的最重要的创新在于,它使得工作在GPU上的线程可以协作解决问题。在线程间通讯实现以后,CUDA将允许应用程序更加高效的执行。由NV GPUs的支持,CUDA有一个直接在GPU上的并行计算缓存,它用于
保存频繁使用的信息。在GPU上保存信息可以让计算线程即刻得到共享数据而不是去漫长的等待off-chip的DRAM
上的数据。它能让用户实时的计算出复杂问题的答案。
曾几何时,我们购买一块显卡的时候首先需要了解它究竟能提供多少特效,能支持多少游戏。而随着显示芯片蜕变为GPU,显卡首次被赋予了可编程功能。在随后的10年里,GPU以超越CPU的速度高速发展。今天即便是最便宜的显卡,也可以实现一切游戏制作人想要的特性,300元和3000元显卡之间的区别更多是执行这些应用的快慢,而非能否执行。
在DirectX 9的时代,GPU的可编程性迎来了革命性的变化—只要GPU符合DirectX 9 API,那么原则上就能通过HLSL(High Level Shader Language,高级着色语言)或者ASM(汇编语言)实现各种计算操作。此时就有人想到,既然GPU的可编程性如此强大,那能不能用GPU来处理别的应用甚至是代替CPU?在这样想法的驱动及尝试下,GPU历史翻开了崭新的一页—GPGPU。
GPGPU全称是General Purpose GPU,即通用计算图形处理单元。GPGPU着重于利用GPU的可编程性能让GPU 去实现处理3D图形以外的计算应用。在已经公布的众多论文中GPU已经能够实现音频处理、有限元分析、流体模拟等应用。对GPGPU进行深入研究是从2003年开始的,在那年的SIGGRAPH 2003大会上许多业界泰斗级人物发表了关于使用GPU进行各种运算的设想和实验模型。GPU恐怖的浮点运算能力和数据流吞吐量使得人们希望用GPU来加速运算,和CPU相比,进入DirectX 10时代统一VS和PS架构后,GPU要进一步提升浮点性能变得相当简单(不断增加Streaming Processor),而CPU要提升浮点性能则比较困难。如果能让GPU实现科学计算、有限元分析等浮点运算密集的应用,那整个计算工业将会迎来一场深刻的变革。
从GPGPU到CUDA,通用计算的飞跃
光看GPGPU远超CPU的浮点运算能力的确很有诱惑力,但真正应用却难于登天。在过去的5年里,许多基于GPGPU的项目最终流产。究其原因,就在于专为显卡设计的图形API限制太大,要通过这样的API来执行其它应用,不仅算法和程序会变得极端复杂,还将耗费大量的额外运算开销。
在GPU进入DirectX 10时代以后,统一渲染架构在编程灵活性上获得了进一步的提升,而NVIDIA也同时意识到,要破解GPGPU应用的紧箍咒,必须抛弃原有的DirectX或者OpenGL等专为图形设计的API才能在合理的资源下释放GPU通用计算的威力,CUDA(Compute Unified Device Architecture,统一计算设备架构)因此应运而生。
我们可以把CUDA简单地看作是专为NVIDIA GPU设计的C语言开发环境。和以往的GPGPU需要程序员自行开发“迂回”的实现架构不同,CUDA在问世初期就拥有了完整而直接的开发程序。NVIDIA给开发者提供的CUDA套件包括了nvccC语言编译器、适用于GPU的CUDA FFT和BLAS库、CUDA分析器、GDB 调试器以及CUDA运行时(CUDA runtime)驱动程序,除此以外CUDA还拥有详尽的编程指南和大量范例供开发者参考。在CUDA的帮助下,开发者只需要专注于自己所开发的应用,剩下的GPU实现部分将由NVIDIA的编译器自行完成,完全无需像普通GPGPU应用那样针对每一款显卡设计各种复杂的算法。另外,CUDA的运行时驱动程序还被NVIDIA加入在全系列Forceware显卡驱动中,只要目标用户使用的是NVIDIA GeForce 8系列或以上显卡,用CUDA编写的程序就能在上面正常运行。
那究竟CUDA上的编程模型和普通CPU上的C语言编程模型有什么区别呢?其实和CPU相比,DirectX 10时代的GPU有着远超前者的并行性,但却在单线程的处理方面不如CPU。所有通过GPU处理的计算必须采用简单的线程,并通过海量并行来弥补简单线程带来的损失。由于在处理过程中线程就像水管那样一通到底,所以我们把这样的计算称为流计算(Streaming Process)。如果将为CPU设计的编程模型用到GPU上,那你绝对会感受到什么叫痛苦—在GPU 上习以为常的分支预测、乱序执行等功能通通欠奉,而GPU恐怖的并行能力和惊人的带宽你也无法用上。CUDA正是解决GPU和CPU之间的差异构建出来的编程模型,在CUDA上首先被强调的就是海量并行—GeForce 8800 GTX显卡中有128个Streaming Processor以及强大的线程调度能力,所以CUDA允许开发者在G80上同时建立12288条活动线程,如此恐怖的并行能力即便和处理器集群相比也不逞多让。
由于GPU驱动程序构建在操作系统之上,所以在调用GPU进行海量并行计算的时候,还无法离开CPU的帮助。在CUDA中NVIDIA采用了更为高效的架构来让CPU和GPU协同工作。在一个CUDA程序运行的时候,能被GPU 执行的应用被NVIDIA称作内核,整个内核将会由成千上万条简单线程组成,并交由GPU进行处理。无法并行化的应用则由CPU完成。由于CUDA中单个线程极为简单轻量,所以每个线程在创建时的性能开销极小。在GPU运行通用计算的内核中,所有的线程都采用相同的代码,但却有各自的ID用于内存定址和控制决策。为了提供线程之间的协作能力并且降低显存带宽消耗,CUDA还会自动把多个线程合并成一个线程块,处于相同块中的线程能够相互协作共享内存,而不同块中的线程则无法协作。这样的线程块设计还让基于CUDA的程序能够在任意数量Streaming Processor 的GPU中透明伸缩,而无需程序员的干预。根据NVIDIA提供的资料,每个线程块只能在一个流式多处理器(SM)上执行(G80的128个SP被分成了16个SM),而多个线程块则可以同时驻留在一个SM上。
CPU和GPU紧密耦合并行线程阵列