问题描述
|
我发现CUDA的行为异常。在内核中出现段错误后,我试图释放先前分配的内存,但它失败了。 CUDA会自动执行吗?我的意思是,内核执行段错误后CUDA是否释放内存?
这是重现我的情况的代码。我已经在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;
}
解决方法
以我的经验,一旦您在CUDA执行中遇到此类错误,所有后续操作都将失败,直到您重置设备。文档指出该内存的作用域为CUDA上下文,因此当您破坏该上下文(通过重置设备)时,该内存将被释放。