我最近一直在摆弄 OpenCL,我遇到了一个严重的限制:你不能将指针数组传递给内核。这使得将任意大小的图像列表传递给内核变得很困难。我对此有一些想法,我想知道是否有人可以确定他们是否会工作,或者提供更好的建议。
假设您有 x 个想要传递给内核的图像对象。如果它们都是 2D 的,一种解决方案可能是将它们全部打包成 3D 图像,然后只索引切片。这样做的问题是,如果图像大小不同,则会浪费空间,因为 3D 图像必须具有最宽图像的宽度、最高图像的高度,而深度将是图像的数量。
但是,我也在想,当您将缓冲区对象传递给内核时,它会作为指针出现在内核中。如果您有一个内核采用任意数据缓冲区,并且指定一个缓冲区仅用于存储指针,然后将指向第一个缓冲区的指针附加到第二个缓冲区的末尾,(当然前提是有足够的分配空间)那么也许您可以保留指向设备上其他缓冲区的指针缓冲区。然后可以将此缓冲区传递给其他内核,然后通过一些有趣的转换,这些内核将能够访问设备上的这些任意缓冲区。唯一的问题是给定的缓冲区指针在缓冲区的整个生命周期中是否保持不变。此外,当您传递图像时,您会得到一个结构作为参数。现在,这个结构实际上在设备内存中有一个家吗?或者它是否足够长以传递给内核?这些事情很重要,因为它们将确定指针缓冲区技巧是否也适用于图像,假设它完全可以工作。
有人知道缓冲技巧是否有效吗?有没有其他人可以想到将任意大小的列表传递给内核的方法?
编辑:缓冲技巧不起作用。我已经测试过了。我不确定为什么,但设备上的指针似乎从一次调用到另一次调用并不相同。