![[GPU计算]CUDA基本介绍.ppt_第1页](http://file1.renrendoc.com/fileroot_temp2/2020-3/14/30294159-edbf-49a8-a838-fb5bbf5caf8e/30294159-edbf-49a8-a838-fb5bbf5caf8e1.gif)
![[GPU计算]CUDA基本介绍.ppt_第2页](http://file1.renrendoc.com/fileroot_temp2/2020-3/14/30294159-edbf-49a8-a838-fb5bbf5caf8e/30294159-edbf-49a8-a838-fb5bbf5caf8e2.gif)
![[GPU计算]CUDA基本介绍.ppt_第3页](http://file1.renrendoc.com/fileroot_temp2/2020-3/14/30294159-edbf-49a8-a838-fb5bbf5caf8e/30294159-edbf-49a8-a838-fb5bbf5caf8e3.gif)
![[GPU计算]CUDA基本介绍.ppt_第4页](http://file1.renrendoc.com/fileroot_temp2/2020-3/14/30294159-edbf-49a8-a838-fb5bbf5caf8e/30294159-edbf-49a8-a838-fb5bbf5caf8e4.gif)
![[GPU计算]CUDA基本介绍.ppt_第5页](http://file1.renrendoc.com/fileroot_temp2/2020-3/14/30294159-edbf-49a8-a838-fb5bbf5caf8e/30294159-edbf-49a8-a838-fb5bbf5caf8e5.gif)
已阅读5页,还剩67页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CUDA基本介绍 基于NvidiaGPU的通用计算开发 GPU的优势 强大的处理能力GPU接近1Tflops s高带宽140GB s低成本Gflop 和Gflops w高于CPU当前世界超级计算机五百强的入门门槛为12Tflops s一个三节点 每节点4GPU的集群 总处理能力就超过12Tflops s 如果使用GTX280只需10万元左右 使用专用的Tesla也只需20万左右 1 GPU高性能计算 GPUVSCPU 计算能力 8xdoubleprecisionECCL1 L2Caches 1TFSinglePrecision4GBMemory GPU CPU架构比较 延迟与吞吐量 CPU 通过大的缓存保证线程访问内存的低延迟 但内存带宽小 执行单元太少 数据吞吐量小需要硬件机制保证缓存命中率和数据一致性GPU 高显存带宽和很强的处理能力提供了很大的数据吞吐量缓存不检查数据一致性直接访问显存延时可达数百乃至上千时钟周期 单核CPU已经走到了尽头 频率提高遇到了瓶颈从p4时代至今主流处理器频率一直在2GHz 3GHz左右架构上已无潜力可挖 超线程多流水线复杂的分支预测大缓存等技术已经将性能发挥到了极致 但是通用计算中的指令级并行仍然偏低上述技术占用了芯片上的绝大多数晶体管和面积 目的却只是让极少数的执行单元能够满负荷工作 GPU能够更好的利用摩尔定律提供的晶体管 图形渲染过程高度并行 因此硬件也是高度并行的少量的控制单元 大量的执行单元显存被固化在了PCB上 拥有更好的EMI性能 因此运行频率高于内存通过更大的位宽实现了高带宽 当前的单核并行计算产品 IBMCell应用主要见于PS3SUNNiarragaNPUNV ATIGPU大规模应用GPU最为常见 受市场牵引发展最快 性价比最高 架构比较 CPUGPUFPGA实现比较 CPUGPUFPGA实现比较 当前的GPU开发环境 Cg 优秀的图形学开发环境 但不适合GPU通用计算开发ATIstream 硬件上已经有了基础 但只有低层次汇编能够使用所有资源 高层次抽象Brook本质上是基于上一代GPU的 缺乏良好的编程模型OpenCL 联合制定的标准 抽象层次较低 对硬件直接操作更多 代码需要根据不同硬件优化CUDA 目前最佳选择 未来的发展趋势 GPU通用计算进一步发展 更高版本的CUDA OpenCL新产品涌现 Nvidia和AMD的下一代产品 Intel的LarraBeeCPU GPU产品 减少了CPU GPU通信成本 但存储器带宽和功耗面积等可能将制约集成度 在较低端的应用中将有用武之地 CUDA的硬件架构适合通用计算 G8x系G9x系GT200系列标量机架构提高了处理效率 更加适合通用计算增加了sharedmemory和同步机制 实现线程间通信以通用的处理器矩阵为主 辅以专用图形单元 GTX280性能 933Gflops MAD 单精度116Gflops双精度 MAD 512bit位宽ddr3显存 提供了140GB s的带宽1G的显存 GT200框图 TPC 3SMInstructionandconstantcacheTextureLoad store SM ROP ROP 对DRAM进行访问TEXTURE机制对global的atomic操作 微架构比较 执行流水线 工作在通用计算模式下的GT200 SM架构 DUAL Issue并发 每二周期可以发射一次指令FPU和SFU指令延迟是四周期 某些情况下可以让FPU和SFU并发执行 实现超标量理论处理能力峰值没有计算dual issue双精度浮点计算不能dual issue CUDA架构GPU硬件特点 硬件资源模块化 根据市场定位裁减高度并行存在TPCSM两层每个SM又有8SPSM内存在高速的sharedmemory和同步机制原子操作有利于实现通用计算中的数据顺序一致性sharedmemoryTexturecacheconstantcache等高速片内存储器有助于提高数据访问速度 节省带宽 如何选购硬件 目前 2008 12 只有CUDA能够完全发挥新一代GPU的全部计算能力 Nvidia的G80以上的GPU能够支持CUDA GT200系列不仅性能更强 而且具有很多实用的新特性Tesla专用流处理器拥有更大的显存和更高的核心频率 通过降低显存频率 屏蔽不需要的图形单元和改善散热获得了更好的稳定性 适合服务器或者集群使用 适合的应用 GPU只有在计算高度数据并行任务时才能发挥作用 在这类任务中 需要处理大量的数据 数据的储存形式类似于规则的网格 而对这写数据的进行的处理则基本相同 这类数据并行问题的经典例子有 图像处理 物理模型模拟 如计算流体力学 工程和金融模拟与分析 搜索 排序 在很多应用中取得了1 2个数量级的加速 不适合的应用 需要复杂数据结构的计算如树 相关矩阵 链表 空间细分结构等 则不适用于使用GPU进行计算 串行和事务性处理较多的程序并行规模很小的应用 如只有数个并行线程需要ms量级实时性的程序需要重新设计算法和数据结构或者打包处理 CUDA执行模型 重点是将CPU做为终端 Host 而GPU做为服务器 Server 或协处理器 Coprocessor 或者设备 Device 从而让GPU来运行一些能够被高度线程化的程序 CUDA的基本思想是尽量得开发线程级并行 ThreadLevelParallel 这些线程能够在硬件中被动态的调度和执行 CUDA执行模型 调用核程序时CPU调用API将显卡端程序的二进制代码传到GPUgrid运行在SPA上block运行在SM上thread运行在SP上 gridblockthread Kernel不是一个完整的程序 而只是其中的一个关键并行计算步Kernel以一个网格 Grid 的形式执行 每个网格由若干个线程块 block 组成 每一个线程块又由最多512个线程 thread 组成 gridblockthread 一个grid最多可以有65535 65535个block一个block总共最多可以有512个thread 在三个维度上的最大值分别为512 512和64 gridblockthread grid之间通过globalmemory交换数据block之间不能相互通信 只能通过globalmemory共享数据 不要让多个block写同一区段内容 不保证数据一致性和顺序一致性 同一block内的thread可以通过sharedmemory和同步实现通信block间粗粒度并行 block内thread细粒度并行 warp Warp是硬件特性带来的概念 在CUDAC语言中是透明的 除vote函数 但应用中不能忽略一个warp中有32个线程 这是因为SM中有8个SP 执行一条指令的延迟是4个周期 使用了流水线技术一个halfwarp中有16个线程 这是因为执行单元的频率是其他单元的两倍 每两个周期才进行一次数据传输 SIMT编程模型 SIMT是对SIMD SingleInstruction MultipleData 单指令多数据 的一种变形 两者的区别在于 SIMD的向量宽度是显式的 固定的 数据必须打包成向量才能进行处理 而SIMT中 执行宽度则完全由硬件自动处理了 每个block中的thread数量不一定是32 而SIMT中的warp中的每个线程的寄存器都是私有的 它们只能通过sharedmemory来进行通信 分支性能 与现代的微处理器不同 Nvidia的SM没有预测执行机制 没有分支预测单元 BranchPredicator 在需要分支时 只有当warp中所有的线程都计算出各自的分支的地址 并且完成取指以后 warp才能继续往下执行 如果一个warp内需要执行N个分支 那么SM就需要把每一个分支的指令发射到每一个SP上 再由SP根据线程的逻辑决定需不需要执行 这是一个串行过程 此时SIMT完成分支的时间是多个分支时间之和 存储器模型 RegisterLocalsharedGlobalConstantTextureHostmemoryPinnedhostmemory 寄存器与localmemory 对每个线程来说 寄存器都是线程私有的 这与CPU中一样 如果寄存器被消耗完 数据将被存储在本地存储器 localmemory Localmemory对每个线程也是私有的 但是localmemory中的数据是被保存在显存中 而不是片内的寄存器或者缓存中 速度很慢 线程的输入和中间输出变量将被保存在寄存器或者本地存储器中 Sharedmemory 用于线程间通信的共享存储器 共享存储器是一块可以被同一block中的所有thread访问的可读写存储器 访问共享存储器几乎和访问寄存器一样快 是实现线程间通信的延迟最小的方法 共享存储器可以实现许多不同的功能 如用于保存共用的计数器 例如计算循环次数 或者block的公用结果 例如计算512个数的平均值 并用于以后的计算 constantmemory texturememory 利用GPU用于图形计算的专用单元发展而来的高速只读缓存速度与命中率有关 不命中时将进行对显存的访问常数存储器空间较小 只有64k 支持随机访问 从host端只写 从device端只读纹理存储器尺寸则大得多 并且支持二维寻址 一个数据的 上下左右 的数据都能被读入缓存 适合实现图像处理算法和查找表 全局存储器 使用的是普通的显存 无缓存 可读写 速度慢整个网格中的任意线程都能读写全局存储器的任意位置 并且既可以从CPU访问 也可以从CPU访问 各种存储器的延迟 register 1周期sharedmemory 1周期 无bankconflict 16周期 发生16路bankconflict texturememory 1 命中 数百周期 不命中 constantmemory 1 命中 数百周期 不命中 globallocalmemory 数百周期 各存储器大小 每个SM中有64K GT200 或者32K G8x G9x 寄存器 寄存器的最小单位是32bit的registerfile每个SM中有16Ksharedmemory一共可以声明64K的constantmemory 但每个SM的cache序列只有8K可以声明很大的texturememory 但是实际上的texturecache序列为每SM6 8K 使用存储器时可能出现的问题 致命问题 无法产生正确结果多个block访问global同一块 以及block内thread间线程通信时的数据一致性问题Texture的工作模式设置错误效率问题 大大增加访存延迟Sharedbankconflict问题Global合并访问问题 Bankconflict Sharedmemory被分为了16个bank 单位是32 bit 相邻数据在不同bank中 对16余数相同的数据在同一bankHalfwarp中的16个线程访问sharedmemory时最好一一对应 如果多个thread同时访问属于同一bank的数据将发生bankconflict16个线程读同一数据时 会发生一次广播 只用一个cycle 没有bankconflict 合并访问 访问显存时要遵守严格的合并访问规则将halfwarp访问global的起始位置严格的对齐到16的整数倍在G8x G9x硬件上thread访问显存的位置必须逐一递增GT200有了很大的改进 对齐和次序比较灵活好的合并访问可以将存储器访问次数减少十几倍 CUDAAPI CUDAC语言 由Nvidia的CUDA编译器 nvcc 编译CUDAC不是C语言 而是对C语言进行扩展形成的变种 CUDA对C的扩展 函数限定符 对函数有了限定符 用来规定函数是在host还是在device上执行 以及这个函数是从host调用还是从device调用 这些限定符是 device host 和 global CUDA对C的扩展 函数限定符 device 函数在device端执行 并且也只能从device端调用 即作为device端的子函数来使用 global 函数即kernel函数 它在设备上执行 但是要从host端调用 host 函数在host端执行 也只能从host端调用 与一般的C函数相同 CUDA对C的扩展 变量限定符 对变量类型的限定符 用来规定变量被存储在哪一种存储器上 传统的在CPU上运行的程序中 编译器就能自动决定将变量存储在CPU的寄存器还是在计算机的内存中 而在CUDA中 不仅要使用host端的内存 而且也要使用显卡上的显存和GPU上的几种寄存器和缓存 在CUDA编程模型中 一共抽象出来了多达8种不同的存储器 CUDA对C的扩展 变量限定符 device device 限定符声明的变量存在于device端 其他的变量限定符声明的变量虽然存在于不同的存储器里 但总体来说也都在device端 所以 device 限定符可以与其他的限定符联用 当单独使用 device 限定符修饰变量时 这个变量 存在于globalmemory中 变量生命周期与整个程序一样长 可以被grid中所有的线程都可以访问 也可以从host端通过运行时库中的函数访问 CUDA对C的扩展 变量限定符 constant constant 限定符 可以与 device 联用 即 device constant 此时等同于单独使用 constant 使用 constant 限定符修饰的变量 存在于constantmemory中 访问时速度一般比使用globalmemory略快 变量生命周期与整个程序一样长 可以被grid中所有的线程读 从host端通过运行时库中的函数写 CUDA对C的扩展 变量限定符 shared shared 限定符 可以与 device 联用 即 device shared 此时等同于单独使用 shared 使用 shared 限定符修饰的变量 存在于block中的sharedmemory中 变量生命周期与block相同 只有同一block内的thread才能访问 CUDA对C的扩展 kernel执行参数 运算符 用来传递一些kernel执行参数Grid的大小和维度Block的大小和维度外部声明的sharedmemory大小stream编号 CUDA对C的扩展 内建变量 Dim3ThreadIdx 三维 Dim3ThreadDim 三维 Dim3BlockIdx 二维 Dim3BlockDim 三维 执行参数与内建变量的作用 各个thread和block之间的唯一不同就是threadID和BlockID 通过内建变量控制各个线程处理的指令和数据CPU运行核函数时的执行参数确定GPU在SPA上分配多少个block 在SM上分配多少个thread CUDAAPI CUDAAPI需要CUDAdriverAPI才能运行 新版本的Nvidia驱动已经包含了CUDAdriverAPICUDAruntimeAPI是CUDAAPI的可选组件 它是一种动态编译器 JIT 能够直接访问实际中的底层硬件架构 CUDAAPI功能 设备管理 Devicemanagement 上下文管理 Contextmanagement 存储器管理 Memorymanagement 代码块管理 CodeModulemanagement 执行控制 ExcutionControl 纹理索引管理 TextureReferencemanagement 与OpenGL和Direct3D的互操作 InteroperitywithOpenGLandDirect3D NVCC编译器 生成三种不同的输出 PTX CUDA二进制序列和标准C NVCC编译器PTX PTX ParallelThreadeXecution 作用类似于汇编 是为动态编译器 包含在标准的Nvidia驱动中 设计的输入指令序列 这样 不同的显卡使用不同的机器语言 而动态编译器却可以运行相同的PTX 这样做使PTX成为了一个稳定的接口 带来了很多好处 后向兼容性 更长的寿命 更好的可扩展性和更高的性能 但在一定程度上也限制了工程上的自由发挥 这种技术保证了兼容型 但也使新一代的产品必须拥有上代产品的所有能力 这样才能让今天的PTX代码在未来的系统上仍然可以运行 NVCC编译器CUBIN 虽然PTX和JIT编译器提供了很高的性能 但也不是在所有的场合都适用 某些独立软件开发商倾向于牺牲性能 以获得更好的可确定性和可验证性 JIT编译器的输出随着目标硬件和一些其他因素会发生变化 对于需要能够确定的代码的独立软件开发商 比如很多财经软件开发商 它们可以将代码直接编译成CUDA二进制代码 这样就能避免JIT过程的不确定性 直接编译得到的CUDA二进制代码是与特定的硬件和驱动相关的 NVCC编译器C Nvcc的输出还包括标准C 由nvcc生成的C代码将被重定向到其他编译器进行编译 比如ICC GCC或者其他合适的高性能编译器 CUDA中明确的表示了程序中的并行度没不仅在用于编写运行在NvidiaGPU上的代码时非常有效 而且为多核CPU生成高性能代码 在某些应用中 CUDA生成的代码比标准的x86编译器生成的代码的性能提高了4倍 CUDAAPI库函数 CUFFTGPU进行傅立叶变换的函数库 提供了与广泛使用的FFTW库相似的接口 CUBLAS CUDABasicLinearAlgorithmSubprogrammes 库是一个基本的矩阵与向量的运算库 提供了与BLAS相似的接口 可以用于简单的矩阵计算 也可以作为基础构建更加复杂的函数包 如LAPACK等 CUDPP CUDADataparallelprimitives 库提供了很多基本的常用并行操作函数 如排序 搜索等 可以作为基本组件快速的搭建出并行计算程序 如何编写CUDA程序 硬件实现不完全透明 需要掌握硬件实现的原理并行度高 适合CPU的小规模并行算法不一定适用 需要重新设计算法或者参考在集群上使用的并行算法 如何编写CUDA程序 确定适合GPU的算法 找出算法中的并行部分根据需
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司登山自驾游活动方案
- 公司短期旅游活动方案
- 2025年信息技术与产业发展考试试卷及答案
- 2025年心理医生职业伦理考试试卷及答案
- 2025年生命科学基础知识考试试卷及答案
- 2025年健康管理与慢性病防控考试试题及答案
- 2025年科技创新与知识产权管理考试试题及答案
- 2025年家庭教师资格考试试卷及答案
- 2025年护理学课程公共卫生防疫基础知识考试试卷及答案
- 2025年非营利组织发展助理考试试题及答案
- 答题卡的正确使用方法专题培训课件
- JP柜出厂检验记录
- 空调验证方案
- 《语言学纲要》学习指导书习题答案
- 硫酸分装经营企业风险分级管控及隐患治理资料
- icao考试图片题飞行员ICAO描述模板
- 盐城市区第Ⅲ防洪区水环境综合治理PPP项目Ⅱ标段“6·4”一般基坑坍塌事故调查报告
- 拨叉综合课程设计
- 学校物业服务监督及处罚办法
- 心内科高危药物安全管理与指引
- 2012《天津市安装工程预算基价》电气工程(预算基价导出)
评论
0/150
提交评论