Я пробовал следующий код с 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());
}
Я не конечно, если это может быть здесь. Если вы создаете объект (например, буфер), для которого деструктор вызывается из-за пределов, чтобы освободить ресурсы, вызов 'cudaDeviceReset()' внутри той же области может вызвать проблему. См. Комментарий к [этой записи] (http://stackoverflow.com/q/11608350/2386951). – Farzad
В чем проблема? Предположительно, ваш вопрос на самом деле о 'cublasCreate', вызывающем segfault, если вызывается дважды? В этом случае утечка памяти, вероятно, не имеет значения. Есть много абсолютно безопасных фрагментов кода, которые генерируют ложные срабатывания в шагах, таких как valgrind. – talonmies
Когда я запускаю вашу программу на CUDA 7.0 или CUDA 7.5RC на linux, каждое возвращаемое значение статуса API равно нулю. Какую версию CUDA вы используете? Мой пример: [здесь] (http://pastebin.com/WBp67RVx). –