【问题标题】:Massively Parallel algorithm to propagate pixels大规模并行算法传播像素
【发布时间】:2010-06-24 20:09:06
【问题描述】:

我正在设计一个 CUDA 应用来处理一些视频。我正在使用的算法调用填充空白像素的方式与康威的生活游戏没有什么不同:如果另一个像素周围的像素都被填充并且所有类似的值,则特定像素会被周围的值填充。这会迭代,直到所有要修复的像素数等于上一次迭代中要修复的像素数(即,当其他任何事情都无法完成时)。

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

但是,这个问题的本质要求所有线程之间同步,以在每次迭代之间更新全局图像。我曾考虑多次为每次迭代调用内核,但我无法确定该过程何时“完成”,除非我在每次迭代之间将数据传输回 CPU,由于内存传输延迟通过PCI-e 接口。

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

【问题讨论】:

    标签: algorithm cuda parallel-processing


    【解决方案1】:

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

    【讨论】:

    • 感谢保罗的回答。我认为我对算法不太清楚,但我的问题源于我需要迭代这个过程。第一次迭代将填充一些像素,然后第二次迭代应该从第一次迭代中读取结果并填充一些在第一次迭代中无法填充的像素。同步的需要来自于我需要在处理像素本身之前知道所有周围像素的结果。
    • 好的——但是你不能用两个缓冲区来做这个并前后切换吗? A -> B -> A -> B -> ... ?如果不是,那么也许我们需要查看实际算法的更多细节。
    • 如果只有 CUDA 允许线程块之间的一些同步,它可以这样实现。基本上第二步取决于第一步,第三步取决于第二步。我只能在线程块内的线程之间同步(最多 512 个线程)。没有很多线程块,我就没有利用 CUDA 的并行性,但是有了很多线程块,我无法保证每个线程块都会在迭代之前完成,除非多次调用内核。如果我想多次调用内核,我必须将数据传回 CPU 以检查它是否完成。 :|
    • 如果您有两个内核,一个用于 A->B,一个用于 B->A,那么您可以依次调用每个内核并等待它完成 (cudaThreadSynchronize())。这样你就可以同步了。 [实际上你可能只需要一个内核并向它传递一个标志来指示方向(A->B 或 B->A)。]
    • 是的,但我不知道每次内核运行之间算法是否完整。只有当内核说没有更多像素要处理时才会这样做,但它需要不确定数量的步骤。我必须以某种方式在内核的每次调用之间传输数据以检查它是否已完成。如果我必须重复多次,延迟不会让这种方法变得非常昂贵吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多