【问题标题】:Should i orphan OpenCL buffers?我应该孤立 OpenCL 缓冲区吗?
【发布时间】:2011-01-23 21:32:01
【问题描述】:

OpenGL 中,经常使用孤立缓冲区是一种常见的做法。理想情况下,驱动程序会注意到请求了相同大小的缓冲区,如果不再需要,则尽可能返回旧缓冲区。缓冲区仅在旧缓冲区仍在使用且无法重用时分配新内存。

OpenCL 中(在使用最新开发者驱动程序的 NVIDIA 硬件上)我不确定这项技术。我得到了一个 256kB 的缓冲区,由我经常重新分配的 c++ 包装器引用计数处理。大多数情况下,这可以正常工作,但在某些情况下,OpenCL 在分配新缓冲区时会引发 CL_OUT_OF_MEMORY 错误。

您认为我应该改变我的方法吗(例如,使用恒定数量的缓冲区)?还是我应该调查导致此问题的其他可能原因?

亲切的问候, 弗洛里安

【问题讨论】:

    标签: opengl opencl


    【解决方案1】:

    OpenCL 使用 C 语义进行内存分配和释放。因此,它不会自动重用缓冲区。您必须显式释放缓冲区并稍后分配新缓冲区。或者,手动重用缓冲区似乎是一种好习惯。分配可能是一项非常昂贵的操作。

    【讨论】:

    • 我不确定。 OpenCL 使用 C 语义,但继承了 OpenGL 的一些属性和技术。使用 cpp 包装库 (cl.hpp) 分配和重新分配将如下所示: // init cl::Buffer b = cl::Buffer(attribs); // reinit b = cl::Buffer(other attribs) ... 现在包装器正在执行重新分配工作...但是 OpenCL 实现必须有自己的内存管理。这可以重复使用相同大小的缓冲区。
    • 如果你像这样“重新初始化”一个缓冲区,就会造成内存泄漏。这不会重新初始化,而是创建另一个缓冲区并丢失对前一个缓冲区的引用。丢失引用并不意味着它会被释放或重用!不要这样做。
    • 很抱歉不同意你的观点,但是 c++ OpenCL 包装器实现了一个引用计数系统,当 c++ 对象被破坏时释放 OpenCL 资源。
    • 是的,你是对的 - 我忘了这是 C++。 :) 但是,我的第一点仍然存在:OpenCL 不会隐式重用内存。这只能在它发布后发生。如果该版本发生在引用计数或类似情况下,则无关紧要。如果您分配类似大小的缓冲区,OpenCL 实现可能返回相同的内存块,但这是特定于实现的细节。
    • 好的...我已经更改了代码以重用内存...但我猜如果供应商实现 OpenGL 来重用内存,他们将以相同的方式实现 OpenCL
    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 2023-03-21
    • 1970-01-01
    • 2013-02-21
    • 2016-04-17
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多