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

标签 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 (Ubuntu 16.04) 上使用 OpenCV 3.4,并尝试使用 intel 和 Nvidia GPU 卡,两者都有同样的问题。

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

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

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

最佳答案

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

除 clSetKernelArg 外,所有 OpenCL API 调用都是线程安全的

...OpenCL 是线程安全的,但您看到的死锁是在 OpenCV (cv::ocl::OpenCLAllocator) 内部,而不是 OpenCL,AFAICT。因此,您可能需要询问 OpenCV 开发人员。

关于c++ - OpenCV OpenCL 线程安全 - 死锁(将 cv::Mat 更改为 UMat),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48193735/

相关文章:

c++ - GDB:如何将内存地址转换为STL对象

python - 为什么 GIL 不会阻止 Python I/O 绑定(bind)任务?

python-3.x - 使用Opencv Python每秒播放一帧

python - 属性错误 : module 'cv2.cv2' has no attribute 'createLBPHFaceRecognizer'

c++ - 为指针赋值

c++ - C函数反转char数组字符串

java - 处理 ForkJoinPool 任务/操作中未捕获异常的更好方法

c++ - 使用 CascadeClasifier 与 FaceRecognizer (FisherFace) 的 OpenCV 性别分类

c++ - 如何在不刷新的情况下运行 ESP32 的单元测试?

java - 2 个线程中 wait() 和 notifyall() 调用期间的非 volatile 变量值