我有一个使用大约2GB本地内存的内核。如果我之前运行cudaMalloc
,那么尝试分配2.5GB内存的kernel_func
会失败。
我发现在完成kernel_func
运行后仍然占用2GB内存,而cudaMalloc
只留下1.5GB内存。有没有人有解决方案或解释?
我知道使用kernel_func
的全局内存可以解决问题,但由于某种原因,我需要使用本地内存来处理那个巨大的本地静态数组。
__global__ kernel_func() {
// The huge static array goes here
short my_array[50000];
}
int main() {
kernel_func<<<64, 128>>>();
// my_array is still occupying memory are this point
// This cudaMalloc will fail with insufficient memory
cudaMalloc(/* 2.5GB data */);
}
答案 0 :(得分:3)
如果您允许kernel_func
完成(例如使用cudaDeviceSynchronize()
),那么我怀疑my_array
仍在“占用内存”,正如您所建议的那样,在内核完成后,即这点评论的意思:
// my_array is still occupying memory are this point
您可以更确定地呼叫cudaMemGetInfo()。
尽管如此,你可能正在遇到的是某种内存碎片。
我知道“清理平板”的唯一方法就是在此时拨打cudaDeviceReset()
。但是,这会杀死任何操作以及GPU上的任何分配,因此您应该只在没有其他GPU活动时执行此操作,并且必须在调用{{}之后重新分配所需的任何GPU数据。 {1}}。
当然,如果您可以使用cudaDeviceReset()
来安排分配,那可能会更容易。
请注意,cudaMalloc
本身不足以将GPU恢复到正常的功能行为。为了实现这一点,“拥有”过程也必须终止。见here。