Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 大规模并行像素传播算法_Algorithm_Cuda_Parallel Processing - Fatal编程技术网

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

Algorithm 大规模并行像素传播算法,algorithm,cuda,parallel-processing,Algorithm,Cuda,Parallel Processing,我正在设计一个CUDA应用程序来处理一些视频。我使用的算法要求以一种与康威的生活游戏相似的方式填充空白像素:如果其他像素周围的像素都被填充,并且都是类似的值,那么特定像素就会被周围的值填充。此过程将迭代,直到所有要修复的像素数等于上一次迭代中要修复的像素数(即,当无法执行其他操作时) 我的困惑是:处理管道的上一部分和下一部分都是在GPU上的CUDA中实现的。将整个图像传输回RAM,在CPU上处理,然后再传输回GPU,这将非常昂贵。即使速度较慢,我也希望在CUDA中实现该算法 但是,该问题的本质要

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

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

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


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

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

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