【发布时间】:2011-11-01 01:16:00
【问题描述】:
上下文: CUDA 4.0,Linux 64 位,NVIDIA UNIX x86_64 内核模块 270.41.19,在 GeForce GTX 480 上。
我尝试在我的程序中查找(设备)内存泄漏。我使用运行时 API 和 cudaGetMemInfo(free,total) 来测量设备内存使用情况。我注意到内核执行后有重大损失(在本例中为 31M)。内核代码本身不分配任何设备内存。所以我猜它是保留在设备内存中的内核代码。即使我会认为内核没有那么大。 (有没有办法确定内核的大小?)
内核代码何时加载到设备内存中?我猜在执行主机代码行时:
kernel<<<geom>>>(params);
对吗? 调用后代码是否保留在设备内存中?如果是这样,我可以显式卸载代码吗?
我担心的是设备内存碎片。想想大量交替的设备内存分配和内核执行(不同的内核)。然后过了一段时间设备内存变得非常稀缺。即使你释放了一些内存,内核代码仍然只留下内核之间的空间用于新的分配。这会在一段时间后导致巨大的内存碎片。这就是 CUDA 的设计方式吗?
【问题讨论】:
-
你在使用全局内存吗?全局内存将保持分配状态,直到您关闭设备或 cuda 释放它(如果它是 cudamalloc'ed)
-
内核被定义为“global”,但没有其他的。
-
这里的全局并不意味着
__global__关键字,它只是意味着在.cu 文件中的全局范围内声明的任何内容或通过cudamalloc 分配的任何内存。因此,例如,如果您在 .cu 文件中的全局范围内有int8[1024],或者如果您在没有匹配 cudaFree 的情况下调用cudaMalloc(8 * 1024),您将拥有 1KB 的显着内存占用。
标签: memory-leaks cuda