【发布时间】: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 调用都将重新初始化该设备。这正是我所需要的。非常感谢!
-
你想用你的解决方案写一个简短的答案。我会很高兴地支持它。然后我们为下一个有相同问题的人提供答案