2013-02-21 2 views
4

Я тестирую свой код на Ubuntu 12.04 с оборудованием NVIDIA.clGetPlatformIDs Утечка памяти

Фактическая обработка OpenCL не выполняется; но мой код инициализации все еще запущен. Этот код вызывает clGetPlatformID. Однако Valgrind сообщает об утечке памяти:

==2718== 8 bytes in 1 blocks are definitely lost in loss record 4 of 74 
==2718== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2718== by 0x509ECB6: ??? (in /usr/lib/nvidia-current/libOpenCL.so.1.0.0) 
==2718== by 0x50A04E1: ??? (in /usr/lib/nvidia-current/libOpenCL.so.1.0.0) 
==2718== by 0x509FE9F: clGetPlatformIDs (in /usr/lib/nvidia-current/libOpenCL.so.1.0.0) 

Я не знал, что это было возможно. Можно ли это исправить? Обратите внимание: никакой специальной деинициализации в настоящее время не происходит - нужно ли мне что-то называть после этого? docs ничего не упоминает о необходимости освобождать что-либо.

+0

Проверьте это: http://devgurus.amd.com/thread/136242. valgrind не может обрабатывать специализированные распределители памяти по дизайну, которые, вероятно, использует OpenCL. – Thomas

+0

Зачем потеть более 8 байт? есть ли более значительная утечка? –

+0

Вы не говорите, как вы используете функцию clGetPlatformId(). Чтобы подсчитать количество платформ или получить идентификатор платформы? Если вы получаете идентификатор платформы, вы должны ожидать выделения памяти. Итак, зачем потеть более 8 байт? Есть ли более значительная утечка? –

ответ

3

о: «Проверьте это:. Devgurus.amd.com/thread/136242 Valgrind не может иметь дело с распределителями пользовательской памяти по дизайну, который OpenCL, скорее всего, с использованием»

цитатой из ссылки Дано: « поведение не для свободных пулов на выходе можно было бы назвать ошибкой библиотеки ».

Если вы хотите создать пул памяти и выделить из него, то вперед; но вы все равно должны должным образом освободить его. Сложность пула памяти в целом не менее сложна, чем сложность регулярной ссылки на память и заслуживает хотя бы того же внимания, если не больше, а затем регулярных ссылок. Кроме того, 8-байтовая структура вряд ли будет пулом памяти.

У Тима Ребенка будет точка о том, как вы используете clGetPlatformIds, если он был предназначен для возврата выделенной памяти. Однако, прочитав http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetPlatformIDs.html, я недостаточно убежден, что это должно быть так.

Возможно, утечка может быть серьезной, может накапливаться или не накапливаться путем последовательных вызовов, но вам может быть предоставлена ​​возможность сообщить об ошибке в nvidia в надежде, что они исправят ее или найдут другой opencl реализации для развития. Тем не менее, могут быть причины, по которым библиотека opencl создает ссылки на данные, которые с точки зрения valgrind не используются.

К сожалению, это все еще оставляет нас с утечкой памяти, вызванной внешним фактором, который мы не можем контролировать, и это все равно оставляет нас с избыточным выходом valgrind.

Скажите, что вы достаточно уверены, что не несёте ответственность за эту утечку (скажем, мы знаем, что инженер nvidia выделил случайное значение в OpenCL.so, которое он не освободил, чтобы злить вас). Valgrind имеет флаг -gen-suppressions = yes, с помощью которого вы можете подавлять предупреждения о конкретных предупреждениях, которые вы можете вернуть к valgrind, используя -suppressions = $ filename. Прочтите страницу valgrind для получения более подробной информации о том, как она работает.

Будьте очень осторожны при использовании подавлений. Очевидно, что подавление ошибок не устраняет их, и либеральное использование механизма приведет к ситуациям, когда вы подавляете ошибки, сделанные вашим кодом, а не nvidia или valgrind. Не подавляйте предупреждения, о которых вы не совсем уверены в том, откуда они пришли, или регулярно подтверждаете свои подавления.

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