paralle_for_設置成n個線程,則實際只有n-1線程並行,第n個線程會等待其他線程運行結束后再執行,所以n=1和n=2實際上都是串行。也可以不設置,會默認開啟一些線程。
【使用方式】
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"); }