使用巨大的静态数组运行内核后,CUDA cudaMalloc失败了

时间:2013-11-19 18:19:16

标签: c++ c cuda static-array

我有一个使用大约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 */);
}

1 个答案:

答案 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