我正在拍摄视频帧。每个帧都作为Image2D传递到内核中。我有大约五种简单的图像处理算法(模糊,锐化等),用户可以选择(也可以是不同的组合)。我在这里看到三种可能性:
Image2D
可以是read_only
或write_only
,我需要重复复制图像GPU作为内核的一个输出图像是下一个内核的输入图像。是否有建议的经验法则可以采用哪种方法?
答案 0 :(得分:2)
readonly / writeonly问题的一个解决方法可能是为中间步骤使用缓冲区。
Image2D - > buffer0 - > buffer1 - > ... bufferN - > Image2D
如果您不需要中间结果,请使用两个缓冲区并与它们交替使用。 (I2d,B0,B1,B0,...,I2D)
您可能需要提前知道您申请了多少过滤器,但这不应该是一个大问题。
答案 1 :(得分:1)
我建议您尝试避免前两个选项
这样你就会有一个非常难以理解和复杂的内核代码。如果你100%确定代码完成它应该做的事情,这是可以的。这是考虑到您的工作项目的安排和分组。重点是,以这种方式调试和维护内核将很困难。
我认为,如果您的线程可以在不同的路径中运行,那么这比第一个选项更糟糕。简单的分支可能会降低您的性能并为同步带来麻烦。除了简单的分支外,您还应该考虑到您的算法可能需要不同数量和排列的线程这一事实。如果是这种情况,那么对所有操作使用一个内核是一个非常糟糕的主意。
我自己没试过,但我认为你应该试试@mfa建议的选项。