Opencv 多线程比单线程慢?

Opencv 多线程比单线程慢?,opencv,openmp,Opencv,Openmp,我试图找出如何加速我的代码的某一部分。我有三个浮点变量:var1,var2,var3 在顺序模式下 double start1, end1, t1; start1= (double)cvGetTickCount(); var1= tester->predict(videocapture, params1, image); var2= tester->predict(videocapture, params2, image); v

我试图找出如何加速我的代码的某一部分。我有三个浮点变量:var1,var2,var3

在顺序模式下

       double start1, end1, t1;
       start1= (double)cvGetTickCount();


    var1= tester->predict(videocapture, params1, image);
    var2= tester->predict(videocapture, params2, image);
    var3= tester->predict(videocapture, params3, image);

    end1= (double)cvGetTickCount();
    t1= (end1-start1)/((double)cvGetTickFrequency()*1000.);
    printf( "Time1  = %g ms\n", t1 );
它似乎比并行线程稍快一些

double start2, end2, t2;
start2= (double)cvGetTickCount();
mp_set_dynamic(0);     // Explicitly enable/disable dynamic teams
omp_set_num_threads(3); // Use 3 threads for all consecutive parallel regions
#pragma omp parallel num_threads(3)
{
   #pragma omp sections //nowait
      {


         #pragma omp section 
      { 
            #pragma omp critical
     { 
              var1= tester->predict(videocapture, params1, image);
               }
       }    

         #pragma  omp section 
          {
            #pragma omp critical 
             {
              var2= tester->predict(videocapture, params2, image);       
               }

       }

         #pragma omp section 
          {
           #pragma omp critical 
           {
              var3= tester->predict(videocapture, params3, image);
               } 

       }
          }
        }
     } 

    end2= (double)cvGetTickCount();
    t2= (end2-start2)/((double)cvGetTickFrequency()*1000.);
    printf( "Time2  = %g ms\n", t2 );

有人能帮我加快查找这三个变量的过程,并告诉我我做错了什么吗

这里有三个关键点:

1) 如果您没有为
临界
杂注指定名称,它将映射到某个未指定的名称,并且对所有未命名的临界段使用相同的名称

2) 一次只能有一个线程位于具有给定名称的任何关键部分中

3) 当一个线程遇到一个关键部分时,它会在那里等待,直到没有其他线程在其中处于活动状态,然后再进入它


因此,代码告诉所有线程等待,同时它们轮流一次执行代码的一项。这相当于串行执行操作,只是它首先需要生成线程的开销(以及由于等待而产生的任何开销,可能是忙着等待)。

问题是,如果我从代码中删除#pragma omp critical,那么我需要使用一些静态互斥锁m(使用m.lock(),m.unlock())用于视频捕获,它是从视频加载帧的部分,但是没有任何计算速度。否则我会出错。。。那么,你是不是建议在“关键”后面加个名字?谢谢,我不太确定这里到底需要什么
关键
,或者你在用
var
s做什么。事实上,看起来根本没有理由在这里使用
临界
;为什么您认为首先需要锁?即使没有任何锁,因为您只进行一次
predict
调用,所以没有理由让多个线程执行该调用。实际上,三个预测var1、var2、var3在一个视频帧中使用三个子窗口。最好有3个线程同时为每个帧执行预测,因此需要并行实现。var s只是一些简单分类任务的结果。我仍然不确定我是否理解您在这里做什么,或者为什么它需要锁定。你能不能在不使用
临界值的情况下尝试一下,告诉我出现了什么问题?