持续关注我的朋友可能知道,之前因为做一个点云配准的项目,重新又开始学习CUDA编程。以我浅薄的并行编程技术,对于一些对存储要求不是很高的小程序,还勉强能够应付。但是最近做的一个网格优化的并行项目,数据量大,动态存储要求高,对存储空间数据的更新频率频繁,自然对并行编程的存储使用有了更高的要求。因此,为了能够更进一步的提升并行编程技术,解决存储使用的一些问题,我最近学习了英伟达周斌老师的视频教程,计划做一个系统性的Cuda学习与提升。我计划做一个系列的博客,来分享一些我在并行编程中存储使用的一些心得体会,作为备忘,同时分享给大家。
1. 存储与函数的类别
Register;Shared Memory block内部数据共享;Local Memory;Global Memory;Constant Memory;Texture Memory;Instruction Memory (不可见);
线程私有的存储:Local memory
Block私有的存储:Shared Memory
整个设备共有的:Global Memory
函数命名对应的执行单元(Device: GPU Cuda;Host: CPU)
__device__ float filter[N] 显存定义变量
__global__ void DeviceFunc() 执行位置 device (GPU) 调用位置 device
__global__ void KenerFunc() 执行位置 device (GPU) 调用位置host
一些注意事项:
一些数据类型的定义:
示例:
一些数学函数
内建函数,牺牲精度,提升速度, 使用双下划线 :
通过ID计算线程单元
2. 线程层次
Grid:block组,一维或多维线程块
Block:一组线程Thread
线程层次编号:
示例:使用二维线程编号调用CUDA计算单元
多块索引:
线程同步:(这里是块内同步,如果全局同步,开销过大)
线程调度:
SM->Block; SP->Thread
Wrap 块内的一组线程,作为调度折中。
3. 内存数据传输
对于device和host两个执行方式,其对应内存使用的权限。
CPU与GPU的数据交互:
到这里,我们把和GPU并行编程有关的基础概念做了介绍。基于这些概念,我们将在下一篇博客中进一步的学习如何实现高效的Cuda编程。