OpenCV OpenCL 线程安全 - 死锁(将 cv::Mat 更改为 UMat)
Posted
技术标签:
【中文标题】OpenCV OpenCL 线程安全 - 死锁(将 cv::Mat 更改为 UMat)【英文标题】:OpenCV OpenCL Thread Saftey - Deadlock (changing cv::Mat to UMat) 【发布时间】:2018-01-10 18:15:13 【问题描述】:我一直在将 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,并尝试过使用英特尔和 Nvidia GPU 卡,两者都有同样的问题。
使用 UMat 的 OpenCL 是否意味着线程安全?我绝不会同时在同一个线程中处理相同的数据。数据通过与 Mat 结构一起使用的指针在线程之间传递。
我猜它应该是线程安全的,否则根本不需要锁。
这是一个错误还是我做错了什么?有解决方法吗?
【问题讨论】:
【参考方案1】:OpenCL 1.2 PDF,A.2 多主机线程:
All OpenCL API calls are thread-safe except clSetKernelArg
...OpenCL 是线程安全的,但您看到的死锁在 OpenCV (cv::ocl::OpenCLAllocator) 内部,而不是 OpenCL、AFAICT。因此,您可能需要询问 OpenCV 开发人员。
【讨论】:
我已在 OpenCV 论坛上发帖。那么这可能是 OpenCV 中的一个错误?【参考方案2】:这是 OpenCV 中的一个错误,社区迅速响应并在拉取请求中解决了它。
http://answers.opencv.org/question/182280/opencv-opencl-thread-saftey-deadlock-changing-cvmat-to-umat/
https://github.com/opencv/opencv/pull/10605
【讨论】:
以上是关于OpenCV OpenCL 线程安全 - 死锁(将 cv::Mat 更改为 UMat)的主要内容,如果未能解决你的问题,请参考以下文章