13

我有一个应用程序需要并行处理多个图像以保持实时速度。

据我了解,我不能在单个 CUDA 设备上以多线程方式调用 OpenCV 的 GPU 函数。我尝试了一个 OpenMP 代码结构,如下所示:

#pragma omp parallel for
for(int i=0; i<numImages; i++){
    for(int j=0; j<numChannels; j++){
        for(int k=0; k<pyramidDepth; k++){
            cv::gpu::multiply(pyramid[i][j][k], weightmap[i][k], pyramid[i][j][k]);
        }
    }
}

这似乎可以正确编译和执行,但不幸的是,它似乎是在同一个 CUDA 设备上串行执行 numImages 线程。

如果我有多个 CUDA 设备,我应该能够并行执行多个线程,对吗?为了获得多个 CUDA 设备,我需要多个视频卡吗?

有谁知道 nVidia GTX 690 双芯片卡是否可以作为两个独立的 CUDA 设备使用 OpenCV 2.4 或更高版本?我发现确认它可以与 OpenCL 一起工作,但没有关于 OpenCV 的确认。

4

4 回答 4

5

只需将整个图像传递给cv::gpu::multiply()函数。

OpenCV 和 CUDA 将处理拆分它并以最佳方式划分任务。通常,GPU 中的每个计算机单元(即核心)可以运行多个线程(在 CUDA 中通常 >=16)。这是除了拥有可以显示为多个 GPU 的卡或将多个链接的卡放在一台机器中之外的。

的全部意义cv::gpu在于使您不必了解内部结构的工作原理。

于 2012-06-22T14:45:46.910 回答
4

马丁的回答对我有用。如果您的 CUDA 设备被列为计算能力 2 或更高,则关键是要使用 gpu::Stream 类。我将在这里重述它,因为我无法在评论迷你编辑器中正确发布代码剪辑。

cv::gpu::Stream stream[3];

for(int i=0; i<numImages; i++){
    for(int j=0; j<numChannels; j++){
        for(int k=0; k<pyramidDepth; k++){
            cv::gpu::multiply(pyramid[i][j][k], weightmap[i][k], pyramid[i][j][k], stream[i]);
        }
    }
}

上面的代码似乎并行执行乘法(我的应用程序为 numImages = 3)。还有一些 Stream 方法可以帮助从 GPU 内存上传/下载图像,以及检查流状态以帮助与其他代码同步的方法。

所以......它显然不需要多个 CUDA 设备(即 GPU 卡)来并行执行 OpenCV GPU 代码!

于 2012-06-26T00:18:23.953 回答
0

我对 OpenCV 的 GPU 函数一无所知,但如果它们是完全自包含的(即创建 GPU 上下文、将数据传输到 GPU、计算结果、将结果传输回 CPU),那么这些函数出现序列化也就不足为奇了使用单个 GPU 时。

如果您有多个 GPU,那么应该有一些方法可以告诉 OpenCV 函数以特定 GPU 为目标。如果您有多个 GPU 并且可以有效地定位它们,那么我认为没有理由不并行化 GPU 函数调用。根据 OpenCV wiki,GPU 功能仅针对单个 GPU,但您可以自己手动拆分工作:http: //opencv.willowgarage.com/wiki/OpenCV%20GPU%20FAQ#Can_I_use_two_or_more_GPUs.3F

就您的 GPU 程序而言,像 GTX 690 这样的双 GPU 将显示为两个具有自己内存的不同设备。见这里: http: //forums.nvidia.com/index.php?showtopic=231726

此外,如果您要为计算应用程序采用双 GPU 路线,我建议您不要使用 GTX 690,因为与 GTX 590 相比,它的计算性能有所削弱。

于 2012-06-21T19:20:10.753 回答
0

无论您使用哪个 OpenCV 版本,GTX 290 都充当 2 个独立的 CUDA 设备。您不需要多个 GPU 卡来获得多个 GPU,例如在 GTX 290 中,一张卡上有 2 个。但是,从 CUDA 编程的角度来看,在 290 上使用两个 GPU 和使用2 个 GPU 在单独连接的 GPU 卡上。许多 OpenCV 用户使用 ArrayFire CUDA 库来补充更多的图像处理功能和简单的多 GPU 缩放。当然,我的免责声明是我在 ArrayFire 上工作,但我确实认为在这种情况下它会对你有所帮助。

于 2012-06-22T14:06:49.980 回答