浅谈GPU编程PPT课件.ppt_第1页
浅谈GPU编程PPT课件.ppt_第2页
浅谈GPU编程PPT课件.ppt_第3页
浅谈GPU编程PPT课件.ppt_第4页
浅谈GPU编程PPT课件.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

CUDA略谈 1 引言逻辑线程拓扑CUDA存储器类型设备端存储器主机端存储器参考书 2 CUDA 统一计算设备架构它是一种将GPU作为数据并行计算设备的软硬件体系 开发GPU通用计算程序 需掌握并行算法和GPU架构方面的知识 支持CUDA的GPU可有效利用原用于图形渲染的计算资源进行通用计算 此处就基于GPU的CUDA编程谈一些认识 3 线程逻辑拓扑结构 4 线程逻辑拓扑结构 线程拓扑分两个层次 顶层是2维网格平面 以块为单位 块为3维立方结构 以线程为单位 故称线程块 grid 4 4 block 4 4 4 thread block 5 CUDA程序结构 内核函数 即设备端代码 形如 global kernel 形参 主机端代码voidmain dim3block 4 4 4 dim3grid 4 4 1 kernel 实参 6 存储器层次结构 7 存储器类型 8 设备端存储器结构 寄存器共享存储器局部存储器常数存储器全局存储器纹理存储器 板载显存 GPU片上 9 寄存器 GPU片上高速存储器每个寄存器32bit 每个SM有大量寄存器 但由块内线程共享 故平均到每个线程的寄存器就很有限了 在内核函数中声明的少量变量是寄存器变量 每个线程都维护各自的寄存器变量 它们是线程私有的 global kernel intbx blockIdx x intby blockIdx y inttx threadIdx x intty threadIdx y inttz threadIdx z 10 局部存储器 板载显存如果每个线程使用了过多的寄存器 或声明了大型结构体或数组 或者编译器无法确定数组的大小 线程的私有变量就有可能会被分配到局部存储器中 例见P46 11 共享存储器 SM 线程块内共享片上高速存储器静态分配动态分配 global kernel 形参 shared intsm static 16 extern shared intsm dynamic voidmain intsm dynamic size 32 kernel 实参 12 共享存储器 SM SM的组织方式在1 x计算能力的设备中 sm共16KB 被划分为16个bank 每个bank的宽度为32位 32bit bank0 0 16 32bit banki i 16 i 32bit bank15 15 31 32bit bank1 1 17 13 共享存储器 SM SM访问的bank冲突 每个warp为32个线程 一个warp对sm的访问被分成两个half warp的访问 只有同一个half warp内的线程才可能发生bank冲突 前half warp的线程与后half warp的线程之间则不会发生bank冲突 14 共享存储器 SM bank half warp bank half warp 顺序访问 随机访问 无bank冲突 bank half warp 3间隔访问 15 共享存储器 SM bank half warp bank half warp 2间隔访问 8间隔访问 2路bank冲突 bank half warp 广播机制 8路bank冲突 无bank冲突 16 常数存储器 只读存储器 数据位于显存 但拥有缓存加速 空间较小 只有64KB 每个SM拥有8KB的常数存储器缓存 在函数外定义 作用范围为文件域 主机端和设备端函数均可见 使用方法 方法1 定义时初始化 内核函数中直接使用 方法2 先定义 后在主机端用函数赋值 17 常数存储器 constant charp HelloCUDA 11 定义 constant intt HelloCUDA 11 0 1 2 3 4 5 6 7 8 9 10 定义并初始化 constant intnum 11 定义并初始化 global staticvoidHelloCUDA char result inti 0 for i 0 i num i result i p HelloCUDA i t HelloCUDA i intmain charhelloCUDA HelloCUDA cudaMemcpyToSymbol p HelloCUDA helloCUDA sizeof char 11 直接使用 函数赋值 18 全局存储器 位于板载显存 占据显存的绝大部分 没有缓存 也称线性内存 可定义两种数据结构 线性存储器 用于存放主机端传过来的数据或存放将要回传给主机的数据 CUDA数组 用于纹理绑定 为有效利用带宽 必须遵循合并访问要求 并避免分区冲突 19 全局存储器 分区 partition 冲突 在中高端GPU中一般有多个存储器控制器 每个存储器控制器对应的地址空间称为一个分区 连续的256Byte数据存储于同一分区中 相邻的另一组256Byte数据则存储在相邻的分区中 GTX280中有8个分区 一个512个元素的浮点数组布局如下 在访问数据时应均匀分布在不同的分区中 256byte partition0 0 63 448 511 64 127 256byte 256byte 256byte partition1 partitioni partition7 20 全局存储器 合并访问 按段长对齐可满足合并访问的要求结构体数组的对齐定义P157一维线性数组至少按256Byte对齐二 三维线性数组采用填充 P49 进行对齐满足对齐要求的数组分配函数及赋值函数见下表 21 纹理存储器 GPU芯片 全局存储器用于纹理的两种数据形式 普通线性存储器CUDA数组 纹理存储器 HOST 显卡 纹理参照系 纹理拾取 绑定 22 纹理存储器 有关术语及描述 只读存储器容量比常数存储器大纹理拾取 在内核函数中访问纹理存储器的操作 纹理拾取使用的坐标与数据在显存中的位置可以不同 通过纹理参照系约定二者的映射方式 将数据与纹理绑定 将显存中的数据与纹理参照系关联的操作 23 纹理存储器 有关术语及描述 显存中可绑定到纹理的数据形式 普通线性存储器 非对齐 只能与一维或者二维纹理绑定 采用整型纹理拾取坐标 坐标与数据在存储器中的位置相同 CUDA数组可以与一维 二维或者三维纹理绑定 纹理拾取坐标为归一化或者非归一化的浮点型 像元 绑定到纹理的线性存储器或CUDA数组中的元素 24 纹理存储器 有关术语及描述 像元的数据类型 不支持三元组 25 纹理存储器 有关术语及描述 纹理存储器有缓存机制纹理缓存一次预取拾取坐标对应位置附近的几个像元 绑定到纹理的数据修改后 应重启内核函数且纹理缓存刷新后 才能拾取到被修改的数据 26 纹理存储器 纹理存储器的特殊功能 浮点型纹理拾取坐标归一化 0 0 1 0 非归一化 0 0 N N为该维度上的像元数 寻址模式 输入坐标超范围时的处理方式 钳位模式 clamp 按上下限坐标拾取像元 循环模式 wrap 也称回绕 只用于归一化坐标 类型转换 对8位或16位整型像元数据 其拾取的返回值可转换为归一化浮点型 滤波 对CUDA数组绑定的纹理 拾取返回值为浮点型 则可对返回值进行滤波 最近点取样 适用于查找表 线性滤波 适用于图像处理 27 纹理存储器使用 步骤1 在主机端声明显存中需要绑定到纹理的线性存储器或CUDA数组 CUDA数组元素的数据类型用结构体cudaChannelFormatDesc来描述structcudaChannelFormatDesc intx y z w 多元组数据中每个分量二进制位数enumcudaChannelFormatKindf f取值 cudaChannelFormatKindSigned 有符号整型 cudaChannelFormatKindUnsigned 无符号整型 cudaChannelFormatKindFloat 浮点型 28 纹理存储器使用 步骤1 在主机端声明显存中需要绑定到纹理的线性存储器或CUDA数组 CUDA数组元素的数据类型如uchar2 则x y z w分别是8 8 0 0 而f取值为cudaChannelFormatKindUnsigned又如float4 则x y z w分别是32 32 32 32 而f取值为cudaChannelFormatKindFloat 29 纹理存储器使用 步骤1 在主机端声明显存中需要绑定到纹理的线性存储器或CUDA数组 CUDA数组的维度CUDA数组空间分配函数 cudaMalloc3DArray 分配一维 二维或三维数组cudaMallocArray 一般用于二维数组CUDA数组空间释放函数 cudaFreeArray CUDA数组与其他CUDA数组或线性存储器的数据传输 cudaMemcpyToArray 或cudaMemcpy3D 30 纹理存储器使用 步骤1 在主机端声明显存中需要绑定到纹理的线性存储器或CUDA数组 CUDA数组尺寸用结构体cudaExtent描述数组三个维度的大小cudaExtentextent make cudaextent 1 8192 0 0 cudaExtentextent make cudaextent 1 65535 1 32768 0 cudaExtentextent make cudaextent 1 2048 1 2048 1 2048 31 纹理存储器使用 步骤1 在主机端声明显存中需要绑定到纹理的线性存储器或CUDA数组 例 声明一个数据类型为uchar2 64 32 16的CUDA3D数组 cudaArray cuArray 0 cudaExtentextent make cudaExtent 64 32 16 cudaChannelFormatDescdesc cudaCreateChannelDesc 8 8 0 0 cudaChannelFormatKindUnsigned cudaMalloc3DArray 32 纹理存储器使用 步骤1 在主机端声明显存中需要绑定到纹理的线性存储器或CUDA数组 CUDA数组声明完毕后 还需赋值 可用以下函数完成CUDA数组赋值 CUDA数组之间赋值cudaMemcpyToArray CUDA数组与线性存储器之间赋值cudaMemcpy3D 33 纹理存储器使用 步骤2 声明纹理参照系纹理参照系属性编译时属性 编译前显式声明 编译时确定 一旦确定不能修改 运行时属性 运行时设定 只适用于与CUDA数组绑定的纹理参照系 在所有函数体外声明文件域的texture型变量 最好放在头文件中 形如下示 texturetexRef 34 纹理存储器使用 步骤2 声明纹理参照系texturetexRef 编译时属性 Type 纹理拾取返回的数据类型 即CUDA像元Dim 确定纹理参照系的维度 默认为1 可取值分别为1 2 3ReadMode 确定返回值是否进行类型转换cudaReadModeNormalizedFloat 转换为浮点型cudaReadModeElementType 不转换 此为默认值 35 纹理存储器使用 步骤2 声明纹理参照系运行时属性 通过结构体textureReference描述structtextureReference intnormalized 坐标是否归一化 非零值表示归一化enumcudaTextureFilterModefilterMode 滤波模式enumcudaTextureAddressModeaddressMode 3 structcudaChannelFormatDescchannelDesc 纹理拾取返回的数据类型 要与CUDA数组声明时的类型一致 前已述及 滤波模式有以下两种取值 cudaFilterModePoint表示最近点取样cudaFilterModeLinear表示线性滤波 寻址模式 它是一个大小为3的数组 对应3个维度 可取以下两种值 cudaAddressModeClamp 表示钳位模式 cudaAddressModeWrap 表示循环模式 36 纹理存储器使用 步骤3 纹理绑定将纹理与数组按纹理参照系绑定 实现数组到纹理的映射 绑定函数 cudaBindTexture 用于纹理与线性存储器绑定cudaBindTextureToArray 用于纹理与CUDA数组绑定解除绑定 cudaUnbindTexture 37 纹理存储器使用 步骤4 纹理拾取函数见下表 38 主机端内存 在CUDA编程模型中 可申请使用的内存有如下两类 可分页内存 pageablememory 通过操作系统API来分配 如malloc 页锁定内存 page locked pinnedmemory 始终在物理内存中 并以DMA与设备通信 分配函数 cudaHostAlloc 释放函数 cudaFreeHost 39 主机端内存 页锁定内存的标志 cudaHostAllocDefault 分配页锁定内存cudaHostAllocPortable 可在线程间共享cudaHostAllocWriteCombined 此类内存在CPU访问时不缓存仅适用于CPU写 GPU读的模式cudaHo

温馨提示

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

评论

0/150

提交评论