並行計算 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");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM