-1

我试图找出如何加快我的代码的某个部分。我有三个浮点变量: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 );

有人可以帮我加快找到这三个变量的过程并告诉我我做错了什么

4

1 回答 1

0

在此处critical查看pragma的规范。

这里有三个关键点:

1)如果你不给critical编译指示一个名字,它被映射到一些未指定的名字,并且相同的名字用于所有未命名的临界区。

2) 一次只能有一个线程可以在具有给定名称的任何关键部分中。

3) 当一个线程遇到临界区时,它会在那里等待,直到其中没有其他线程处于活动状态,然后才进入该临界区。

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

于 2013-03-04T20:32:56.253 回答