1

我对 openCL 很陌生,并且在我当前的程序中遇到了一些问题。我想在我的设备上移动大量图像,我只需要在我的程序中读取它们。我的问题是,我的设备只允许我分配 ca 的缓冲区。255mb,由于程序应该能够处理不同的参数并且还应该能够在多台机器上运行,所以我不知道我可以预先在设备上放置的确切图像数量,但必须在运行时对其进行评估。

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

不幸的是,我找不到任何关于我如何做到这样的信息(特别是因为图像缓冲区总是需要声明为 read_only 或 write_only)或者是否有可能。

谢谢你的帮助!

4

2 回答 2

1

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

于 2013-08-15T17:58:25.733 回答
0

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

至于读取和写入图像,您会将内核参数上的 read/write only 限定符与正在读取或写入的实际 opencl 图像混淆。对于每个内核,一个映像可以是只读的,也可以是只写的,但只要您使用两个内核,映像本身就可以是两者。因此,在创建 image2d 时使用 CL_MEM_READ_WRITE,但有一个内核正在读取图像,一个内核正在写入,但它仍然是同一个图像。此外,通常更容易只拥有一个输入和一个输出 opencl 图像,然后将缓冲区复制到图像中,然后根据需要将其复制出来,无论您有多少。

于 2013-08-15T19:35:12.417 回答