由于“驱动程序关闭”导致cudaErrorCudartUnloading(错误29)

时间:2016-12-05 16:39:49

标签: c++ linux opencv cuda

我最近从github repo安装了opencv,并使用CUDA支持编译。我计划将公司框架从CPU更新到GPU版本,我遇到了一个反复出现的问题:

<div class="collage">
  <div class="collage-item"></div>
  <div class="collage-item"></div>
  <div class="collage-item"></div>
  <div class="collage-item"></div>
  <div class="collage-item"></div>
  <div class="collage-item"></div>
  <div class="collage-item"></div>
  <div class="btn">View all 11 photos</div>
</div>

这是什么,或者我如何追踪它? 从终端运行应用程序时,我没有错误,异常或分段错误。

编辑:

========= Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaStreamSynchronize. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2eeda3]
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcudart.so.7.5 (cudaStreamSynchronize + 0x15e) [0x421ce]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0x29a909]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 (_ZN2cv4cuda6Stream4ImplD1Ev + 0x6e) [0x29c0ee]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0x29c12a]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0x29a886]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0x29d08e]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__cxa_finalize + 0x8f) [0x37eaf]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0xbb033]
=========
========= Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaSetDevice. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2eeda3]
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcudart.so.7.5 (cudaSetDevice + 0x180) [0x2fa30]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0x29d0fd]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__cxa_finalize + 0x8f) [0x37eaf]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0xbb033]
=========
========= Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaFree. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2eeda3]
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcudart.so.7.5 (cudaFree + 0x186) [0x3c666]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0x29d0cd]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__cxa_finalize + 0x8f) [0x37eaf]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0xbb033]
=========
========= Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaSetDevice. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2eeda3]
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcudart.so.7.5 (cudaSetDevice + 0x180) [0x2fa30]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0x29d0fd]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__cxa_finalize + 0x8f) [0x37eaf]
=========     Host Frame:/usr/local/lib/libopencv_core.so.3.1 [0xbb033]
=========
========= LEAK SUMMARY: 0 bytes leaked in 0 allocations
========= ERROR SUMMARY: 4 errors

为了您的方便,最小#include <opencv2/imgproc/imgproc.hpp> #include <opencv2/cudaimgproc.hpp> #include <opencv2/core/cuda.hpp> #include <opencv2/cudaobjdetect.hpp> #include <opencv2/cudafeatures2d.hpp> #include <iostream> #include <stdio.h> #include <chrono> int detectAndDisplay( cv::Mat frame, cv::Ptr<cv::cuda::CascadeClassifier> & cascade_gpu ) { cv::cuda::GpuMat image_src, image_grey; std::vector<cv::Rect> faces; image_src.upload(frame); cv::cuda::cvtColor(image_src, image_grey, CV_BGR2GRAY); cv::cuda::equalizeHist(image_grey, image_grey); cascade_gpu->setFindLargestObject(true); cascade_gpu->setScaleFactor(1.23); cascade_gpu->setMinNeighbors(3); cascade_gpu->setMinObjectSize(cv::Size(0, 0)); cascade_gpu->setMaxObjectSize(image_src.size()); cv::cuda::GpuMat buffer; cascade_gpu->detectMultiScale(image_grey, buffer); cascade_gpu->convert(buffer, faces); return faces.size(); } int main( int argc, const char* argv[] ) { cv::String face_cascade_name = "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"; cv::Mat image; image = cv::imread("catniss.jpeg", CV_LOAD_IMAGE_COLOR); cv::Ptr<cv::cuda::CascadeClassifier> cascade_gpu; cascade_gpu = cv::cuda::CascadeClassifier::create(face_cascade_name); for (int j = 0; j < 100; j++) { detectAndDisplay(image, cascade_gpu); } return 0; }

CMakeLists.txt

按照典型的构建阶段,然后运行

cmake_minimum_required(VERSION 2.6)
project(face_detection)
add_executable(face_detection source/main.cpp)
find_package(OpenCV REQUIRED)
target_link_libraries(face_detection  ${OpenCV_LIBS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-std=c++1y")

我安装了一个带有相应驱动程序的CUDA 7.5的Debian cuda-memcheck --leak-check full ./face_detection ,在两个GTX 660上运行。

1 个答案:

答案 0 :(得分:3)

您能告诉我们您的代码或做一个简短的例子吗?如果没有它,很难指出你的错误。

发生此错误消息是因为在卸载运行时后使用了一些cudaCalls。

如果您将GpuMat用作全局变量或静态变量,则会发生这种情况。

您可以忽略这些警告,或者在调用应用程序的析构函数之前确保所有cuda运行时调用都已完成。