gpt4 book ai didi

c++ - CUDA cudaMalloc 在运行具有巨大静态数组的内核后失败

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:19 31 4
gpt4 key购买 nike

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

我发现在运行完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 */);
}

最佳答案

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

    // my_array is still occupying memory are this point

此时调用 cudaMemGetInfo() 可以更加确定。

不过,您遇到的可能是某种内存碎片。

我所知道的“清理历史”的唯一方法是在此时调用 cudaDeviceReset() 。但是,这会终止所有操作以及 GPU 上的任何分配,因此您应该只在 GPU 没有其他事件时才执行此操作,并且您必须在调用 cudaDeviceReset() 后重新分配所需的任何 GPU 数据.

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

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

关于c++ - CUDA cudaMalloc 在运行具有巨大静态数组的内核后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20079046/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com