CUDA基础(1):操作流程与kernel概念
Cuda是Nvidia发布的并行计算框架,GPU的工作早已不局限于处理图形图像,它所包含的大量的计算单元用来执行那些计算量大但可以并行处理的任务。
Cuda的操作概括来说包含5个步骤:
1.CPU在GPU上分配内存:cudaMalloc;
2.CPU把数据发送到GPU:cudaMemcpy;
3.CPU在GPU上启动内核(kernel),它是自己写的一段程序,在每个线程上运行;
4.CPU把数据从GPU取回:cudaMemcpy;
5.CPU释放GPU上的内存。
其中关键是第3步,能否写出合适的kernel,决定了能否正确解决问题和能否高效的解决问题。
Cuda对线程做了合适的规划,引入了grid和block的概念,block由线程组成,grid由block组成,一般说blocksize指一个block放了多少thread;gridsize指一个grid放了多少个block。
一个kernel结构如下:Kernel<<<Dg, Db, Ns, S>>>(param1, param2, ...)
-Dg:grid的尺寸,说明一个grid含有多少个block,为dim3类型,一个grid最多含有65535*65535*65535个block,Dg.x,Dg.y,Dg.z最大值为65535;
-Db:block的尺寸,说明一个block含有多上个thread,为dim3类型,一个block最多含有1024(cuda2.x版本)个threads,Db.x和Db.y最大值为1024,Db.z最大值64;
(举个例子,一个block的尺寸可以是:1024*1*1 | 256*2*2 | 1*1024*1 | 2*8*64 | 4*4*64等)
-Ns:可选参数,如果kernel中由动态分配内存的shared memory,需要在此指定大小,以字节为单位;
-S:可选参数,表示该kernel处在哪个流当中。
可参见:
关于cuda版本信息:http://blog.cuvilib.com/2010/06/09/nvidia-cuda-difference-between-fermi-and-previous-architectures/
blocksize大小:http://stackoverflow.com/questions/5062781/cuda-max-threads-in-a-block
gridsize大小:http://stackoverflow.com/questions/6048907/maximum-blocks-per-gridcuda