0

作为 OpenCL 的新手,我想知道以下情况是否可行。

在内存中创建了 10 个长度为 10000 的缓冲区,或者一个 10xN 的图像缓冲区用作缓存。

第一个内核将在缓存中填充一行并查询另一个内核以对该行进行一些工作。当第二个内核完成后,第一个内核可以计算一个新行并替换旧行,并且相同的过程继续进行,直到第一个内核没有更多任务为止。

该场景是否有意义,在 GPU 编程中是否可行?

4

1 回答 1

1

OpenCL 不允许内核调用其他内核。但是你有一些选择。

  1. 让第一个内核调用另一个非内核函数。工作项之间的工作分配在这里不会改变 - 因此,如果您有 10 个并行工作项(线程)正在执行,每行一个,那么每个线程将在非内核函数中对相同的数据进行操作。

  2. 多个内核可以一个接一个地加入队列,但这是由主机协调的。这确实允许在线程之间重新分配工作,但可能比选项 1 更复杂。

创建快速 OpenCL 代码的关键之一是将工作拆分为工作项,通常越多越好。如果填充该行的第一个内核只能拆分为 10 个工作项,但在该行上进行处理的第二个内核可以拆分为 1000 个工作项,那么您肯定希望使用选项 2,因为第二部分可以在具有大量内核的设备(例如现代 GPU)上更有效地拆分。少数工作项目(例如 10 个)将只能使用该可用处理能力的一小部分。

(补充)

在 GPU 上执行的 OpenCL 内核是数据并行的,这意味着一次只能执行一个内核,但每个线程处理不同的数据。可能值得重新考虑您的算法以适应此模型。

从您在评论中写的内容看来,由于内存限制,您想一次运行 10 个项目。但请注意,OpenCL 中没有动态内存分配。所有缓冲区都是预先声明的。因此,主机应该确定有多少任务可以放入可用内存并运行成批的工作项(通过适当的缓冲区传输)。

另外缓冲区是如何填充的?从文件?OpenCL 内核无法读取文件、网络等,因此如果这是加载原始数据的方式,则必须在主机上完成。但是,如果这些图像缓冲区是从其他源创建的(例如,通过算法或从另一个内存源),那么应该可以正常工作(尽管您还需要将任何其他内存源复制到 GPU) .

于 2012-06-21T01:30:28.340 回答