一、CUDA内存模型概述
寄存器、共享内存、本地内存、常量内存、纹理内存和全局内存
一个核函数中的线程都有自己私有的本地内存。
一个线程块有自己的共享内存,对同一个线程块中所有的线程都可见,其内容持续线程块的整个生命周期。
所有线程都可以访问全局内存。
所有线程都可以访问的只读空间有:常量内存空间和纹理内存空间。其中纹理内存为各种数据布局提供了不同的寻址模式和滤波模式。
对于一个应用程序来说,全局内存、常量内存和纹理内存中的内容具有相同的生命周期。
1. 寄存器
核函数中声明的一个没有其他修饰符的自变量,通常存储在寄存器中。在核函数声明的数组中,如果用于引用该数组的索引是常量且能在编译时确定,那么该数组也存储在寄存器中。
寄存器是一个在SM中由活跃线程束划分出的较少资源。在核函数中使用较少的寄存器将使在SM上有更多的常驻线程块。每个SM上并发线程块越多,使用率和性能就越高。
如果一个核函数使用了超过硬件限制数量的寄存器,则会用本地内存代替多占用的寄存器。这种寄存器溢出会给性能带来不利影响。
2. 本地内存
核函数中符合存储在寄存器中但不能进入被该核函数分配的寄存器空间中的变量将溢出到本地内存中。
溢出到本地内存中的变量本质上与全局内存在同一块存储区域,因此本地内存访问的特点是高延迟核低带宽。
3. 共享内存
在核函数中使用修饰符__shared__修饰的变量存放在共享内存中。
因为共享内存是片上内存,所以与本地内存或全局内存相比,其具有更高的带宽和更低的延迟。其使用类似于CPU一级缓存,是可编程的。