【发布时间】: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