我用cuda 7.0尝试了以下代码。
如果我将n_repeat
设置为1并删除最后一个cudaDeviceReset
,则代码运行正常。
如果我将n_repeat
设置为1并保留cudaDeviceReset
,我可以将代码段运行到最后但是在运行程序后我的内存泄漏检测器检测到内存泄漏。
如果我将n_repeat
设置为2并保留cudaDeviceReset
,则在第二次到达cublasCreate
时出现错误。错误代码为CUBLAS_STATUS_NOT_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());
}
答案 0 :(得分:1)
我遇到了同样的问题,即使是Robert Crovella的例子,cuda 7 ubuntu 14.04,K40c
在cudaDeviceSynchronize()
之后和cudaSetDevice
之前添加cublasCreate()
使其适用于我