OpenCV OpenCL线程安全 - 死锁(将cv :: Mat更改为UMat)

时间:2018-01-10 18:15:13

标签: c++ multithreading opencv opencl deadlock

我一直在将OpenCV程序从使用cv :: Mat转换为cv :: UMat,目的是提高性能(它确实如此)。我遇到的是OpenCL代码中的死锁:

1  __lll_lock_wait                                                                                                                                                                                    lowlevellock.S                 135  0x7fffeeb6626d 
2  __GI___pthread_mutex_lock                                                                                                                                                                          pthread_mutex_lock.c           115  0x7fffeeb5fe42 
3  cv::ocl::OpenCLAllocator::copy(cv::UMatData *, cv::UMatData *, int, unsigned long const *, unsigned long const *, unsigned long const *, unsigned long const *, unsigned long const *, bool) const                                     0x7ffff2e9b44f 
4  cv::UMat::copyTo(cv::_OutputArray const&) const                                                                                                                                                                                        0x7ffff2ff13c8 
5  cv::UMat::clone                                                                                                                                                                                    mat.inl.hpp                    3685 0x7ffff75b78ff 


1  __lll_lock_wait                                                                                                                                                                                    lowlevellock.S                 135  0x7fffeeb6626d 
2  __GI___pthread_mutex_lock                                                                                                                                                                          pthread_mutex_lock.c           115  0x7fffeeb5fe42 
3  cv::ocl::OpenCLAllocator::copy(cv::UMatData *, cv::UMatData *, int, unsigned long const *, unsigned long const *, unsigned long const *, unsigned long const *, unsigned long const *, bool) const                                     0x7ffff2e9b44f 
4  cv::UMat::copyTo(cv::_OutputArray const&) const                                                                                                                                                                                        0x7ffff2ff13c8 
5  cv::UMat::clone                                                                                                                                                                                    mat.inl.hpp                    3685 0x7ffff75b78ff

我使用的代码是多线程的,在使用cv :: Mat结构之前完全没有问题。

似乎复制数据时会出现问题。

我在Linux上使用OpenCV 3.4(Ubuntu 16.04)并尝试使用intel和Nvidia GPU卡,两者都有同样的问题。

使用UMat的OpenCL是否意味着线程安全?在任何时候我都不会在同一个线程中同时处理相同的数据。数据通过与Mat结构一起使用的指针在线程之间传递。

我猜测它是线程安全的,否则根本不需要锁。

这是一个错误还是我做错了什么?有解决方法吗?

2 个答案:

答案 0 :(得分:1)

OpenCL 1.2 PDF,A.2多个主机线程:

All OpenCL API calls are thread-safe except clSetKernelArg

... OpenCL是线程安全的,但你看到的死锁是在OpenCV(cv :: ocl :: OpenCLAllocator)里面而不是OpenCL,AFAICT。所以你可能需要问OpenCV开发人员。

答案 1 :(得分:0)