成功构建后,CUDA无法在OpenCV中运行

时间:2014-12-27 21:21:23

标签: opencv cuda cmake

我正在尝试使用CUDA 6.5在Win 8.1机器上构建OpenCV 2.4.10。我还有其他第三方库,它们已成功安装。我推出一个简单的基于GPU的程序,我得到了这个错误No GPU found or the library was compiled without GPU support。我还运行了在安装过程中构建的示例exe文件,如performance_gpu.exe,我得到了同样的错误。我还检查了WITH_CUDA标志。以下是在CMAKE构建期间设置的标志(与CUDA相关)。

  • WITH_CUDA:已检查
  • WITH_CUBLAS:已检查
  • WITH_CUFFT:已选中
  • CUDA_ARCH_BIN:1.1 1.2 1.3 2.0 2.1(2.0)3.0 3.5
  • CUDA_ARCH_PTX:3.0
  • CUDA_FAST_MATH:已检查
  • CUDA_GENERATION:自动
  • CUDA_HOST_COMPILER:$(VCInstallDir)bin
  • CUDA_SPERABLE_COMPILATION:未选中
  • CUDA_TOOLKIT_ROOT_DIR:C:/ Program Files / NVIDIA GPU Computing Toolkit / CUDA / v6.5

另一件事是,在一些帖子中,我已经读过,与CUDA一起构建需要花费大量时间。我的构建需要大约3小时,在编译.cu文件期间占用最多时间。据我所知,在编译这些文件时我没有任何错误。

在一些帖子中,我看到人们在gpu目录中谈论目录名build,但我在我的内容中没有看到任何内容!

我正在使用Visual Studio 2013。

可能是什么问题?请帮忙!

更新

我再次尝试构建opencv,这次在开始构建之前,我添加了bin,lib和包含CUDA的目录。在E:\opencv\build\bin\Release中构建之后,我运行了gpu_perf4au.exe并获得了此输出

[----------]
[   INFO   ]    Implementation variant: cuda.
[----------]
[----------]
[ GPU INFO ]    Run test suite on GeForce GTX 860M GPU.
[----------]
Time compensation is 0
OpenCV version: 2.4.10
OpenCV VCS version: unknown
Build type: release
Parallel framework: tbb
CPU features: sse sse2 sse3 ssse3 sse4.1 sse4.2 avx avx2
[----------]
[ GPU INFO ]    Run on OS Windows x64.
[----------]
*** CUDA Device Query (Runtime API) version (CUDART static linking) ***

Device count: 1

Device 0: "GeForce GTX 860M"
  CUDA Driver Version / Runtime Version          6.50 / 6.50
  CUDA Capability Major/Minor version number:    5.0
  Total amount of global memory:                 2048 MBytes (2147483648 bytes)
  GPU Clock Speed:                               1.02 GHz
  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65536), 3
D=(4096,4096,4096)
  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16
384) x 2048
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     2147483647 x 65535 x 65535
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and execution:                 Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Concurrent kernel execution:                   Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Bus ID / PCI location ID:           1 / 0
  Compute Mode:
      Default (multiple host threads can use ::cudaSetDevice() with device simul
taneously)

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version  = 6.50, CUDA Runtime Ver
sion = 6.50, NumDevs = 1

我认为每件事情都没问题,但在运行这个程序之后,我在其属性文件中包含了所有opencv和CUDA目录,

#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\gpu\gpu.hpp>

using namespace std;
using namespace cv;

char key;

Mat thresholder (Mat input) {
    gpu::GpuMat dst, src;
    src.upload(input);
    gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
    Mat result_host(dst);
    return result_host;
}

int main(int argc, char* argv[]) {

    cvNamedWindow("Camera_Output", 1);
    CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY);

    while (1){
        IplImage* frame = cvQueryFrame(capture);
        IplImage* gray_frame = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
        cvCvtColor(frame, gray_frame, CV_RGB2GRAY);

        Mat temp(gray_frame);
        Mat thres_temp;
        thres_temp = thresholder(temp);
        //cvShowImage("Camera_Output", frame);   //Show image frames on created window
        imshow("Camera_Output", thres_temp);

        key = cvWaitKey(10);
        if (char(key) == 27){
            break;      //If you hit ESC key loop will break.
        }
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("Camera_Output");
    return 0;
}

我收到了错误:

OpenCV Error: No GPU support (The library is compiled without CUDA support) in E
mptyFuncTable::mallocPitch, file C:\builds\2_4_PackSlave-win64-vc12-shared\openc
v\modules\dynamicuda\include\opencv2/dynamicuda/dynamicuda.hpp, line 126

2 个答案:

答案 0 :(得分:4)

感谢@BeRecursive让我领导解决了我的问题。 CMAKE构建日志有三个不可用的opencv模块,即androidcameradynamicudaviz。我找不到关于dynamicuda的任何信息,即模块的不可用性可能导致我在问题中提到的错误。相反,我搜索了viz模块并检查了它是如何安装的。

在浏览了一些博客和论坛后,我发现viz模块未包含在OpenCV的pre-built版本中。建议从源版本2.4.9构建。我想尝试一下,我用VS 2013和CMAKE 3.0.1安装它,但是有很多构建失败和警告。经过进一步搜索,我发现CMAKE版本3.0.x不建议用于构建OpenCV,因为它们会产生很多警告。

最后我决定切换到VS 2010和CMAKE 2.8.12.2并且在构建源代码后我没有错误,幸运的是在我运行我提到的程序之后在PATH中添加了所有可执行文件,库和DLL上面我没有错,但运行速度很慢!所以我运行了这个程序:

#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\gpu\gpu.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

Mat thresholder(Mat input) {
    cout << "Beginning thresholding using GPU" << endl;
    gpu::GpuMat dst, src;
    src.upload(input);
    cout << "upload done ..." << endl;
    gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
    Mat result_host(dst);
    cout << "Thresolding complete!" << endl;
    return result_host;
}

int main(int argc, char** argv) {
    Mat image, gray_image;
    image = imread("desert.jpg", CV_LOAD_IMAGE_COLOR);   // Read the file
    if (!image.data) {
        cout << "Could not open or find the image" << endl;
        return -1;
    }
    cout << "Orignal image loaded ..." << endl;
    cvtColor(image, gray_image, CV_BGR2GRAY);
    cout << "Original image converted to Grayscale" << endl;

    Mat thres_image;
    thres_image = thresholder(gray_image);

    namedWindow("Original Image", WINDOW_AUTOSIZE);// Create a window for display.
    namedWindow("Gray Image", WINDOW_AUTOSIZE);
    namedWindow("GPU Threshed Image", WINDOW_AUTOSIZE);
    imshow("Original Image", image);
    imshow("Gray Image", gray_image);
    imshow("GPU Threshed Image", thres_image);

    waitKey(0);
    return 0;
}

后来我甚至测试了VS 2013上的构建,它也起作用了。

由于提到here的原因,基于GPU的程序很慢。

我想指出的三个重要事项:

  • 仅限来源
  • 使用较旧版本的CMAKE
  • 首选VS 2010来构建二进制文件。

注意:

  • 这可能听起来很奇怪,但由于某些链接器错误导致我的所有第一次BUIL失败。所以,我不知道这是否有效,但尝试在此之后逐个构建opencv_gpu之前的所有其他模块,然后构建ALL_BUILDS和INSTALL项目。
  • 当您在DEBUG模式下构建这种方式时,如果您正在使用Python支持构建opencv,则可能会出现错误,即&#34; python27_d.lib&#34;否则所有项目都将成功建成。

WEB来源:

以下是帮助我解决问题的网络资源:

答案 1 :(得分:3)

这是OpenCV抛出的运行时错误。如果您查看previous question的CMake日志,可以看到其中一个不可用包是 dynamiccuda ,这似乎就是那个错误抱怨。

但是,我没有很多Windows OpenCV的经验,因此可能是一个红鲱鱼。我的直觉是,你没有在路径上正确地拥有所有的库。你确定在PATH上有CUDA lib / include / bin吗?您确定在路径上有OpenCV构建lib / include目录吗? Windows有一个非常简单的链接顺序,基本上只包括当前目录,PATH上的任何内容和主Windows目录。因此,我会尝试确保PATH上的所有内容都正确/您已将所有正确的库复制到文件夹中。

注意:这与编译/链接错误不同,因为它位于RUNTIME。因此,设置编译器路径无助于运行时链接错误。