4

我正在使用 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)

我不知道这甚至是可能的。这可以解决吗?请注意,目前没有进行特殊的取消初始化——在这之后我需要调用一些东西吗?文档没有提到必须释放任何东西。

4

1 回答 1

3

关于:“检查一下:devgurus.amd.com/thread/136242。valgrind 无法通过设计处理自定义内存分配器,OpenCL 可能会使用它”

从给出的链接中引用:“虽然在出口处不释放池的行为可以称为库的错误。”

如果您想创建一个内存池并从中分配,请继续;但你仍然应该正确地释放它。整个内存池的复杂性不亚于常规内存引用的复杂性,并且至少应该得到与常规引用相同的关注,如果不是更多的话。此外,8 字节结构不太可能是内存池。

如果 clGetPlatformIds 旨在返回分配的内存,Tim Child 会对您如何使用它有所了解。但是,阅读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。不要压制您不确定它们来自何处的警告,或定期重申您的压制。

于 2013-05-14T20:31:47.350 回答