Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 我应该孤立OpenCL缓冲区吗?_Opengl_Opencl - Fatal编程技术网

Opengl 我应该孤立OpenCL缓冲区吗?

Opengl 我应该孤立OpenCL缓冲区吗?,opengl,opencl,Opengl,Opencl,在OpenGL中,孤立经常使用的缓冲区是一种常见做法。理想情况下,驱动程序会注意到请求了相同大小的缓冲区,如果可能的话,会在不再需要时返回旧的缓冲区。只有当旧缓冲区仍在使用且无法重用时,缓冲区才会分配新内存 在OpenCL中(在使用最新开发人员驱动程序的NVIDIA硬件上),我不确定这项技术。我得到了一个256kb的缓冲区,它是由C++包装器重新计算的,我经常重新分配它。大多数情况下,这很好,但在某些情况下,OpenCL会在分配新缓冲区时抛出CLOUT of MEMORY错误 你认为我应该改变我

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

在OpenCL中(在使用最新开发人员驱动程序的NVIDIA硬件上),我不确定这项技术。我得到了一个256kb的缓冲区,它是由C++包装器重新计算的,我经常重新分配它。大多数情况下,这很好,但在某些情况下,OpenCL会在分配新缓冲区时抛出CLOUT of MEMORY错误

你认为我应该改变我的方法吗(例如使用固定数量的缓冲)?或者我应该调查这个问题的其他可能原因吗

亲切问候,,
Florian

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

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

我对此不确定。OpenCL使用C语义,但继承了OpenGL的一些属性和技术。使用cpp包装库(cl.hpp)分配和重新分配将如下所示://init cl::Buffer b=cl::Buffer(attribs);//reinit b=cl::缓冲区(其他属性)。。。现在包装器正在进行重新分配工作。。。但是OpenCL实现必须有自己的内存管理。这可能会重复使用相同大小的缓冲区。如果你“重新控制”这样的缓冲区,你就是在制造内存泄漏。这不会重新生成,但会创建另一个缓冲区,并丢失对前一个缓冲区的引用。丢失引用并不意味着它将被释放或重新使用!不要这样做。抱歉,不同意你,但是C++ opnl包装器实现了一个REF计数系统,当C++对象被破坏时,它释放OpenCL资源。是的,你说的对,我忘记了这是C++。然而,我的第一点仍然是:OpenCL并没有隐式地重用内存。这只能在发布后发生。如果该释放与引用计数或类似情况一起发生,则无所谓。如果分配大小相似的缓冲区,OpenCL实现可能会返回相同的内存块,但这是一个特定于实现的细节。确定。。。我已更改代码以重用内存。。。但我猜,如果供应商实现OpenGL以重用内存,他们将以同样的方式实现OpenCL,我对此不确定。OpenCL使用C语义,但继承了OpenGL的一些属性和技术。使用cpp包装库(cl.hpp)分配和重新分配将如下所示://init cl::Buffer b=cl::Buffer(attribs);//reinit b=cl::缓冲区(其他属性)。。。现在包装器正在进行重新分配工作。。。但是OpenCL实现必须有自己的内存管理。这可能会重复使用相同大小的缓冲区。如果你“重新控制”这样的缓冲区,你就是在制造内存泄漏。这不会重新生成,但会创建另一个缓冲区,并丢失对前一个缓冲区的引用。丢失引用并不意味着它将被释放或重新使用!不要这样做。抱歉,不同意你,但是C++ opnl包装器实现了一个REF计数系统,当C++对象被破坏时,它释放OpenCL资源。是的,你说的对,我忘记了这是C++。然而,我的第一点仍然是:OpenCL并没有隐式地重用内存。这只能在发布后发生。如果该释放与引用计数或类似情况一起发生,则无所谓。如果分配大小相似的缓冲区,OpenCL实现可能会返回相同的内存块,但这是一个特定于实现的细节。确定。。。我已更改代码以重用内存。。。但我猜,如果供应商实现OpenGL以重用内存,他们将以同样的方式实现OpenCL