0

我有一个使用大约 2GB 本地内存的内核。如果我之前运行它,我cudaMalloc尝试分配 2.5GB 内存的方法会失败kernel_func

跑完发现还有2GB内存被占用kernel_func,我的cudaMalloc. 有没有人有解决方案或解释?

我知道使用全局内存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 */);
}
4

1 回答 1

3

如果您允许kernel_func完成(例如使用cudaDeviceSynchronize()),那么我怀疑my_array在内核完成后仍然是“占用内存”,即在此评论点:

    // my_array is still occupying memory are this point

那时您可以通过调用cudaMemGetInfo()更加确定。

尽管如此,您所遇到的可能是某种内存碎片。

我所知道的“清白”的唯一方法就是cudaDeviceReset()在那一点上打电话。但是,这将杀死 GPU 上的任何操作以及任何分配,因此您应该只在 GPU 没有其他活动时才执行此操作,并且您必须在调用cudaDeviceReset().

当然,如果您可以改为使用cudaMalloc来安排分配,那可能会更容易。

请注意,cudaDeviceReset()仅靠其本身不足以将 GPU 恢复到正确的功能行为。为了实现这一点,“拥有”过程也必须终止。见这里

于 2013-11-19T18:53:24.717 回答