OpenCV C++ 多线程加速

Posted

技术标签:

【中文标题】OpenCV C++ 多线程加速【英文标题】:OpenCV C++ multithreading speedups 【发布时间】:2015-12-12 15:31:55 【问题描述】:

对于下面的代码,这里有一点上下文。

Mat img0; // 1280x960 grayscale

--

timer.start();
for (int i = 0; i < img0.rows; i++)

    vector<double> v;
    uchar* p = img0.ptr<uchar>(i);
    for (int j = 0; j < img0.cols; ++j)
    
        v.push_back(p[j]);
    

cout << "Single thread " << timer.end() << endl;

timer.start();
concurrency::parallel_for(0, img0.rows, [&img0](int i) 
    vector<double> v;
    uchar* p = img0.ptr<uchar>(i);
    for (int j = 0; j < img0.cols; ++j)
    
        v.push_back(p[j]);
    
);
cout << "Multi thread " << timer.end() << endl;

结果:

Single thread 0.0458856
Multi thread 0.0329856

加速几乎不明显。

我的处理器是 Intel i5 3.10 GHz

内存 8 GB DDR3

编辑

我也尝试了一种稍微不同的方法。

vector<Mat> imgs = split(img0, 2,1); // `split` is my custom function that, in this case, splits `img0` into two images, its left and right half

--

timer.start();
concurrency::parallel_for(0, (int)imgs.size(), [imgs](int i) 
    Mat img = imgs[i];
    vector<double> v;
    for (int row = 0; row < img.rows; row++)
    
        uchar* p = img.ptr<uchar>(row);
        for (int col = 0; col < img.cols; ++col)
        
            v.push_back(p[col]);
        
    

);
cout << " Multi thread Sectored " << timer.end() << endl;

我得到了更好的结果:

Multi thread Sectored 0.0232881

所以,看起来我在运行时正在创建 960 个线程之类的东西

parallel_for(0, img0.rows, ...

但效果并不好。

(我必须补充一点,Kenney 的评论是正确的。不要与我在这里所说的具体数字有太多的相关性。在测量这样的小区间时,会有很大的变化。但总的来说,我在编辑中写的,关于将图像分成两半,与旧方法相比提高了性能。)

【问题讨论】:

多线程有开销;尝试使用更大或更密集的 CPU,以便运行时间大约为一秒(或至少 0.1 秒)。我想你会看到更大的加速。 是的,这是真的。我得到的时间变化很大。现在我坚持使用它们,因为我不想更改问题中的所有代码。 【参考方案1】:

我认为您的问题是您受到内存带宽的限制。您的第二个 sn-p 基本上是从整个图像中读取,并且必须从主内存中进入缓存。 (或者出L2缓存进入L1缓存)。

您需要安排您的代码,以便所有四个内核同时在同一个内存位上工作(我认为您不是实际上试图优化此代码 - 这只是一个简单的示例)。

编辑:在最后的括号中插入关键的“not”。

【讨论】:

以上是关于OpenCV C++ 多线程加速的主要内容,如果未能解决你的问题,请参考以下文章

加速总结循环的多线程 C++ 程序

多线程中的 OpenCV CascadeClassifier C++ 接口

OpenCV C++ 多线程提高帧率

在多线程应用程序中使用 opencv waitKey()

opencv 多进程的小加速

c++ && OpenCV的多线程实时视频传输(TCP on Windows)