【问题标题】:CUDA fails when freeing memory after kernel execution error内核执行错误后释放内存时 CUDA 失败
【发布时间】:2011-05-27 13:39:50
【问题描述】:

我发现了 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;
}

【问题讨论】:

标签: free cuda


【解决方案1】:

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

【讨论】:

  • 所以我用cudaGetLastError两次重置了segfault的错误,是不是不够?
  • 我认为你必须销毁并重新创建 CUDA 上下文,正如 Edric 所写。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 2013-07-15
  • 2014-11-17
  • 2015-01-27
  • 2021-05-15
  • 1970-01-01
  • 2012-12-16
相关资源
最近更新 更多