У меня возникла проблема с сохранением моей памяти графической карты после выполнения сценария 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 Спасибо.
Если ваша программа действительно завершена, контекст CUDA уничтожается, и все ресурсы, которые он использует, освобождаются. Вы уверены, что у вас нет кучи зомби или повесил экземпляры вашей программы, которые все еще работают в фоновом режиме? – talonmies
В этом была проблема, я понял, что процессы убьют себя при крахе/завершении. Я проверил системный монитор, и обнаружил, что у меня было несколько процессов из файла, который я запускал. Убив их, память GPU освободилась. Есть ли команда, которую я могу добавить в c/cuda, чтобы освободить всю память gpu при неожиданной остановке (например, ctrl + z quit, а не только в случае сбоя cudaMalloc)? Если вы сделаете это в ответ, я тоже отметю его, спасибо снова –
Вы понимаете, что ctrl-z не отправляет сигнал SIGINT или SIGTERM в процесс переднего плана, он отправляет SIGTSTP (в отличие от ctrl-c или kill). Если вы не зарегистрируете обработчик сигнала в своем приложении, чтобы поймать SIGSTP и заставить приложение выйти, он никогда не узнает, что ctrl-z когда-либо нажата (что по дизайну). Это похоже на проблему поведения пользователя, а не на программирование. – talonmies