2013-10-04 3 views
1

Если моя хост-программа [exit]/[segfault]/[убита], каковы соответствующие поведения в отношении разрушения контекста CUDA и соответствующих выделенных ресурсов?Разрушение контекста CUDA при завершении хоста процесса

«Поведение» Я имею в виду автоматический механизм драйвера на GPU, если я никогда не вызываю ядро ​​cudaDeviceReset в своей программе.

Я работаю под Linux, и я видел, как использование памяти в GPU постепенно возрастало в течение нескольких дней (или даже одного дня), когда я запускал код CUDA, который несколько раз заканчивался (CTRL-C) или просто segfaulting (на стороне хозяина) ...

ответ

2

Возможно, если вы правильно управляете исключениями, вы можете использовать atexit()? Exemple использования atexit() следующим образом:

void ExitFunction() { 
    cudaDeviceReset(); 
} 

int main(...) { 
    atexit(ExitFunction); 
    ... 
    return 0; 
} 
2

Все ассигнования на устройстве инкапсулируются в CUDA context. При использовании API среды выполнения контексты CUDA: created automatically «под капотом».

Когда приложение выходит, независимо от того, каким образом, контекст (и любые связанные с ним распределения, которые инкапсулированы внутри), должен быть уничтожен.

Если вы испытываете небольшие изменения в свободной памяти после различных событий, это может быть просто тот факт, что драйвер выделяет дополнительное пространство для собственного использования для внутренних задач по ведению домашнего хозяйства. (Драйвер сродни операционной системе для устройства.) Если вы испытываете «большие» изменения в свободной памяти после различных событий выхода приложения, то я бы сказал, что что-то не так, но поскольку ваш вопрос не дает никаких подробностей или сведений о том, как чтобы воспроизвести его, я не уверен, что еще можно сказать.

Если вы хотите, чтобы заставить водителя «сбросить» извне, вы можете попробовать выгрузки драйвера через:

sudo rmmod nvidia 
sudo nvidia-smi -a 

И ваша свободная память должна вернуться к «нормальной».