Memory leaks clGetPlatformIDs内存泄漏

Memory leaks clGetPlatformIDs内存泄漏,memory-leaks,opencl,Memory Leaks,Opencl,我正在用NVIDIA硬件在Ubuntu12.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-am

我正在用NVIDIA硬件在Ubuntu12.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)
我甚至不知道这是可能的。这个问题能解决吗?请注意,目前没有进行特殊的去初始化——我需要在这之后调用什么吗?不要提及任何必须取消分配的内容。

关于:“检查这个:devgurus.amd.com/thread/136242。valgrind无法按设计处理定制内存分配器,OpenCL可能正在使用它”

引用给出的链接:“不在出口处释放池的行为可能被称为库的bug。”

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

如果clGetPlatformIds被设计为返回分配的内存,那么TimChild对于如何使用它会有自己的看法。然而,在阅读本文时,我并不完全相信这一点

问题中的漏洞可能严重,也可能不严重,可能会通过连续调用累积,但您可能只能选择向nvidia报告漏洞,希望他们能够修复它,或者找到不同的opencl实现进行开发。尽管如此,从valgrind的角度来看,opencl库创建对数据的引用可能还是有原因的

不幸的是,这仍然会导致内存泄漏,这是由我们无法控制的外部因素造成的,并且仍然会导致我们的输出过多

假设您完全确定自己不对此次泄漏负责(比如,我们知道一个事实,一名nvidia工程师在OpenCL.com中分配了一个随机值,所以他并不是为了激怒您才取消分配的)。Valgrind有一个标志--gen suppressions=yes,通过该标志可以抑制有关特定警告的警告,您可以使用--suppressions=$filename将其反馈给Valgrind。阅读valgrind页面了解有关其工作原理的更多详细信息


但是要非常小心使用抑制。显然,抑制错误并不能修复错误,自由使用该机制将导致抑制代码而不是nvidia或valgrind所产生的错误的情况。不要抑制那些您无法完全确定其来源的警告,或定期重新声明抑制内容。

检查此项:。valgrind无法按设计处理OpenCL可能使用的自定义内存分配器。为什么要花8个字节呢?是否存在更严重的泄漏?您没有说明如何使用clGetPlatformId()函数。计算平台数量或获取平台Id?如果您获得一个平台Id,您必须期望内存分配。那么为什么要超过8个字节呢?是否有更严重的泄漏?事实上,两者都有。大多数情况下,这只是一个哲学问题——我讨厌内存泄漏和不处理它们的程序员。此外,它的输出更多的Valgrind。那么有没有办法取消分配呢?我提出了一个错误: