CUDADeviceSet导致内存泄漏?
我用cuda 7.0尝试了以下代码 如果我将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 有人能告诉我这里的问题是
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是否允许调用两次?或者它会引起问题吗?你看过这个例子了吗?我发布了我使用的全部代码和输出。