CUDA 全局内存,它在哪里?
Posted
技术标签:
【中文标题】CUDA 全局内存,它在哪里?【英文标题】:CUDA Global Memory, Where is it? 【发布时间】:2012-06-26 01:39:48 【问题描述】:我知道在 CUDA 的内存层次结构中,我们有共享内存、纹理内存、常量内存、寄存器,当然还有我们使用 cudaMalloc() 分配的全局内存。
我一直在搜索我能找到的所有文档,但我还没有找到任何明确解释什么是全局内存的文档。
我相信分配的全局内存位于显卡本身的 GDDR 上,而不是与 CPU 共享的 RAM,因为其中一份文档确实指出主机端无法取消引用指针。我说的对吗?
【问题讨论】:
这可能就是你要找的:***.com/questions/8684770/… 【参考方案1】:全局内存是一个虚拟地址空间,可以映射到设备内存(显卡上的内存)或页面锁定(固定)的主机内存。后者要求 CC > 1.0。
局部、常量、纹理和局部内存在全局内存中分配,但通过不同的地址空间和缓存访问。
在 CC > 2.0 上,通用地址空间允许将共享内存映射到全局地址空间;但是,共享内存始终驻留在每个 SM 片上内存中。
【讨论】:
请注意,页面锁定内存可以被映射(内核内存请求通过 PCIe 总线到 CPU 的 RAM 芯片)或未映射(内存必须首先被复制到图形上的物理 off-die RAM 芯片卡在内核可以访问之前)。请参阅 CUDA C 编程指南的第 3.2.4 节。【参考方案2】:全局内存在芯片外,但在显卡上。
本地内存存储在全局内存中,但地址是交错的,当数组存储在那里时,当 warp 中的每个线程从其数组中的相同索引读取时,访问会合并。
常量和纹理内存也(最初)存储在全局内存中,但它被缓存在片上缓存中。
共享内存以及 L1 和 L2 高速缓存在芯片上。
【讨论】:
全局内存可以在设备内存或固定主机内存中。 @GregSmith:固定的主机内存可以映射到设备的内存空间,但我不认为它被称为全局内存。 CUDA 编程指南 4.2,第 5.3.2.1 节指出,“全局内存驻留在设备内存中”,尽管这本身就是一个奇怪的句子:)【参考方案3】:这在CUDA C Programming Guide 的第 3.2.2 节中进行了讨论。简而言之,所有类型的内存,即共享内存、常量内存、纹理内存和全局内存,都驻留在设备的内存中,即 GPU 本身。
但是,您可以专门将部分内存声明为“已映射”,即可以从设备访问主机上的内存。为此,请参阅编程指南的第 3.2.4 节。
【讨论】:
是的,我遇到了主机和设备内存的事情。然而,我的一个同行将全局内存解释为在主内存上分配,我不认为是这种情况。 @gamerx:您的同伴可能对映射内存感到困惑,如编程指南第 3.2.4.3 节所述。 这是不正确的。常量、纹理和全局可以驻留在设备内存和固定主机内存中。开发人员只能控制使用 cudaHostAlloc 和 cudaHostRegister 在设备内存中分配全局部分。剩下的就看司机了。 @GregSmith:这似乎不是第 3.2.4 节中暗示的内容。据我了解,开发人员必须明确地将内存分配为cudaHostAllocMapped
才能发生这种情况。以上是关于CUDA 全局内存,它在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
非常大的 numpy 数组不会引发内存错误。它在哪里生活? [复制]
malloc 和全局变量声明在 C 中将它们的变量分配到哪里? [复制]