代码之家  ›  专栏  ›  技术社区  ›  Xzhsh

传播像素的大规模并行算法

  •  2
  • Xzhsh  · 技术社区  · 16 年前

    我正在设计一个CUDA应用程序来处理一些视频。我使用的算法要求以一种与康威的生命游戏不一样的方式填充空白像素:如果其他像素周围的像素都被填充,并且所有类似的值都被填充,那么特定的像素将被周围的值填充。这将迭代,直到要修复的所有像素数等于上一次迭代中要修复的像素数(即,当无法执行其他操作时)。

    我的困惑是:处理管道的前一部分和下一部分都在GPU上的CUDA中实现。将整个图像传输回RAM,在CPU上处理,然后再传输回GPU,这将是非常昂贵的。即使速度较慢,我也希望在CUDA中实现该算法。

    但是,这个问题的本质要求在所有线程之间同步,以便在每次迭代之间更新全局映像。我考虑过多次为每次迭代调用内核,但我无法确定进程何时“完成”,除非在每次迭代之间将数据传输回CPU,这将导致很大的效率低下,因为内存传输延迟通过PCI-E接口。

    有并行算法经验的人有什么建议吗?提前谢谢。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Paul R    16 年前

    听起来您需要一个额外的图像缓冲区,这样您就可以将未修改的输入图像保存在一个缓冲区中,并将处理后的输出图像写入第二个缓冲区。这样,每个线程都可以处理单个输出像素(或输出像素的小块),而不必担心同步等问题。