OpenCV OpenCL Thread Saftey - Deadlock (将 cv::Mat 更改为 UMat)

OpenCV OpenCL Thread Saftey - Deadlock (changing cv::Mat to UMat)

本文关键字:Mat UMat cv Thread OpenCL Saftey Deadlock OpenCV      更新时间:2023-10-16

我一直在使用cv::Mat将OpenCV程序转换为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(Ubuntu 16.04(上使用OpenCV 3.4,并尝试使用英特尔和Nvidia GPU卡,两者都有相同的问题。

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

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

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

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

All OpenCL API calls are thread-safe except clSetKernelArg

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

是OpenCV中的一个错误,社区迅速响应并在拉取请求中解决了它。

http://answers.opencv.org/question/182280/opencv-opencl-thread-saftey-deadlock-changing-cvmat-to-umat/

https://github.com/opencv/opencv/pull/10605