相关疑难解决方法(0)

如何管理CUDA内存?

当我运行仅分配少量全局内存(低于20 M)的CUDA程序时,出现"内存不足"错误.(从其他人的帖子中,我认为问题与内存碎片有关)我试着理解这个问题,并意识到我有几个与CUDA内存管理有关的问题.

  1. CUDA中是否有虚拟内存概念?

  2. 如果只允许一个内核同时在CUDA上运行,在终止后,它使用或分配的所有内存都将被释放?如果没有,这些内存何时免费发布?

  3. 如果允许在CUDA上运行多个内核,他们如何确保他们使用的内存不重叠?

谁能帮我回答这些问题?谢谢

编辑1:操作系统:x86_64 GNU/Linux CUDA版本:4.0设备:Geforce 200,它是连接到机器的GPUS之一,我不认为它是显示设备.

编辑2:以下是我做了一些研究后得到的结果.随意纠正我.

  1. CUDA将为每个主机线程创建一个上下文.此上下文将保留诸如内存的哪一部分(预先分配的内存或动态分配的内存)等信息已保留给此应用程序,以便其他应用程序无法写入该应用程序.当此应用程序终止(不是内核)时,将释放这部分内存.

  2. CUDA内存由链接列表维护.当应用程序需要分配内存时,它将通过此​​链接列表查看是否有可用于分配的连续内存块.如果找不到这样的块,即使总可用内存大小大于请求的内存,"内存不足"错误也会向用户报告.这就是与内存碎片有关的问题.

  3. cuMemGetInfo将告诉您有多少可用内存,但不一定是由于内存碎片而可以在最大分配中分配多少内存.

  4. 在Vista平台(WDDM)上,GPU内存虚拟化是可能的.也就是说,多个应用程序几乎可以分配整个GPU内存,WDDM将管理交换数据到主内存.

新问题:1.如果在应用程序终止后上下文中保留的内存将完全释放,则不应存在内存碎片.内存中必须留有某种数据.2.有没有办法重构GPU内存?

cuda nvidia gpu-programming

24
推荐指数
1
解决办法
1万
查看次数

确定可以连续分配的最大 GPU 设备内存量

我目前正在开发一个 CUDA 应用程序,如果处理的数据足够大,它将使用尽可能多的全局设备内存 (VRAM)。我分配的是一个 3D 卷cudaMalloc3d,所以我使用的内存必须是连续的。为此,我尝试使用该函数检索空闲设备内存的数量,cudaMemGetInfo然后分配尽可能多的空闲内存。但是,这似乎不起作用。尝试分配该数量的内存时,我仍然遇到错误。

现在,我的问题是是否有办法检索我可以连续分配的最大设备内存量。

一种选择是试错法,我反复减少我尝试分配的数量,直到分配成功。但是,我不太喜欢这个想法。

背景:我有一个程序可以在 GPU 上进行锥束 CT 重建。这些卷可能会变得非常大,因此我在必要时将它们分成块。因此,我必须知道一个块最多可以有多大才能仍然适合全局设备内存。

memory memory-management cuda

4
推荐指数
1
解决办法
851
查看次数