我知道在 CUDA 的内存层次结构中,我们有共享内存、纹理内存、常量内存、寄存器,当然还有我们使用 cudaMalloc() 分配的全局内存。
我一直在搜索我能找到的任何文档,但我还没有遇到任何明确解释什么是全局内存的文档。
我相信分配的全局内存位于显卡本身的 GDDR 上,而不是与 CPU 共享的 RAM,因为其中一份文档确实指出主机端无法取消引用指针。我对吗?
全局内存是一个虚拟地址空间,可以映射到设备内存(显卡上的内存)或页面锁定(固定)的主机内存。后者要求 CC > 1.0。
局部、常量、纹理和局部内存在全局内存中分配,但通过不同的地址空间和缓存访问。
在 CC > 2.0 上,通用地址空间允许将共享内存映射到全局地址空间;但是,共享内存始终驻留在每个 SM 片上内存中。
全局内存在芯片外,但在显卡上。
本地内存存储在全局内存中,但地址是交错的,当数组存储在那里时,当 warp 中的每个线程从其数组中的相同索引读取时,访问会合并。
常量和纹理内存也(最初)存储在全局内存中,但它缓存在片上缓存中。
共享内存以及 L1 和 L2 高速缓存在芯片上。
这在CUDA C 编程指南的第 3.2.2 节中进行了讨论。简而言之,所有类型的内存,即共享内存、常量内存、纹理内存和全局内存,都驻留在设备(即 GPU)本身的内存中。
但是,您可以明确将部分内存声明为“已映射”,即主机上的内存可从设备访问。为此,请参阅编程指南的第 3.2.4 节。