如何在内核中处理可变数量的算法?

时间:2012-02-09 09:48:43

标签: opencl

我正在拍摄视频帧。每个帧都作为Image2D传递到内核中。我有大约五种简单的图像处理算法(模糊,锐化等),用户可以选择(也可以是不同的组合)。我在这里看到三种可能性:

  1. 一个内核:在运行时使用构造内核的字符串 选择算法和编译(并采取一次性的开销 编制延迟)
  2. 一个内核:使用标志处理所选算法(虽然我知道条件分支是不合需要的)
  3. 许多内核(每个算法一个):似乎是问题,Image2D可以是read_onlywrite_only,我需要重复复制图像GPU作为内核的一个输出图像是下一个内核的输入图像。
  4. 是否有建议的经验法则可以采用哪种方法?

2 个答案:

答案 0 :(得分:2)

readonly / writeonly问题的一个解决方法可能是为中间步骤使用缓冲区。

Image2D - > buffer0 - > buffer1 - > ... bufferN - > Image2D

如果您不需要中间结果,请使用两个缓冲区并与它们交替使用。 (I2d,B0,B1,B0,...,I2D)

您可能需要提前知道您申请了多少过滤器,但这不应该是一个大问题。

答案 1 :(得分:1)

我建议您尝试避免前两个选项

  1. 这样你就会有一个非常难以理解和复杂的内核代码。如果你100%确定代码完成它应该做的事情,这是可以的。这是考虑到您的工作项目的安排和分组。重点是,以这种方式调试和维护内核将很困难。

  2. 我认为,如果您的线程可以在不同的路径中运行,那么这比第一个选项更糟糕。简单的分支可能会降低您的性能并为同步带来麻烦。除了简单的分支外,您还应该考虑到您的算法可能需要不同数量和排列的线程这一事实。如果是这种情况,那么对所有操作使用一个内核是一个非常糟糕的主意。

  3. 我自己没试过,但我认为你应该试试@mfa建议的选项。