OpenCV OpenCL Thread Saftey - Deadlock (将 cv::Mat 更改为 UMat)
OpenCV OpenCL Thread Saftey - Deadlock (changing cv::Mat to UMat)
我一直在使用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
相关文章:
- Difference in displaying cv2 Mat
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 将CHW格式的浮点向量转换为cv::Mat
- C++中的openCV Mat访问冲突
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 将 cv::Mat 转换为 std::vector 的通用函数
- 如何通过引用传递OpenCV MAT
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 将 OpenCv Mat 从 C++ 传递给 Python
- 如何发送 Mat H=findHomography 返回 Matlab
- 将帧从 h264 流解码到 OpenCV Mat
- 是否有MAT ARITHMETIC 运算符替代UMAT
- OpenCV OpenCL Thread Saftey - Deadlock (将 cv::Mat 更改为 UMat)