Я работаю с устройством cuda на интеграционной ветке, и у меня все еще есть некоторый segfault, пока я заканчиваю свою работу.Как избежать утечки памяти на segfault с помощью Cuda
После каждого краха потребление памяти увеличивается на 500 Мо (видно, используя free -m
, htop
и еще одно, но я не помню названия). Эта память никогда не выпускается на этом компьютере с 4Go оперативной памяти, поэтому мне приходится перезагружаться после некоторых сбоев, в то время как обмен памяти происходит, и это действительно очень медленно (как обычно, когда происходит обмен памяти).
Я знаю, что хороший ответ: «Исправьте свой segfault !!» но я хотел бы понять, почему такое поведение происходит и как я могу его предотвратить.
Я прочитал, что память CUDA должна быть выпущена ОС на segfault, и похоже, что нет.
В то время как я пытался отлаживать свою программу, я замечаю, что если я исправляю segfault, память свободна, но если я также прокомментирую линию выпуска cuda: cudaFreeHost(buf)
(с фиксированным segfault), у меня все еще есть утечка памяти ,
. Память выделена как прикрепленные страницы: cudaHostAlloc(&ret, n*sizeof(my_struct), cudaHostAllocPortable)
.
Я хотел удостовериться, что «бесплатный» код вызывается с использованием unique_ptr
, но это не решит проблему с segfault.
Я посмотрел на постоянный режим для CUDA: http://docs.nvidia.com/deploy/driver-persistence/index.html, но он отключен на моем компьютере (я проверил его с nvidia-smi
).
Я попытался сбросить устройство cuda: nvidia-smi -r
, но он сказал, что он не поддерживается на моем компьютере.
Вопросы являются:
- Как мы можем задать программу (или ОС), чтобы освободить эти ресурсы в конце программы?
- Если мы не можем, существует ли команда для восстановления этих ресурсов после сбоя?
Версия:
CUDA 6.0.1
GCC 4.9.2
Driver Версия: 340,65
карта: GeForce 610M
Update:
Вот пример кода, чтобы воспроизвести проблему. С прокомментированной строкой я пропущу 10 мо за ход.
#include <cuda.h>
#include <cuda_runtime.h>
int main() {
int *ret;
cudaHostAlloc(&ret, 10000000 * sizeof(*ret), cudaHostAllocPortable);
//cudaFreeHost(ret);
return 0;
}
Update 2:
total used free shared buffers cached
Mem: 3830056 1487156 2342900 66336 142840 527088
-/+ buffers/cache: 817228 3012828
Swap: 7811068 0 7811068
1Erreur de segmentation
2Erreur de segmentation
3Erreur de segmentation
4Erreur de segmentation
5Erreur de segmentation
6Erreur de segmentation
7Erreur de segmentation
8Erreur de segmentation
9Erreur de segmentation
10Erreur de segmentation
11Erreur de segmentation
12Erreur de segmentation
13Erreur de segmentation
14Erreur de segmentation
15Erreur de segmentation
16Erreur de segmentation
17Erreur de segmentation
18Erreur de segmentation
19Erreur de segmentation
20Erreur de segmentation
total used free shared buffers cached
Mem: 3830056 1766580 2063476 64152 142860 531032
-/+ buffers/cache: 1092688 2737368
Swap: 7811068 0 7811068
Не могли бы вы разместить короткий пример воспроизведения, который иллюстрирует очевидную утечку памяти? Я не уверен, что ваш диагноз о том, что происходит здесь, является правильным, и может быть, вы неправильно истолковываете то, что происходит. Кроме того, вы используете двухлетний инструментарий CUDA и годовой драйвер. Рассматривали ли вы обновление, чтобы узнать, одинаково ли поведение? – talonmies
Я добавил пример кода для воспроизведения. Я согласен, версия CUDA должна быть актуальной, но у меня не было времени для этой миграции. Я могу/попытаюсь сделать это, чтобы увидеть, произойдет ли это снова. –
Я запустил ваш код 1000 раз в оболочном цикле на 64-битной системе с 16 ГБ оперативной памяти с драйвером 352,39 и временем работы CUDA 6 и вообще не наблюдал утечки памяти. Я не знаю, что происходит с вашим кодом или вашей системой, но CUDA не теряет память хоста при выходе так, как вы предлагаете. – talonmies