相关疑难解决方法(0)

如何在2019年在OpenCV中正确多线程?

背景:

我在OpenCV中阅读了一些关于多线程的文章和帖子:

  • 一方面,您可以使用TBB或OpenMP支持构建OpenCV,从而在内部并行化OpenCV的功能.
  • 另一方面,您可以自己创建多个线程并并行调用函数以在应用程序级别实现多线程.

但我无法得到一致的答案,哪种多线程方法是正确的方法.

关于TBB,2012年的答案有5个赞成票:

使用WITH_TBB = ON时,OpenCV会尝试使用多个线程来执行某些功能.问题是目前只有一个功能强大的TBB(可能是十几个).所以,很难看到任何加速.这里的OpenCV理念是应用程序应该是多线程的,而不是OpenCV函数.[...]

关于应用程序级别的多线程,主持人对answers.opencv.org评论:

请避免在opencv中使用自己的多线程.很多函数显然不是线程安全的.而是使用TBB或openmp支持重建opencv库.

但有3个赞成票的另一个答案是:

库本身是线程安全的,因为您可以同时多次调用库,但数据并不总是线程安全的.

问题描述:

所以我认为在应用程序级别上使用(多)线程至少是可以的.但是,当我的程序运行较长时间时,我遇到了奇怪的性能问题.

在研究了这些性能问题之后,我创建了这个最小,完整且可验证的示例代码:

#include "opencv2\opencv.hpp"
#include <vector>
#include <chrono>
#include <thread>

using namespace cv;
using namespace std;
using namespace std::chrono;

void blurSlowdown(void*) {
    Mat m1(360, 640, CV_8UC3);
    Mat m2(360, 640, CV_8UC3);
    medianBlur(m1, m2, 3);
}

int main()
{
    for (;;) {
        high_resolution_clock::time_point start = high_resolution_clock::now();

        for (int k = 0; k < 100; k++) {
            thread t(blurSlowdown, nullptr);
            t.join(); …
Run Code Online (Sandbox Code Playgroud)

c++ performance multithreading opencv vectorization

20
推荐指数
1
解决办法
3266
查看次数

C++中的多线程图像处理

我正在制作一个操纵不同尺寸图像的程序.这些操作中的许多操作从输入读取像素数据并写入单独的输出(例如模糊).这是基于每个像素完成的.

这种图像映射在CPU上非常紧张.我想用多线程来加快速度.我该怎么做?我想要为每行像素创建一个线程.

我有几个要求:

  • 必须最小化可执行文件大小.换句话说,我不能使用大量的库.什么是C/C++最轻量级的便携式线程库?
  • 必须最小化可执行文件大小.我想有一个函数forEachRow(fp*),它为每一行运行一个线程,甚至是一个forEachPixel(fp*),其中fp在自己的线程中的一个像素上运行.哪个最好?
    • 我应该使用普通函数或函子或函数或某些lambda函数还是......其他什么?
    • 某些操作使用优化,这些优化需要处理前一个像素的信息.这使得forEachRow有利.即使考虑到这一点,使用forEachPixel会更好吗?
  • 我需要锁定只读和只写数组吗?
    • 输入仅从中读取,但许多操作需要从阵列中的多个像素输入.
    • 每个像素只输出一次输出.
  • 速度也很重要(当然),但优化可执行文件大小优先.

谢谢.

有关这个主题的更多信息:C++并行化库:OpenMP与线程构建块

c++ parallel-processing optimization multithreading image-processing

11
推荐指数
3
解决办法
1万
查看次数