使用OpenCV进行并行GPU计算
我有一个应用程序需要并行处理多个图像以保持实时速度。
我的理解是,我无法在单个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双芯片卡是否可以作为两个独立的OpenCV 2.4或更高版本的CUDA设备使用? 我发现确认它可以像OpenCL那样工作,但没有关于OpenCV的确认。
只需将整个图像传递给cv::gpu::multiply()
函数即可。
OpenCV和CUDA将以最好的方式处理分割并分割任务。 通常,GPU中的每个计算机单元(即核心)都可以运行多个线程(在CUDA中通常> = 16)。 这是除了具有可以显示为多个GPU或在一台机器上放置多个连接的卡的卡之外。
cv::gpu
的全部要点是让你不必了解内部工作方式。
马丁的回答为我工作。 如果您的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内存或从GPU内存下载图像,以及检查流状态的方法,以帮助与其他代码同步。
所以......它显然不需要多个CUDA设备(即GPU卡)来并行执行OpenCV GPU代码!
我对OpenCV的GPU功能一无所知,但如果它们是完全独立的(即创建GPU上下文,将数据传输到GPU,计算结果并将结果传回CPU),那么这些功能就会出现串行化并不奇怪当使用单个GPU时。
如果你有多个GPU,那么应该有一些方法来告诉OpenCV函数针对特定的GPU。 如果你有多个GPU并且可以有效地瞄准它们,那么我没有看到GPU函数调用不会被并行化的原因。 根据OpenCV维基百科,GPU功能仅针对单个GPU,但您可以自行手动拆分:http://opencv.willowgarage.com/wiki/OpenCV%20GPU%20FAQ#Can_I_use_two_or_more_GPUs.3F
就像您的GPU程序而言,双GPU如GTX 690将显示为具有自己内存的两种不同设备。 看到这里:http://forums.nvidia.com/index.php?showtopic=231726
此外,如果您要为计算应用程序推出双GPU路线,我会建议您不要使用GTX 690,因为与GTX 590相比,它的计算性能有些削弱。
链接地址: http://www.djcxy.com/p/47415.html