CUDA线程可以在运行过程中从多中内存空间访问数据,分为三个层次:
1,局部内存:每一个线程有其私有的局部内存。
2,共享内存:每一个线程块(thread block)有一个共享内存,可以被该线程块中的所有线程访问。
3,全局内存:所有的线程都能访问。
此外还有两个能被所有线程都访问的只读内存:constant 和texture内存,如下图所示:
CUDA编程模型假设系统由一个主机(CPU)和一个设备(GPU)组成,它们各自有自己的内存。在核的执行过程中,需要提供函数用于分配内存,释放内存,复制设备内存以及数据在主机内存和设备内存之间的传输。
设备内存可以以线性内存或者CUDA数组的方式进行分配,CUDA数组主要用于纹理获取。
线性内存通常使用 cudaMalloc()进行分配,用cudaFree()对其释放,主机内存和设备内存之间的数据传输通过cudaMemcpy()实现。
cudaMallocPitch()和cudaMalloc3D()分别用于二维和三维数组的内存分配。
cudaMemcpy2D()和cudaMemcpy3D()分别用于二维和三维数组的内存复制。