[GPU计算]CUDA基本介绍.ppt_第1页
[GPU计算]CUDA基本介绍.ppt_第2页
[GPU计算]CUDA基本介绍.ppt_第3页
[GPU计算]CUDA基本介绍.ppt_第4页
[GPU计算]CUDA基本介绍.ppt_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CUDA基本介绍,基于Nvidia GPU的通用计算开发 张舒,电子科技大学 电子工程学院 06级硕士研究生 信号探测与获取技术专业 研究方向:合成孔径雷达成像与雷达目标像识别 信号处理与模式识别的算法与硬件实现研究,GPU的优势,强大的处理能力 GPU接近1Tflops/s 高带宽 140GB/s 低成本 Gflop/$和Gflops/w高于CPU 当前世界超级计算机五百强的入门门槛为12Tflops/s 一个三节点,每节点4GPU的集群,总处理能力就超过12Tflops/s,如果使用GTX280只需10万元左右,使用专用的Tesla也只需20万左右,GPU /CPU计算能力比较,GPU/C

2、PU存储器带宽比较,GPU/CPU架构比较,延迟与吞吐量,CPU: 通过大的缓存保证线程访问内存的低延迟,但内存带宽小,执行单元太少,数据吞吐量小 需要硬件机制保证缓存命中率和数据一致性 GPU: 高显存带宽和很强的处理能力提供了很大的数据吞吐量 缓存不检查数据一致性 直接访问显存延时可达数百乃至上千时钟周期,单核CPU已经走到了尽头,频率提高遇到了瓶颈 从p4时代至今主流处理器频率一直在2GHz-3GHz左右 架构上已无潜力可挖。超线程 多流水线 复杂的分支预测 大缓存等技术已经将性能发挥到了极致,但是通用计算中的指令级并行仍然偏低 上述技术占用了芯片上的绝大多数晶体管和面积,目的却只是让极

3、少数的执行单元能够满负荷工作,GPU能够更好的利用摩尔定律提供的晶体管,图形渲染过程高度并行,因此硬件也是高度并行的 少量的控制单元,大量的执行单元 显存被固化在了PCB上,拥有更好的EMI性能,因此运行频率高于内存 通过更大的位宽实现了高带宽,当前的单核并行计算产品,IBM Cell 应用主要见于PS3 SUN Niarraga NPU NV/ATI GPU 大规模应用 GPU最为常见,受市场牵引发展最快,性价比最高,架构比较,CPU GPU FPGA实现比较,当前的GPU开发环境,Cg:优秀的图形学开发环境,但不适合GPU通用计算开发 ATI stream:硬件上已经有了基础,但只有低层次

4、汇编能够使用所有资源。高层次抽象Brook本质上是基于上一代GPU的,缺乏良好的编程模型 OpenCL:联合制定的标准,抽象层次较低,对硬件直接操作更多,代码需要根据不同硬件优化 CUDA:目前最佳选择,未来的发展趋势,GPU通用计算进一步发展:更高版本的CUDA, OpenCL 新产品涌现:Nvidia和AMD的下一代产品,Intel的LarraBee CPU+GPU产品:减少了CPU-GPU通信成本,但存储器带宽和功耗面积等可能将制约集成度。在较低端的应用中将有用武之地。,CUDA的硬件架构适合通用计算,G8x系G9x系GT200系列 标量机架构提高了处理效率,更加适合通用计算 增加了sh

5、ared memory和同步机制,实现线程间通信 以通用的处理器矩阵为主,辅以专用图形单元,GTX280性能,933 Gflops(MAD)单精度 116 Gflops双精度(MAD ) 512bit位宽ddr3显存,提供了140GB/s的带宽 1G的显存,GT200框图,TPC,3 SM Instruction and constant cache Texture Load/store,SM,ROP,ROP,对DRAM进行访问 TEXTURE机制 对global的atomic操作,微架构比较,执行流水线,工作在通用计算模式下的GT200,SM架构,DUAL-Issue 并发,每二周期可以发射

6、 一次指令 FPU和SFU指令延迟 是四周期,某些情况下可以让FPU和SFU并发执行,实现超标量 理论处理能力峰值没有计算dual-issue 双精度浮点计算不能dual-issue,CUDA架构GPU硬件特点,硬件资源模块化,根据市场定位裁减 高度并行 存在TPC SM 两层 每个SM又有8SP SM内存在高速的shared memory和同步机制 原子操作有利于实现通用计算中的数据顺序一致性 shared memory Texture cache constant cache等高速片内存储器有助于提高数据访问速度,节省带宽,如何选购硬件,目前(2008. 12)只有CUDA能够完全发挥新一

7、代GPU的全部计算能力。Nvidia的G80以上的GPU能够支持CUDA。 GT200系列不仅性能更强,而且具有很多实用的新特性 Tesla专用流处理器拥有更大的显存和更高的核心频率,通过降低显存频率,屏蔽不需要的图形单元和改善散热获得了更好的稳定性,适合服务器或者集群使用,适合的应用,GPU只有在计算高度数据并行任务时才能发挥作用。在这类任务中,需要处理大量的数据,数据的储存形式类似于规则的网格,而对这写数据的进行的处理则基本相同。这类数据并行问题的经典例子有:图像处理,物理模型模拟(如计算流体力学),工程和金融模拟与分析,搜索,排序。 在很多应用中取得了1-2个数量级的加速,不适合的应用,

8、需要复杂数据结构的计算如树,相关矩阵,链表,空间细分结构等,则不适用于使用GPU进行计算。 串行和事务性处理较多的程序 并行规模很小的应用,如只有数个并行线程 需要ms量级实时性的程序 需要重新设计算法和数据结构或者打包处理,CUDA 执行模型,重点是将CPU做为终端(Host),而GPU做为服务器(Server)或协处理器(Coprocessor),或者设备(Device),从而让GPU来运行一些能够被高度线程化的程序。 CUDA的基本思想是尽量得开发线程级并行(Thread Level Parallel),这些线程能够在硬件中被动态的调度和执行。,CUDA执行模型,调用核程序时CPU调用A

9、PI将显卡端程序的二进 制代码传到GPU grid运行在SPA上 block运行在SM上 thread运行在SP上,grid block thread,Kernel不是一个完整的程序,而只是其中的一个关键并行计算步 Kernel以一个网格(Grid)的形式执行,每个网格由若干个线程块(block)组成,每一个线程块又由最多512个线程(thread)组成。,grid block thread,一个grid最多可以有65535 * 65535个block 一个block总共最多可以有512个thread,在三个维度上的最大值分别为512, 512和64,grid block thread,gri

10、d之间通过global memory交换数据 block之间不能相互通信,只能通过global memory共享数据,不要让多个block写同一区段内容(不保证数据一致性和顺序一致性) 同一block内的thread可以通过shared memory和同步实现通信 block间粗粒度并行,block内thread细粒度并行,warp,Warp是硬件特性带来的概念,在CUDA C语言中是透明的(除vote函数),但应用中不能忽略 一个warp中有32个线程,这是因为SM中有8个SP,执行一条指令的延迟是4个周期,使用了流水线技术 一个half warp中有16个线程,这是因为执行单元的频率是其他

11、单元的两倍,每两个周期才进行一次数据传输,SIMT编程模型,SIMT是对SIMD(Single Instruction, Multiple Data,单指令多数据)的一种变形。 两者的区别在于:SIMD的向量宽度是显式的,固定的,数据必须打包成向量才能进行处理;而SIMT中,执行宽度则完全由硬件自动处理了。 (每个block中的thread数量不一定是32) 而SIMT中的warp中的每个线程的寄存器都是私有的,它们只能通过shared memory来进行通信。,分支性能,与现代的微处理器不同,Nvidia的SM没有预测执行机制-没有分支预测单元(Branch Predicator)。 在需要

12、分支时,只有当warp中所有的线程都计算出各自的分支的地址,并且完成取指以后,warp才能继续往下执行。 如果一个warp内需要执行N个分支,那么SM就需要把每一个分支的指令发射到每一个SP上,再由SP根据线程的逻辑决定需不需要执行。这是一个串行过程,此时SIMT完成分支的时间是多个分支时间之和。,存储器模型,Register Local shared Global Constant Texture Host memory Pinned host memory,寄存器与local memory,对每个线程来说,寄存器都是线程私有的-这与CPU中一样。如果寄存器被消耗完,数据将被存储在本地存储器

13、(local memory)。Local memory对每个线程也是私有的,但是local memory中的数据是被保存在显存中,而不是片内的寄存器或者缓存中,速度很慢。线程的输入和中间输出变量将被保存在寄存器或者本地存储器中。,Shared memory,用于线程间通信的共享存储器。共享存储器是一块可以被同一block中的所有thread访问的可读写存储器。 访问共享存储器几乎和访问寄存器一样快,是实现线程间通信的延迟最小的方法。 共享存储器可以实现许多不同的功能,如用于保存共用的计数器(例如计算循环次数)或者block的公用结果(例如计算512个数的平均值,并用于以后的计算)。,const

14、ant memory, texture memory,利用GPU用于图形计算的专用单元发展而来的高速只读缓存 速度与命中率有关,不命中时将进行对显存的访问 常数存储器空间较小(只有64k),支持随机访问。从host端只写,从device端只读 纹理存储器尺寸则大得多,并且支持二维寻址。(一个数据的“上下左右”的数据都能被读入缓存)适合实现图像处理算法和查找表,全局存储器,使用的是普通的显存,无缓存,可读写,速度慢 整个网格中的任意线程都能读写全局存储器的任意位置,并且既可以从CPU访问,也可以从CPU访问。,各种存储器的延迟,register: 1 周期 shared memory: 1 周期

15、( 无bank conflict ) - 16 周期( 发生16路 bank conflict) texture memory: 1 ( 命中) - 数百周期(不命中) constant memory: 1 ( 命中) - 数百周期( 不命中) global local memory: 数百周期,各存储器大小,每个SM中有64K(GT200)或者32K(G8x, G9x)寄存器,寄存器的最小单位是32bit的register file 每个SM中有16K shared memory 一共可以声明64K的constant memory,但每个SM的cache序列只有8K 可以声明很大的textu

16、re memory,但是实际上的texture cache序列为每SM 6-8K,使用存储器时可能出现的问题,致命问题:无法产生正确结果 多个block访问global同一块,以及block内thread间线程通信时的数据一致性问题 Texture的工作模式设置错误 效率问题:大大增加访存延迟 Shared bank conflict问题 Global 合并访问问题,Bank conflict,Shared memory被分为了16个bank,单位是32-bit,相邻数据在不同bank中,对16余数相同的数据在同一bank Half warp中的16个线程访问shared memory时最好一

17、一对应,如果多个thread同时访问属于同一bank的数据将发生bank conflict 16个线程读同一数据时,会发生一次广播,只用一个cycle,没有bank conflict,合并访问,访问显存时要遵守严格的合并访问规则 将half warp访问global的起始位置严格的对齐到16的整数倍 在G8x, G9x硬件上thread访问显存的位置必须逐一递增 GT200有了很大的改进,对齐和次序比较灵活 好的合并访问可以将存储器访问次数减少十几倍,CUDA API,CUDA C语言,由Nvidia的CUDA编译器(nvcc)编译 CUDA C不是C语言,而是对C语言进行扩展形成的变种。,C

18、UDA对C的扩展:函数限定符,对函数有了限定符,用来规定函数是在host还是在device上执行,以及这个函数是从host调用还是从device调用。这些限定符是:_device_,_host_和_global_。,CUDA对C的扩展:函数限定符,_device_函数在device端执行,并且也只能从device端调用,即作为device端的子函数来使用 _global_函数即kernel函数,它在设备上执行,但是要从host端调用 _host_函数在host端执行,也只能从host端调用,与一般的C函数相同,CUDA对C的扩展:变量限定符,对变量类型的限定符,用来规定变量被存储在哪一种存储器

19、上。 传统的在CPU上运行的程序中,编译器就能自动决定将变量存储在CPU的寄存器还是在计算机的内存中。 而在CUDA中,不仅要使用host端的内存,而且也要使用显卡上的显存和GPU上的几种寄存器和缓存。在CUDA编程模型中,一共抽象出来了多达8种不同的存储器!,CUDA对C的扩展:变量限定符,_device_ _device_限定符声明的变量存在于device端,其他的变量限定符声明的变量虽然存在于不同的存储器里,但总体来说也都在device端。所以_device_限定符可以与其他的限定符联用。当单独使用_device_限定符修饰变量时,这个变量: 存在于global memory中; 变量生

20、命周期与整个程序一样长; 可以被grid中所有的线程都可以访问,也可以从host端通过运行时库中的函数访问。,CUDA对C的扩展:变量限定符,_constant_ _constant_限定符,可以与_device_联用,即_device_ _constant_,此时等同于单独使用_constant_。使用_constant_限定符修饰的变量: 存在于constant memory中,访问时速度一般比使用global memory略快; 变量生命周期与整个程序一样长; 可以被grid中所有的线程读,从host端通过运行时库中的函数写。,CUDA对C的扩展:变量限定符,_shared_ _shar

21、ed_限定符,可以与_device_联用,即_device_ _shared_,此时等同于单独使用_shared_。使用_shared_限定符修饰的变量: 存在于block中的shared memory中; 变量生命周期与block相同; 只有同一block内的thread才能访问。,CUDA对C的扩展:kernel执行参数,运算符,用来传递一些kernel执行参数 Grid的大小和维度 Block的大小和维度 外部声明的shared memory大小 stream编号,CUDA对C的扩展:内建变量,Dim3 ThreadIdx(三维) Dim3 ThreadDim(三维) Dim3 Bloc

22、kIdx(二维) Dim3 BlockDim(三维),执行参数与内建变量的作用,各个thread和block之间的唯一不同就是threadID和BlockID,通过内建变量控制各个线程处理的指令和数据 CPU运行核函数时的执行参数确定GPU在SPA上分配多少个block,在SM上分配多少个thread,CUDA API,CUDA API需要CUDA driver API才能运行,新版本的Nvidia驱动已经包含了CUDA driver API CUDA runtime API是CUDA API的可选组件,它是一种动态编译器(JIT),能够直接访问实际中的底层硬件架构。,CUDA API功能,设

23、备管理(Device management) 上下文管理(Context management) 存储器管理(Memory management) 代码块管理(Code Module management) 执行控制(Excution Control) 纹理索引管理(Texture Reference management) 与OpenGL和Direct3D的互操作(Interoperity with OpenGL and Direct3D),NVCC 编译器,生成三种不同的输出:PTX,CUDA二进制序列和标准C,NVCC 编译器 PTX,PTX(Parallel Thread eXecut

24、ion)作用类似于汇编,是为动态编译器(包含在标准的Nvidia 驱动中)设计的输入指令序列。这样,不同的显卡使用不同的机器语言,而动态编译器却可以运行相同的PTX。这样做使PTX成为了一个稳定的接口,带来了很多好处:后向兼容性,更长的寿命,更好的可扩展性和更高的性能,但在一定程度上也限制了工程上的自由发挥。这种技术保证了兼容型,但也使新一代的产品必须拥有上代产品的所有能力,这样才能让今天的PTX代码在未来的系统上仍然可以运行。,NVCC 编译器 CUBIN,虽然PTX和JIT编译器提供了很高的性能,但也不是在所有的场合都适用。某些独立软件开发商倾向于牺牲性能,以获得更好的可确定性和可验证性。

25、JIT编译器的输出随着目标硬件和一些其他因素会发生变化。对于需要能够确定的代码的独立软件开发商(比如很多财经软件开发商),它们可以将代码直接编译成CUDA二进制代码,这样就能避免JIT过程的不确定性。直接编译得到的CUDA二进制代码是与特定的硬件和驱动相关的。,NVCC 编译器 C,Nvcc的输出还包括标准C。由nvcc生成的C代码将被重定向到其他编译器进行编译,比如ICC,GCC或者其他合适的高性能编译器。CUDA中明确的表示了程序中的并行度没不仅在用于编写运行在Nvidia GPU上的代码时非常有效,而且为多核CPU生成高性能代码。在某些应用中,CUDA生成的代码比标准的x86编译器生成的

26、代码的性能提高了4倍。,CUDA API 库函数,CUFFT GPU进行傅立叶变换的函数库,提供了与广泛使用的FFTW库相似的接口。 CUBLAS(CUDA Basic Linear Algorithm Subprogrammes)库是一个基本的矩阵与向量的运算库,提供了与BLAS相似的接口,可以用于简单的矩阵计算,也可以作为基础构建更加复杂的函数包,如LAPACK等。 CUDPP(CUDA Data parallel primitives) 库提供了很多基本的常用并行操作函数,如排序、搜索等,可以作为基本组件快速的搭建出并行计算程序。,如何编写CUDA程序,硬件实现不完全透明,需要掌握硬件实现的原理 并行度高,适合CPU的小规模并行算法不一定适用,需要重新设计算法或者参考在集群上使用的并行算法,如何编写CUDA程序?,确定适合GPU的算法,找出算法中的并行部分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论