小编Cri*_*ges的帖子

如何在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++ ×1

multithreading ×1

opencv ×1

performance ×1

vectorization ×1