准备开一个cuda的专栏,记录自己对cuda点云、视觉学习与实践的过程,希望能坚持更下去,最终的目标是想实现基于cuda对每个粒子并行加速的视觉gmapping。
这一节记录从零开始使用cuda编程的一些基础知识
GPU架构和属性
cudaDeviceProp prop;
cudaGetDeviceProperties(&prop, 0);
上面可以获取gpu的属性。这里实践采用的是GTX1060显卡,一些重要的属性如下:
gpu算力:6.1
grid最大维度:3
- x方向最大block:231-1
- yz方向最大:65535
block最大维度:3
- xy方向最大:1024
- z方向最大:64
- threads最多:1024
上面提到的thread,block,grid还有warp是CUDA编程上的概念,以方便程序员软件设计,组织线程,同样的我们给出一个示意图来表示。
thread:一个CUDA的并行程序会被以许多个threads来执行。
block:数个threads会被群组成一个block,同一个block中的threads可以同步,也可以通过shared memory通信。
grid:多个blocks则会再构成grid。
warp:GPU执行程序时的调度单位,目前cuda的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令,这就是所谓 SIMT。
软件代码
主机(host)一般指cpu,器件(device)一般指gpu
常用的标识符:
__global__
表示该函数在主机中执行函数的呼叫,在器件中执行__host__
表示该函数在主机中执行函数的呼叫,在主机中执行__device__
表示该函数在器件中执行函数的呼叫,在器件中执行
cuda编程主要分为5步:
- 给host和device分配内存
- 数据拷贝,从host到device
- kernel计算
- 数据拷贝,从device到host
- 释放内存
编写代码应该严格按照这样的五个步骤来,后面的代码也都遵循这样一个流程。