并行计算 cv::parallel_for_() 函数

paralle_for_设置成n个线程,则实际只有n-1线程并行,第n个线程会等待其他线程运行结束后再执行,所以n=1和n=2实际上都是串行。也可以不设置,会默认开启一些线程。

【使用方式】

https://blog.csdn.net/qq_27825451/article/details/103878676?utm_source=distribute.pc_relevant.none-task

OpenCV中Mat属性step,size,step1,elemSize,elemSize1

parallel_for_整合了多个组件,并行框架执行顺序,参考https://blog.csdn.net/qq_31806429/article/details/79242399?utm_source=distribute.pc_relevant.none-task

//【说明】对一个Mat中所有的元素(按列为单位)做立方操作

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//-------------------------【1】继承ParallelLoopBody,重载运算符()-----------------//
//自定义类,继承自并行计算循环体类(ParallelLoopBody)
class myLoopBody : public ParallelLoopBody//构造一个并行的循环体类  
{
public:
    myLoopBody(Mat& _src)//自定义构造函数
    {
        src = &_src;
    }
    virtual void operator()(const Range& range) const// *必须此格式,重载操作符(在并行计算中要执行的操作)  
    {                                         
        Mat& srcMat = *src;
        for (int colIdx = range.start; colIdx < range.end; ++colIdx)
        {
            float* pData = (float*)srcMat.col(colIdx).data;
            for (int i = 0; i < srcMat.rows; ++i)
                pData[i*srcMat.cols] = std::pow(pData[i*srcMat.cols], 3);  //计算立方
        }
    }

private:
    Mat* src;
};

void parallelTestWithParallel_for_(InputArray _src)//'parallel_for_' 循环
{
    CV_Assert(_src.kind() == _InputArray::MAT);
    Mat src = _src.getMat();
    //-------------------------【2】启动循环 -----------------//
    parallel_for_(Range(0, src.cols), myLoopBody(src));  // * 注意调用语句,range是记录myTestBody循环体的首末位置。
    //-------------------------【3】控制线程数目,默认会开启一定数目的线程,可省略 -----------------//
    //setNumThreads(10);
    cout << getNumThreads() << endl; //获取线程数
};
int main()
{
    Mat testInput = Mat::ones(40, 400000,CV_8U);// 定义40行400000列,元素全为1的矩阵
    clock_t start, stop;

    start = clock();
    parallelTestWithParallel_for_(testInput);
    stop = clock();
    cout << "Running time using \'parallel_for_\':" << (double)(stop - start) / CLOCKS_PER_SEC * 1000 << "ms" << endl;

    system("pause");
}

 

posted @ 2020-02-21 11:55  夕西行  阅读(3438)  评论(0编辑  收藏  举报