我对openCL很新,并且对我当前的程序面临一些问题。 我想在我的设备上移动大量图像,我只需要在我的程序中读取它们。 我的问题是,我的设备只允许我分配ca.的缓冲区。 255MB, 由于程序应该能够处理不同的参数并且还能够在多台机器上运行,我不知道我可以事先在设备上放置的确切数量的图像,但必须在运行时对其进行评估。
为了做到这一点,我想做一些事情,比如创建几个图像缓冲区(纹理),我的图像存储在其中,并有另一个缓冲区,它只包含指向这些缓冲区的指针。
不幸的是,我找不到任何关于我如何做到这一点的信息(特别是因为图像缓冲区总是需要声明为read_only或write_only)或者是否有可能。
谢谢你的帮助!
答案 0 :(得分:1)
OpenCL不允许指向图像(或指向缓冲区的指针)。另一种方法是使用3D纹理(如果可用)。 OpenCL 1.2还具有用于2D纹理阵列的单独对象(不沿z轴插值)。如果您将自己局限于2D纹理,您仍然可以在不同的偏移处将多个图像放入相同的纹理中。最后,您可以在运行时生成内核代码,允许您更改作为参数传递的图像数量。
答案 1 :(得分:0)
将数据存储为缓冲区,然后根据需要将输入复制到图像中,以使用clEnqueueCopyBufferToImage
将最大图像保留在纹理内存中对于图像的读取和写入,您在内核参数上只读取/写入限定符,并且实际的opencl图像被读取或写入。对于每个内核,图像可以是只读的也可以是只写的,但只要使用两个内核,图像本身就可以。 因此,在创建image2d时使用CL_MEM_READ_WRITE但是有一个正在读取图像的内核和一个正在写入它的内核但它仍然是相同的图像。此外,通常更容易获得输入和输出opencl图像,然后将缓冲区复制到图像中,然后根据需要将其复制出来,无论您拥有多少。