使用CUDA处理多个图像

时间:2014-10-14 11:15:08

标签: cuda

首先,我尝试在发布之前搜索这个问题(以为人们常常遇到它),但找不到相同的问题。 我有多个图像要处理,处理是在各种内核中完成的。 例如

md = true;
while(md) {
    kernel1<<<...>>>(image1, md);
    kernel2<<<...>>>(image1, md); //image1 here is the image modified by kernel1
    kernel3<<<...>>>(image1, md); //image1 here is the image modified by kernel2
}

md = true;
while(md) {
    kernel1<<<...>>>(imageN, md);
    kernel2<<<...>>>(imageN, md); //imageN here is the image modified by kernel1
    kernel3<<<...>>>(imageN, md); //imageN here is the image modified by kernel2
}

当任何内核将该映像的md设置为false时,特定映像的处理将停止。图像数量不固定。我想知道我是否可以使用流并行处理图像?如果是,我怎么知道属于流的一个内核何时完成,我应该为该特定图像调用下一个内核? (我应该把它放在主机的无限循环中)。 我在考虑动态并行性,但我正在开发CUDA计算能力3.0。 非常感谢你的时间。

编辑:根据VAnderi的评论

1 个答案:

答案 0 :(得分:1)

我认为你可以使用CUDA流来完成这项任务,但如果你有多张图片,它应该会得到回报。

例如,您可以创建2个流,一个处理奇数编号的图像,另一个处理偶数编号的图像。在每一个流中,你排队&#34; kernel1,kernel2和kernel3这样你可以控制内核2等待内核1等等。请参阅 this 演示文稿。

流的行为类似于队列。如果将内核推送到流中,它们将按您排队的顺序运行。有关详细信息,请参阅 post

我不建议将内核1,2,3放在不同的流上,因为它会使情况变得更糟。

关于动态并行性,这更多是将内存副本与处理另一个数据集的内核重叠。如果在处理内核中的当前图像时复制下一组图像,则可以从中获得更多性能。

相关问题