Textures 图像缓冲区的opencl矢量/图像缓冲区的大量数据

Textures 图像缓冲区的opencl矢量/图像缓冲区的大量数据,textures,opencl,Textures,Opencl,我是openCL的新手,目前的程序有点问题。 我想在我的设备上移动大量图像,我只需要在程序中读取它们。 我的问题是,我的设备只允许我分配约255mb的缓冲区, 由于该程序应该能够处理不同的参数,也应该能够在多台机器上运行,因此我不知道事先可以在设备上放置多少图像,但必须在运行时进行评估 为此,我想做一些事情,比如用存储在其中的图像创建几个图像缓冲区(纹理),并创建另一个缓冲区,其中只包含指向这些缓冲区的指针 不幸的是,我找不到任何关于如何实现类似功能的信息(特别是因为图像缓冲区总是需要声明为只读

我是openCL的新手,目前的程序有点问题。 我想在我的设备上移动大量图像,我只需要在程序中读取它们。 我的问题是,我的设备只允许我分配约255mb的缓冲区, 由于该程序应该能够处理不同的参数,也应该能够在多台机器上运行,因此我不知道事先可以在设备上放置多少图像,但必须在运行时进行评估

为此,我想做一些事情,比如用存储在其中的图像创建几个图像缓冲区(纹理),并创建另一个缓冲区,其中只包含指向这些缓冲区的指针

不幸的是,我找不到任何关于如何实现类似功能的信息(特别是因为图像缓冲区总是需要声明为只读或只写),或者是否可能


谢谢你的帮助

OpenCL不允许指向图像的指针(或指向缓冲区的指针)。另一种方法是使用3D纹理(如果可用)。OpenCL 1.2还为2D纹理阵列提供了单独的对象(不沿z轴插值)。如果将自己限制为2D纹理,仍然可以将多个图像以不同的偏移放置到同一纹理中。最后,您可以在运行时生成内核代码,允许您更改作为参数传递的图像数量。

OpenCL不允许指向图像的指针(或指向缓冲区的指针)。另一种方法是使用3D纹理(如果可用)。OpenCL 1.2还为2D纹理阵列提供了单独的对象(不沿z轴插值)。如果将自己限制为2D纹理,仍然可以将多个图像以不同的偏移放置到同一纹理中。最后,您可以在运行时生成内核代码,允许您更改作为参数传递的图像数量。

将数据存储为缓冲区,然后根据需要将输入复制到图像中,以使用clEnqueueCopyBufferToImage将最大图像保留在纹理内存中

对于图像的读写,您将内核参数上的只读/写限定符与实际的opencl图像读写混淆。对于每个内核,映像可以是只读的,也可以是只读的,但是映像本身可以是只读的,只要使用两个内核。
因此,当您创建image2d时,使用CL_MEM_READ_WRITE,但有一个内核正在读取图像,另一个内核正在写入图像,但仍然是相同的图像。另外,通常只需要一个输入和一个输出opencl映像,然后将缓冲区复制到映像中,然后根据需要将其复制出来,而不管您有多少个

将数据存储为缓冲区,然后根据需要将输入复制到图像中,以使用clEnqueueCopyBufferToImage将最大图像保留在纹理内存中

对于图像的读写,您将内核参数上的只读/写限定符与实际的opencl图像读写混淆。对于每个内核,映像可以是只读的,也可以是只读的,但是映像本身可以是只读的,只要使用两个内核。
因此,当您创建image2d时,使用CL_MEM_READ_WRITE,但有一个内核正在读取图像,另一个内核正在写入图像,但仍然是相同的图像。另外,通常只需要一个输入和一个输出opencl映像,然后将缓冲区复制到映像中,然后根据需要将其复制出来,而不管您有多少个

谢谢你的回答。我已经将多个图像放入同一纹理中,但不幸的是,内存(以及最大宽度/高度)限制了我。我想3D纹理不会解决内存问题,但它可以解决宽度/高度限制,我将对此进行研究。我很可能不得不在运行时生成或至少修改内核代码,但我希望能够避免这种情况,因为“自动生成”代码以后更难呈现。谢谢你的回答。我已经将多个图像放入同一纹理中,但不幸的是,内存(以及最大宽度/高度)限制了我。我想3D纹理不会解决内存问题,但它可以解决宽度/高度限制,我将对此进行研究。我很可能必须在运行时生成或至少修改内核代码,但我希望能够避免这种情况,因为“自动生成”代码以后更难呈现。我想我对读/写限制还不够清楚。我只需要从图像中读取,我在不同的缓冲区中写入,这不需要是图像。虽然你的解决方案很诱人,但问题是它无法同时让我获得设备上的所有图像。因为我需要从主机代码调用clEnqueueCopyBufferToImage,所以我需要启动多个内核(我可能需要这样做,因为我也超过了全局内存限制)。我想我对读/写限制还不够清楚。我只需要从图像中读取,我在不同的缓冲区中写入,这不需要是图像。虽然你的解决方案很诱人,但问题是它无法同时让我获得设备上的所有图像。因为我需要从主机代码调用clEnqueueCopyBufferToImage,所以我需要启动多个内核(我可能需要这样做,因为我也超过了全局内存限制)。