【问题标题】:Why is this line of code leaks memory?为什么这行代码会泄漏内存?
【发布时间】:2011-10-21 20:10:55
【问题描述】:

我在我的项目中发现了一行代码泄漏了内存。这是一个 DllImport 方法:

[DllImport("OpenCL")] public static extern Error clEnqueueNDRangeKernel(OpenCLCommandQueue command_queue, OpenCLKernel kernel, Int32 work_dim, [In] IntPtr[] global_work_offset, [In] IntPtr[] global_work_size, [In] IntPtr[] local_work_size, Int32 num_events_in_wait_list, [In] OpenCLEvent[] event_wait_list, out OpenCLEvent e);

使用以下代码调用它:

OpenCLEvent e;

OpenCLDriver.clEnqueueNDRangeKernel(CommandQueue.OpenCLCommandQueue, OpenCLKernel, globalWorkSize.Length, globalWorkOffset, globalWorkSize, localWorkSize, eventWaitList.Count, eventWaitList.OpenCLEventArray, out e);

return null;

CommandQueue.OpenCLCommandQueue 等参数都是普通的属性或变量,不会泄露内存,后面没有代码。

我不明白 clEnqueueNDRangeKernel 怎么会调用泄漏内存?我错过了什么吗?

【问题讨论】:

  • 你怎么知道它在泄漏内存?
  • 我查看了 taskmgr,它显示大约 10 mb/sec 的分配。在五分钟内,程序会分配大约 2 GB 的内存,然后如果您注释掉“OpenCLDriver.clEnqueueNDRangeKernel”一切正常
  • 一个重要的问题是它是否泄漏了托管或非托管内存。
  • 我认为它不能被管理,它会被 GC'ed

标签: c# .net debugging memory-leaks


【解决方案1】:

OpenCL 中似乎存在内存泄漏问题,clEnqueueNDRangeKernel 自 2009 年以来已知,2010 年修复...

http://www.opentk.com/node/1541?page=3
http://forums.amd.com/devforum/messageview.cfm?catid=390&threadid=122161&highlight_key=y

【讨论】:

  • 你的链接不是关于不同的问题吗?在我看来,第一个是关于包装器中的错误,第二个是关于 amd 库中的错误。
  • true - 但两者都会导致内存泄漏......因为我对 OPs 案例的了解不够,所以我发布了两个......
  • 嘿,我的问题和 CLOO 的问题一样,opencl 在 OpenCLEvent 后面分配了额外的内存,应该释放谢谢!!!!
【解决方案2】:

你可以添加

clFinish(CommandQueue);

之后

clEnqueueNDRangeKernel

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2016-04-12
    • 2013-04-27
    相关资源
    最近更新 更多