opencv的并行操作parallel_for_的問題
第一次運行時,并行計算會比普通計算要快很多,如圖1所示。可是第二次運行,兩種方式所用時間基本差不多,有高手能指點下嗎?
這段程序我是參考了下面這篇文章:
OpenCV并行加速Parallel_for_與ParallelLoopBody教程_void operator()(const range& range)-CSDN博客
#include <iostream> #include<opencv2/opencv.hpp> #include<opencv2/core/utility.hpp> using namespace cv; using namespace std; class PllMul:public ParallelLoopBody//并行計算類 { public: PllMul(const Mat& _src1,const Mat&_src2,Mat& _result) { int cn=_src1.channels(); _src1.convertTo(src1,CV_32FC(cn)); _src2.convertTo(src2,CV_32FC(cn)); _result.convertTo(result,CV_32FC(cn)); CV_Assert(src1.channels()==src2.channels() &&src1.rows==src2.rows &&src1.cols==src2.cols); rows=src1.rows; cols=src1.cols; } void operator()(const Range&range)const //重載括號()運算符 { int totalPixs=range.end-range.start; float *presult=(float*)(result.data); float *ps1 =(float*)(src1.data); float *ps2 =(float*)(src2.data); int cn=src1.channels(); for(int i=0;i<totalPixs;i++) { for(int k=0;k<cn;k++) presult[k]=ps1[k]*ps2[k]; presult+=cn; ps1 +=cn; ps2 +=cn; } } Mat result;//為了方便測試,設為了共有成員 private: Mat src1; Mat src2; int rows; int cols; }; class MyMul //普通計算類 { public: MyMul(const Mat& _src1,const Mat&_src2,Mat& _result) { int cn=_src1.channels(); _src1.convertTo(src1,CV_32FC(cn)); _src2.convertTo(src2,CV_32FC(cn)); _result.convertTo(result,CV_32FC(cn)); CV_Assert(src1.channels()==src2.channels() &&src1.rows==src2.rows &&src1.cols==src2.cols); rows=src1.rows; cols=src1.cols; } void operator()(const Range&range)const //重載括號()運算符 { int totalPixs=range.end-range.start; float *presult=(float*)(result.data); float *ps1 =(float*)(src1.data); float *ps2 =(float*)(src2.data); int cn=src1.channels(); for(int i=0;i<totalPixs;i++) { for(int k=0;k<cn;k++) presult[k]=ps1[k]*ps2[k]; presult+=cn; ps1 +=cn; ps2 +=cn; } } Mat result;//為了方便測試,設為了共有成員 private: Mat src1; Mat src2; int rows; int cols; }; void testMllWithoutParallel(Mat &s1,Mat&s2,Mat&result1)//普通計算模式測試 { result1=Mat(s1.size(),s1.type(),Scalar::all(0)); PllMul mul(s1,s2,result1); mul(Range(0,s1.rows*s1.cols));//調用括號()運算符函數 cout<<"OK!"<<endl; } void testPllMllWithParallel(Mat&s1,Mat&s2,Mat&result)//并行計算模式測試 { result=Mat(s1.size(),s1.type(),Scalar::all(0)); // PllMul mul(); cv::parallel_for_(Range(0,s1.rows*s1.cols),PllMul(s1,s2,result));//隱式調用括號()運算符函數 cout<<endl<<"OK!"<<endl; } int main() { Mat s1(1000,1000,CV_8UC3),s2(1000,1000,CV_8UC3); Mat result1,result2; randu(s1,0,10);randu(s2,0,10); clock_t start,stop; start=clock(); testMllWithoutParallel(s1,s2,result1); stop=clock(); cout<<"Running time using \'parallel for \':" << (double)(stop - start) / CLOCKS_PER_SEC * 1000 << "ms" << endl; start=clock(); testPllMllWithParallel(s1,s2,result2); stop=clock(); cout << "Running time using \'common call function \':" << (double)(stop - start) / CLOCKS_PER_SEC * 1000 << "ms" << endl; return 0; }

圖1. 第一次運行結果

圖2. 第二次運行結果

浙公網安備 33010602011771號