Repository: opencv
Issue: cudaErrorCudartUnloading (error 29) due to “driver shutting down”
Labels: bug,priority: low,category: gpu/cuda (contrib)

##### System information (version)

- OpenCV => 3.1
- Operating System / Platform => Debian Jessie 8.0
- Compiler => gcc 4.9:

##### Detailed description

I am running a simple face detection test using the `cuda` version:

```cpp
#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;
}
```

The application complies and runs fine, but looking for leaks and other issues using `cuda-memcheck --leak-check full ./face_detection` I get the following errors:

```sh
========= 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
```

##### Steps to reproduce

1. copy-paste above code to `main.cpp`
2. `mkdir build && cd build && cmake ..`
3. `wget https://metrouk2.files.wordpress.com/2013/07/ay114305102the-hunger-games.jpg?quality=80&strip=all -O catniss.jpg`
3. `make`
4. `cuda-memcheck --leak-check full ./face_detection` 

You can use the below `CMakeLists.txt`:

```cmake
cmake_minimum_required(VERSION 2.6)
project(face_detection)
add_executable(face_detection main.cpp)
find_package(OpenCV REQUIRED)
target_link_libraries(face_detection  ${OpenCV_LIBS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-std=c++1y")
```