我对OpenMP和OpenCV非常陌生。我正在尝试使用OpenCV和OpenMP减少差分两个图像的时间。但是使用OpenMP并行循环所花费的时间不仅仅是循环中的顺序.Kindly建议可以做什么。
我的代码是
int main ()
{
omp_set_num_threads(4);
double omp_time1,omp_time2;
cv::Mat image_1= cv::imread("1.png");
cv::Mat image_2=cv::imread("2.png");
vector<cv::Mat> rgb_planes_1;
cv::split( image_1, rgb_planes_1 );
vector<cv::Mat> rgb_planes_2;
cv::split( image_2, rgb_planes_2 );
cv::Mat sub_rgb_0[3];
#ifdef _OPENMP
omp_time1 = omp_get_wtime();
#endif
#pragma omp parallel private(tid)
{
tid = omp_get_thread_num();
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
printf("Thread %d starting...\n",tid);
#pragma omp for schedule(static)
for (i=0; i<3; i++)
{
absdiff(rgb_planes_1[i],rgb_planes_2[i],sub_rgb_0[i]);
}
}
#ifdef _OPENMP
omp_time2 = omp_get_wtime();
#endif
printf("Parallel::%f seconds.\n", omp_time2 - omptime1);
}
需要 平行:: 0.006757秒。
当我在没有OpenMP段的情况下尝试相同时,CPU时钟给出 0.00200秒。
答案 0 :(得分:0)
除了Alex和pburka给出的信息之外,你的sceduling对于如此少的循环次数并不是最佳选择,只有一轮的时间不能提供可靠的测量,请记住OpenCV是高度优化的并且使用自身TBB和SMID优化。所以你可能比用3通道Mat调用absdiff更好。