OpenCL - 主内核填充缓冲区并在子内核上运行

时间:2012-06-21 01:17:44

标签: opencl kernel

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

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

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

情景是否有意义并且在GPU编程中是否可行?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

    (附加)

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

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

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