【问题标题】:Free memory occupied by cudaMemGetInfocudaMemGetInfo 占用的空闲内存
【发布时间】:2021-02-27 11:10:04
【问题描述】:

我有以下简单的代码来查找可用的 GPU

int * getFreeGpuList(int *numFree) {
    int * gpuList;
    int nDevices;
    int i, j = 0, count = 0;

    cudaGetDeviceCount(&nDevices);
    gpuList = (int *) malloc(nDevices * sizeof(int));
    for (i = 0; i < nDevices; ++i) {
        cudaSetDevice(i);
        size_t freeMem;
        size_t totalMem;
        cudaMemGetInfo(&freeMem, &totalMem);
        if (freeMem > .9 * totalMem) {
            gpuList[j] = i;
            count++;
            j++;
        }
    }
    *numFree = count;
    return gpuList;
}

问题是cudaMemGetInfo 在每个 GPU 中占用了一些内存(在我的情况下约为 150MB)。这段代码是一个运行时间较长的大程序的一部分,而且我经常同时运行几个进程,所以最后这个函数占用的内存是很大的。请告诉我如何释放cudaMemGetInfo 占用的GPU 内存?谢谢!

【问题讨论】:

  • cudaSetDevice 建立一个上下文,即内存所在的位置,您对此无能为力
  • 嗨@talonmies。我找到了这个函数cudaDeviceReset。我试过了,它似乎符合我的目的。我把它放在 for 循环的末尾(在设置下一个设备之前),但我不确定它是否可能包含任何潜在的危险。你有什么想法吗?
  • 这将破坏上下文。但是,如果您的意图是使用上下文来做某事,那么您将阻止该事情的工作
  • @talonmies 不,我唯一需要的是免费设备列表。从文档 > 显式销毁和清理当前进程中与当前设备关联的所有资源。对该设备的任何后续 API 调用都将重新初始化该设备。这正是我所需要的。非常感谢!
  • 你想用你的解决方案写一个简短的答案。我会很高兴地支持它。然后我们为下一个有相同问题的人提供答案

标签: cuda gpu


【解决方案1】:

基于上面talonmies 的一些见解,cudaSetDevice 创建了一个上下文并占用了设备中的一些内存,我发现cudaDeviceReset 可以“显式销毁和清理与当前设备关联的所有资源”当前进程”,而不影响同一设备上的其他进程。

11 月 26 日更新:如果想查询 GPU 信息,最好使用 NVML 库。以我的经验,它的速度要快得多,而且对于简单的内存和名称查询不占用内存。

【讨论】:

  • 感谢您添加此答案
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2012-09-18
  • 2015-08-17
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多