2015-04-06 2 views
0

У меня возникла проблема с сохранением моей памяти графической карты после выполнения сценария CUDA (даже с использованием cudaFree()).Память GPU не освобождается после выполнения сценария CUDA

При загрузке общая используемая память составляет около 128 МБ, но после запуска скрипта выполняется неполное выполнение памяти.

-см NVIDIA:

+------------------------------------------------------+      
| NVIDIA-SMI 340.29  Driver Version: 340.29   |      
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 GeForce GTX 660 Ti Off | 0000:01:00.0  N/A |     N/A | 
| 10% 43C P0 N/A/N/A | 2031MiB/2047MiB |  N/A  Default | 
+-------------------------------+----------------------+----------------------+ 

+-----------------------------------------------------------------------------+ 
| Compute processes:            GPU Memory | 
| GPU  PID Process name          Usage  | 
|=============================================================================| 
| 0   Not Supported            | 
+-----------------------------------------------------------------------------+ 

Есть ли способ, чтобы освободить эту память обратно без перезагрузки, возможно, команды терминала?

Также это нормальное поведение, если я неправильно управляю своей памятью в сценарии CUDA или эта память автоматически освобождается, когда скрипт останавливается/прекращается?

Thanks Спасибо.

+2

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

+0

В этом была проблема, я понял, что процессы убьют себя при крахе/завершении. Я проверил системный монитор, и обнаружил, что у меня было несколько процессов из файла, который я запускал. Убив их, память GPU освободилась. Есть ли команда, которую я могу добавить в c/cuda, чтобы освободить всю память gpu при неожиданной остановке (например, ctrl + z quit, а не только в случае сбоя cudaMalloc)? Если вы сделаете это в ответ, я тоже отметю его, спасибо снова –

+1

Вы понимаете, что ctrl-z не отправляет сигнал SIGINT или SIGTERM в процесс переднего плана, он отправляет SIGTSTP (в отличие от ctrl-c или kill). Если вы не зарегистрируете обработчик сигнала в своем приложении, чтобы поймать SIGSTP и заставить приложение выйти, он никогда не узнает, что ctrl-z когда-либо нажата (что по дизайну). Это похоже на проблему поведения пользователя, а не на программирование. – talonmies

ответ

6

API-интерфейс CUDA runtime API автоматически регистрирует функцию разрыва, которая уничтожит контекст CUDA и освободит все ресурсы графического процессора, которые использовала приложение. До тех пор, пока приложение неявно или явно вызовет exit(), никакое дальнейшее действие пользователя не потребует бесплатных ресурсов, таких как память GPU.

Если вы обнаружите, что память не отображается при запуске кода CUDA, тогда обычный подозреваемый приостанавливается или выполняет фоновый код того или иного кода, который никогда не вызывал exit() и никогда не уничтожал их контекст. Это было причиной в этом случае.

NVIDIA действительно предоставляет функцию API cudaDeviceReset, которая инициирует разрушение контекста во время вызова. Обычно не обязательно использовать эту функцию в хорошо разработанном коде CUDA, скорее вы должны попробовать и убедиться, что в вашей программе есть чистый exit() или обратный путь от main(). Это гарантирует, что обработчик уничтожения контекста, который вызывается библиотекой времени выполнения, и ресурсы будут освобождены.

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

  • Нет связанных вопросов^_^