在OpenCV中使用gpu进行多线程

gcs*_*osh 5 c++ multithreading opencv gpu

我编写了一个程序,用于在一组图像上使用gpu :: BroxOpticalFlow计算光流。在单线程执行的情况下,代码可以编译并正常运行。

由于我试图为光流计算找到最佳的参数配置,因此需要在同一组图像上多次运行代码。因此,为了加快处理速度,我决定使用多线程来并行运行具有不同参数的多个光流计算。为此,我只需为每个光流过程创建一个线程,并使用完全不同的对象和变量。

运行代码时,有时会从计算光流的gpu函数中获取以下运行时错误:

OpenCV Error: Gpu API call (NCV Assertion Failed: cudaError_t=77, file=/home/user/opencv-2.4.10/modules/gpu/src/nvidia/NCVBroxOpticalFlow.cu, line=1018
) in outputHandler, file /home/user/opencv-2.4.10/modules/gpu/src/optical_flow.cpp, line 72
OpenCV Error: Gpu API call (NCV Assertion Failed: cudaError_t=77, file=/home/user/opencv-2.4.10/modules/gpu/src/nvidia/NCVBroxOpticalFlow.cu, line=1018
) in outputHandler, file /home/user/opencv-2.4.10/modules/gpu/src/optical_flow.cpp, line 72
OpenCV Error: Gpu API call (NCV Assertion Failed: cudaError_t=77, file=/home/user/opencv-2.4.10/modules/gpu/src/nvidia/NCVBroxOpticalFlow.cu, line=1018
) in outputHandler, file /home/user/opencv-2.4.10/modules/gpu/src/optical_flow.cpp, line 72
OpenCV Error: Gpu API call (an illegal memory access was encountered) in copy, file /home/user/opencv-2.4.10/modules/dynamicuda/include/opencv2/dynamicuda/dynamicuda.hpp, line 877
Run Code Online (Sandbox Code Playgroud)

显然,另一个线程访问了保留给另一个线程的内存位置。但是,根据我从OpenCV和CUDA文档中了解到的内容,每次CPU线程使用GPU函数时,都会创建具有专用资源的新上下文,并且其他线程无法访问该上下文。

我是否误解了多线程如何与GPU函数一起工作?有没有办法避免其他线程非法访问内存?