В проекте я использую библиотеку nvml для получения информации о графическом процессоре в системе. Я использую его для запроса имени графического процессора и UUID графического процессора. Это происходит циклично от 6 до 8 раз в минуту. Я заметил небольшую утечку памяти, которая через несколько часов приводит к сбою моего приложения. Я использую nvml для запроса имени устройства графического процессора следующим образом:
nvmlReturn_t result = nvmlInit();
nvmlDevice_t device;
result = nvmlDeviceGetHandleByIndex(deviceNum, &device);
char nameBuffer[NVML_DEVICE_NAME_BUFFER_SIZE];
result = nvmlDeviceGetName(device, nameBuffer, NVML_DEVICE_NAME_BUFFER_SIZE);
result = nvmlShutdown();
Но даже если я изменю код, просто запустив и выключив nvml, используемая память все равно постоянно увеличивается:
nvmlReturn_t result = nvmlInit();
// nvmlDevice_t device;
// result = nvmlDeviceGetHandleByIndex(deviceNum, &device);
// char nameBuffer[NVML_DEVICE_NAME_BUFFER_SIZE];
// result = nvmlDeviceGetName(device, nameBuffer, NVML_DEVICE_NAME_BUFFER_SIZE);
result = nvmlShutdown();
Правильно ли я использую API или что-то не так? Есть ли известная проблема в библиотеке nvml?
Информация о системе:
ОС: Windows 10
Драйвер NVIDIA: 536.40
Куда: 12,2
Я создал простой файл C, который просто вызывает nvmlInit()
и nvmlShutdown()
в цикле. Я не вижу разницы в использовании памяти между 100, 1000 или 10 000 итерациями.
@Homer512 Homer512, возможно, это зависит от версии драйвера/библиотеки. Какую ОС вы использовали для тестирования? Я использую Windows 10.
@talonmies Я согласен. Но на данный момент я не уверен, нашел ли я ошибку. Возможно, это просто мое неправильное использование.
Я использую Linux с cuda-12.3.2 и драйвером 550.78. Вероятно, немного старше того, что у вас есть
Я добавил информацию об ОС, драйвере Nvidia и версии cuda, чтобы задать вопрос. @Homer512 Homer512 моя версия cuda и драйвер немного старше вашей.
Есть ли конкретная причина, по которой вы вызываете инициализацию и завершение работы каждый раз, а не только один раз?
Да. Это часть dll, работающая как плагин в программном обеспечении, которым я не управляю. При каждом вызове он загружает движок tensorrt из файла. После загрузки он проверяет, соответствует ли графический процессор системы тому, на котором был построен движок.
Дальнейшие тесты сегодня показали, что существует проблема с драйвером nvidia 536.x. Более подробный ответ напишу позже.
Вот простое решение проблемы:
Я тестировал с помощью простого файла c от Homer512 из комментариев (просто запускаем и выключаем nvml в цикле). Со временем тестовой системе не хватило памяти.
Затем я обновил драйвер Nvidia до последней версии (556.12). Кажется, это решает проблему.
Если вы считаете, что нашли ошибку, лучше сообщить об этом непосредственно NVIDIA, чем задавать вопрос здесь. Конечно, вам потребуется предоставить гораздо больше информации (ОС, версия драйвера, компилятор, минимальный воспроизводимый пример и т. д.), чем вы это сделали здесь.