2015-07-12 7 views
-2

Я пробовал следующий код с cuda 7.0.cudaDeviceReset вызывает утечку памяти?

Если бы я установил 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

Я не конечно, если это может быть здесь. Если вы создаете объект (например, буфер), для которого деструктор вызывается из-за пределов, чтобы освободить ресурсы, вызов 'cudaDeviceReset()' внутри той же области может вызвать проблему. См. Комментарий к [этой записи] (http://stackoverflow.com/q/11608350/2386951). – Farzad

+1

В чем проблема? Предположительно, ваш вопрос на самом деле о 'cublasCreate', вызывающем segfault, если вызывается дважды? В этом случае утечка памяти, вероятно, не имеет значения. Есть много абсолютно безопасных фрагментов кода, которые генерируют ложные срабатывания в шагах, таких как valgrind. – talonmies

+1

Когда я запускаю вашу программу на CUDA 7.0 или CUDA 7.5RC на linux, каждое возвращаемое значение статуса API равно нулю. Какую версию CUDA вы используете? Мой пример: [здесь] (http://pastebin.com/WBp67RVx). –

ответ

1

У меня был такая же проблема, даже на примере Роберта Crovella, Cuda 7 убунт 14.04, K40c

Добавления cudaDeviceSynchronize() после cudaSetDevice и перед cublasCreate() сделал работу для меня

Смежные вопросы