我发现了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;
}
答案 0 :(得分:1)
根据我的经验,一旦你在CUDA执行中遇到这种错误,所有后续操作都将失败,直到你重置设备。文档指出内存范围限定为CUDA上下文,因此当您销毁上下文(通过重置设备)时,内存将被释放。