注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

My Unix World

不要迷恋Unix,Unix只是计算世界很小的一部分!

 
 
 

日志

 
 

【Copy】CUDA简介  

2008-12-11 20:44:35|  分类: C-CPU |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
CUDA简介
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开发的程序代码在实际执行中分为两种,一种是运行在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提供对驱动程序的直接访问,以及汇编语言级的访问

==============================================================

CUDA快速入门之sdk总结篇

CUDA(Compute Unified Device Architecture)结构:
?        硬件驱动
?        应用编程接口(API
?        运行时环境
?        两个数学函数库CUFFT、CUBLAS
?        如下图1所示:
?         

编程模型:
?        一个SIMD程序首先被分离成可以多线程执行的函数。
?        这个函数再被编译成一个可以称为kernel的指令集。
?        Kernel指令集被下载到GPU。
?        (GPU可以看作CPU的协处理器,它是专业用来计算的设备。CPU和GPU都有属于自己的DRAM。CPU的称作host memory,GPU的称作device memory。)

?        一个Kernel指令集对应一个grid(格栅)。
?        一个grid包含多个block块。
?        每个block块包含多个thread线程。
?        Block之间不能进行同步与通信。
?        每个block包含的线程数是有限制的。
?        如下图2所示:
?         
一个block块大小可以用一个二维或三维索引来表示,如(Dx,Dy)。表示这个块有Dx行乘以Dy列个线程。所以线程索引(x,y)表示thread的唯一ID:threadID = x+y×Dx。也就是说,block块内,线程是先行后列从0开始计数的。

同理,一个grid的大小也可以用一个二维或三维索引来表示,如(Dx,Dy)。表示这个grid有Dx行乘以Dy列个block块。所以block索引 (x,y)可以唯一标记block块:blockID = x+y×Dx。也就是说,grid内block块是先行后列从0开始计数的。


内存模型
?        thread拥有寄存器(registers)和local memory。
?        block块拥有shared memory。
?        grid拥有global memory、constant memory和texture memory。
?        其中,只有grid的constant memory和texture memory是只读的,其它均是可读可写的。主机(CPU)或同一应用程序可以通过kernel调用来持续地访问和grid有关的三种memory来完成对它的读写操作。
?        GPU设备上执行的线程只能访问device DRAM或是以上的芯片memory。
?        如下图3所示:
?         


硬件实现:
一个GPU芯片拥有N个multiprocessors组,一个multiprocessor包含M个processors。
?        每个multiprocessors组拥有共享的芯片内存,但是组内的M个processor在同一时刻只能执行一条相同的指令,但是它们操作的数据却不一样。
?        每个processor拥有一个属于自己的32位register。
?        这M个processor共享一块组内内存或cache缓冲器,以此来实现并行数据共享。
?        这M个processor共享一块组内只读constant cache缓冲器。
?        这M个processor共享一块组内只读texture cache缓冲器。
?        Local memory、global memory作为设备内存可读写区域不被缓冲。
?        如下图4所示:
?         

?        一个由线程块(thread blocks)组成的grid通过一定的块分配策略被N个multiprocessors执行。
?        每个Multiprocessor批处理式的一个接一个运行grid中的blocks。
?        每个block只能被一个multiprocessor处理。所以芯片内的共享内存空间可以提供很快的数据访问。
?        每次批处理一个multiprocessor可以处理多少个blocks取决于kernel中块内的每个thread需求多少个registers;每个 block需要多少shared memory。因为multiprocessor中的shared memory和register分配给批处理块内的每个线程。

?        线程块在一个批处理中被一个多处理器执行,叫做active。
?        每一个正在被执行的块被分解成SIMD线程流,叫做wraps。
?        每一个这样的wraps包含同样数目的thread线程,叫做wrap size。在SIMD模式下通过multiprocessor执行。
?        线程调度程序周期性的从一个wrap切换到另一个wrap,以达到multiprocessor计算资源的使用的最大化。
?        Halp-wrap是一个wrap的前一半或后一半。
?        块被以同样的方式分解成wraps,wrap中包含连续的thread,threadID从第一个wrap包含线程0开始以次递增。


参考资料:
1.http://cuda.csdn.net/zone_intro.html
  评论这张
 
阅读(357)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017