clGetPlatformIDs内存泄漏

时间:2013-02-21 23:15:59

标签: memory-leaks opencl

我正在使用NVIDIA硬件在Ubuntu 12.04上测试我的代码。

没有实际的OpenCL处理;但我的初始化代码仍在运行。此代码调用clGetPlatformIDs。但是,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没有提到任何关于必须解除分配的事情。

1 个答案:

答案 0 :(得分:3)

关于:"请查看:devgurus.amd.com/thread/136242。 valgrind无法按设计处理自定义内存分配器,OpenCL可能会使用"

引用给出的链接:"不要在出口处释放池的行为可以称为库的错误。"

如果你想创建一个内存池并从中进行分配,请继续;但你还是应该正确地解除分配。整个内存池的复杂性与常规内存引用的复杂性相比并不复杂,并且至少应该引起与常规引用相同的注意,如果不是更多的话。此外,8字节结构不太可能是内存池。

如果设计用于返回已分配的内存,Tim Child会对如何使用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,你可以使用它来抑制有关特定警告的警告,你可以使用--suppressions = $ filename反馈给valgrind。阅读valgrind页面,了解有关其工作原理的更多详细信息。

尽管对使用抑制措施非常谨慎。显然,抑制错误并不能解决这些错误,并且机制的自由使用会导致您抑制代码所产生的错误,而不是nvidia或valgrind。不要压制你不完全确定他们来自哪里的警告,或者经常重申你的压制。