【发布时间】:2012-01-30 20:52:15
【问题描述】:
当我运行仅分配少量全局内存(低于 20 M)的 CUDA 程序时,出现“内存不足”错误。 (从其他人的帖子中,我认为问题与内存碎片有关)我试图理解这个问题,并意识到我有几个与 CUDA 内存管理相关的问题。
CUDA 中有虚拟内存的概念吗?
如果只允许一个内核同时在 CUDA 上运行,在其终止后,它使用或分配的所有内存是否都会释放?如果没有,这些内存何时释放?
如果允许在 CUDA 上运行多个内核,它们如何确保它们使用的内存不重叠?
谁能帮我回答这些问题?谢谢
编辑1:操作系统:x86_64 GNU/Linux CUDA 版本:4.0 设备:Geforce 200,它是机器附带的GPU之一,我认为它不是显示设备。
编辑2:以下是我做了一些研究后得到的。请随时纠正我。
CUDA 将为每个主机线程创建一个上下文。此上下文将保留诸如已为该应用程序保留的内存部分(预分配的内存或动态分配的内存)等信息,以便其他应用程序无法写入。当这个应用程序(不是内核)终止时,这部分内存将被释放。
CUDA 内存由链接列表维护。当应用程序需要分配内存时,它会通过这个链表查看是否有连续的内存块可供分配。如果找不到这样的块,即使总可用内存大小大于请求的内存,也会向用户报告“内存不足”错误。这就是与内存碎片有关的问题。
cuMemGetInfo 会告诉您有多少内存可用,但不一定会告诉您由于内存碎片,您可以在最大分配中分配多少内存。
在 Vista 平台 (WDDM) 上,GPU 内存虚拟化是可能的。也就是说,多个应用程序可以分配几乎整个 GPU 内存,而 WDDM 将管理将数据交换回主内存。
新问题: 1. 如果上下文中保留的内存在应用程序终止后会被完全释放,则不应该存在内存碎片。内存中一定还有一些数据。 2. 有没有办法重构GPU内存?
【问题讨论】:
-
您能否编辑问题以包括您使用的操作系统、GPU 和 cuda 版本,以及 GPU 是显示设备还是非显示设备。这将影响您问题的正确答案。
-
回答额外的问题 - 用户可观察到的碎片发生在上下文中,并且无法更改 GPU 内的内存映射,这一切都由主机处理司机。
-
正如您所解释的,上下文分配由上下文静态分配、上下文用户分配和CUDA上下文运行时堆组成。我认为上下文静态分配和上下文用户分配的大小是预先确定的。因此,我认为内存碎片的唯一原因是上下文运行时堆,它只在 Fermi 架构上。那是对的吗?我猜系统会为上下文运行时堆预先分配一块内存,以便启用内核内动态内存分配。
-
您的问题目前有点混乱。你能把它编辑成只有初始背景,然后是一堆问题吗?