-1

コードの特定の部分を高速化する方法を見つけようとしています。var1、var2、var3 の 3 つの float 変数があります。

シーケンシャルモードで...

       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 );

誰かがこれらの3つの変数を見つけるプロセスをスピードアップして、私が間違っていることを教えてください

4

1 に答える 1

0

ここcriticalでプラグマの仕様を見てください。

ここには 3 つの重要なポイントがあります。

1)criticalプラグマに名前を付けないと、特定されていない名前にマップされ、名前のないすべてのクリティカル セクションに同じ名前が使用されます。

2) 指定された名前のクリティカル セクションには、一度に 1 つのスレッドしか存在できません。

3) スレッドがクリティカル セクションに遭遇すると、そこに移動する前に他のスレッドがアクティブでなくなるまで待機します。

したがって、コードは、一度にコードの 1 つの項目を順番に実行する間、すべてのスレッドに待機するように指示します。これは、最初にスレッドを生成するオーバーヘッドが必要になることを除けば、一連の操作を実行することと同じです (および待機のために発生するオーバーヘッド (ビジー待機の可能性があります))。

于 2013-03-04T20:32:56.253 に答える