除了编程模型和执行模型,CUDA也规定了存储器模型,如下图所示:
每一个线程拥有自己的私有存储器,每一个线程块拥有一块共享存储器(Shared memory);最后,grid中所有的线程都可以访问同一块全局存储器(global memory)。除此之外,还有两种可以被所有线程访问的只读存储器:常数存储器(constant memory)和纹理存储器(Texture memory),它们分别为不同的应用进行了优化。全局存储器、常数存储器和纹理存储器中的值在一个内核函数执行完成后将被继续保持,可以被同一程序中其也内核函数调用。
下表给出了这8种存储器的位置、缓存情况,访问权限及生存域
存储器 | 位置 | 拥有缓存 | 访问权限 | 变量生存周期 |
register | GPU片内 | N/A | Device可读/写 | 与thread相同 |
Local memory | 板载显存 | 无 | Device可读/写 | 与thread相同 |
Shared memory | GPU片内 | N/A | Device可读/写 | 与block相同 |
Constant memory | 板载显存 | 有 | Device可读,host要读写 | 可在程序中保持 |
Texture memory | 板载显存 | 有 | Device可读,host要读写 | 可在程序中保持 |
Global memory | 板载显存 | 无 | Device可读/写, host可读/写 | 可在程序中保持 |
Host memory | Host内存 | 无 | host可读/写 | 可在程序中保持 |
Pinned memory | Host内存 | 无 | host可读/写 | 可在程序中保持 |