【问题标题】:Process multiple images using CUDA使用 CUDA 处理多个图像
【发布时间】:2014-12-09 04:02:46
【问题描述】:

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

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 的评论

【问题讨论】:

  • 那么kernel1修改image1,然后kernel2为kernel3修改修改后的image1?
  • 是的,kernel1改变image1,生成的image1交给kernel2,然后生成的image1交给kernel3。
  • 您可以使用 CPU 并行线程模型,如 OpenMP,并为每个 OMP 线程创建一个流。在每个 OMP 线程中放置一个 while 循环,并让 while 循环分别从队列中绘制要处理的新图像。如果您通过这种方式获得很大的性能提升,我会感到非常惊讶,除非您的内核非常小。
  • 抱歉,我一直在微调算法本身——这与 CUDA 无关,因此延迟了回复。你为什么说 - “如果你以这种方式获得很大的性能改进,我会感到非常惊讶,除非你的内核非常小。”原因是什么?我的每张图像都有 230x230 像素或 16384x7 像素。所以并行处理多个图像应该可以加快速度,对吗? (不使用OpenMP就没有办法吗?

标签: cuda


【解决方案1】:

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

例如,您可以创建 2 个流,一个处理奇数图像,一个处理偶数图像。在每个流中,您将内核 1、内核 2 和内核 3“排入队列”,这样您就可以控制内核 2 等待内核 1,依此类推。请参阅 this 演示文稿。

流的行为类似于队列。如果您将内核推送到流中,它们将按照您将它们排入队列的顺序运行。请参阅此 post 了解更多信息。

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

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

【讨论】:

  • 谢谢。将查看演示文稿。但我还不清楚,如何在没有无限循环的情况下做到这一点。假设我启动 2 个流 - 每个图像一个。 CPU 应该根据 md 的值多次调用 kernel1、kernel2、kernel3。如果只是一次调用,我确实理解这一点。
  • 根据md的值,我决定是否进一步细化图像。link
  • 那你的方法没问题。如果您正在进行某种过滤,我们并不是在谈论无限循环。可能需要少量迭代。但是请确保您让每个线程启动“阻塞”。
  • 谢谢。如何在 while 循环中检查流的完成情况?
  • cudaStreamSynchronize 功能可能会有所帮助。在此处查看更多信息:stackoverflow.com/questions/5107265/…
猜你喜欢
  • 2015-08-09
  • 2014-05-15
  • 2016-07-20
  • 2012-03-20
  • 2014-07-25
  • 2020-09-20
  • 1970-01-01
  • 2012-06-26
  • 2016-08-04
相关资源
最近更新 更多