在内核执行错误后释放内存时CUDA失败

时间:2011-05-27 13:39:50

标签: free cuda

我发现了CUDA的怪异行为。在我的内核中遇到段错后,我试图释放先前分配的内存,但它失败了。 CUDA会自动完成吗?我的意思是,在内核执行期间,CUDA会在segfault之后释放内存吗?

以下是重现我情况的代码。我已经在CUDA 4.0,4.0rc2和3.2

上测试过了
#include <cassert>

__global__ void segfault(){
    int* null = NULL;
    *null = 0;
}

int main() {
    int* i;
    assert (cudaSuccess ==  cudaHostAlloc(&i, sizeof(int)*100, cudaHostAllocMapped));
    segfault<<<1,100>>>();
    assert (cudaErrorLaunchFailure == cudaThreadSynchronize());
    assert (cudaErrorLaunchFailure == cudaGetLastError());
    assert (cudaSuccess == cudaGetLastError());
    assert (cudaSuccess == cudaFreeHost(i));
    return 0;
}

1 个答案:

答案 0 :(得分:1)

根据我的经验,一旦你在CUDA执行中遇到这种错误,所有后续操作都将失败,直到你重置设备。文档指出内存范围限定为CUDA上下文,因此当您销毁上下文(通过重置设备)时,内存将被释放。