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"); }
原文:https://www.cnblogs.com/xixixing/p/12340800.html