CUDADeviceSet导致内存泄漏?

CUDADeviceSet导致内存泄漏?,cuda,Cuda,我用cuda 7.0尝试了以下代码 如果我将n\u repeat设置为1并删除最后一个cudadeviceset,代码运行正常 如果我将n\u repeat设置为1并保持cudadeviceset,我可以在接近末尾时运行代码段,但在运行程序后,我的内存泄漏检测器检测到内存泄漏 如果我将n\u repeat设置为2并保留cudadeviceset,我在第二次到达cublasCreate时出错。错误代码为CUBLAS\u STATUS\u NOT\u INITIALIZED 有人能告诉我这里的问题是

我用cuda 7.0尝试了以下代码

如果我将
n\u repeat
设置为1并删除最后一个
cudadeviceset
,代码运行正常

如果我将
n\u repeat
设置为1并保持
cudadeviceset
,我可以在接近末尾时运行代码段,但在运行程序后,我的内存泄漏检测器检测到内存泄漏

如果我将
n\u repeat
设置为2并保留
cudadeviceset
,我在第二次到达
cublasCreate
时出错。错误代码为
CUBLAS\u STATUS\u NOT\u INITIALIZED

有人能告诉我这里的问题是什么,是
cudaDeviceReset
,以便在不同的GPU运行之间进行清理,就像我在这里尝试做的那样

int device_id_ = 0;
cublasHandle_t blas_;
curandGenerator_t rand_gen_;
long alloc_size = 1000;
char* raw_;
int n_repeat = 2;

for (int i = 0; i < n_repeat; ++i) {
  CHECK_CUDA(cudaSetDevice(device_id_));
  CHECK_CUDA(cublasCreate(&blas_));
  CHECK_CUDA(curandCreateGenerator(&rand_gen_, CURAND_RNG_PSEUDO_DEFAULT));
  CHECK_CUDA(cudaMalloc((void **)&raw_, alloc_size));
  CHECK_CUDA(curandDestroyGenerator(rand_gen_));
  CHECK_CUDA(cublasDestroy(blas_));
  CHECK_CUDA(cudaFree(raw_));

  CHECK_CUDA(cudaDeviceReset());
}
int设备的id=0;
古巴圣母院;
馆长、发电机和发电机;
长alloc_尺寸=1000;
字符*原始字符;
int n_repeat=2;
对于(int i=0;i
我也有同样的问题,即使是Robert Crovella的例子,cuda 7 ubuntu 14.04,K40c


cudaSetDevice
之后和
cublasCreate()
之前添加
cudaDeviceSynchronize()
使它对我起了作用

我不确定这里是否会出现这种情况。如果您创建了一个对象(例如缓冲区),在该对象超出范围时调用析构函数以释放资源,那么在同一范围内调用
cudaDeviceReset()
可能会导致问题。请看评论。这里的实际问题是什么?假设您的问题实际上是关于
cublasCreate
如果调用两次会导致segfault?在这种情况下,内存泄漏可能与此无关。在valgrind这样的检查器中,有许多非常安全的代码会产生误报。当我在CUDA 7.0或linux上的CUDA 7.5RC上运行您的程序时,每个API状态返回值都是零。您使用的CUDA版本是什么?我的例子是。@talonmes:cublasCreate是否允许调用两次?或者它会引起问题吗?你看过这个例子了吗?我发布了我使用的全部代码和输出。