35

(i) シーケンシャル スタイルで、(ii) OpenMP ステートメントを使用して .cpp コードを実行しています。時差を見てみます。時間を計算するために、私はこれを使用します:

#include <time.h>
.....
main()
{

  clock_t start, finish;
  start = clock();
  .
  .
  .
  finish = clock();

  processing time = (double(finish-start)/CLOCKS_PER_SEC);

 }

時間は、コードのシーケンシャル (上記) 実行ではかなり正確です。これを実行するのに約 8 秒かかります。コードに OpenMP ステートメントを挿入してから時間を計算すると、時間は短縮されますが、表示される時間はコンソールで約 8 ~ 9 秒ですが、実際にはリアルタイムでわずか 3 ~ 4 秒です。

私のコードが抽象的にどのように見えるかは次のとおりです。

#include <time.h>
.....
main()
{

  clock_t start, finish;
  start = clock();
  .
  .
  #pragma omp parallel for
  for( ... )
     for( ... )
       for (...)
    {           
      ...;      
    }
  .
  .
  finish = clock();

  processing time = (double(finish-start)/CLOCKS_PER_SEC);

 }

上記のコードを実行すると、時間は短縮されますが、表示される時間はリアルタイムでは正確ではありません。clock() 関数が各スレッドの個々の時間を計算し、それらを合計して表示しているように私には思えます。

誰かがこの理由を教えてくれますか、または OpenMP プログラムで時間を測定するために使用する他のタイミング関数を提案してもらえますか?

ありがとう。

4

5 に答える 5

51

clock()関数は、各スレッドの個々の時間を計算し、それらを合計して表示しているように見えます。

これはまさにそのとおりですclock()。プロセスで使用されるCPU時間を測定します。これは、少なくともLinuxおよびMac OS Xでは、プロセスが開始されてからプロセスに存在したことのあるすべてのスレッドの累積CPU時間を意味します。

OpenMPアプリケーションの実時計(別名壁掛け時計)のタイミングは、過去の任意の時点からの秒数の値omp_get_wtime()を返す高解像度のOpenMPタイマー呼び出しを使用して実行する必要があります。doubleこれは移植可能な関数であり、たとえば、Unixのみの場合とは異なり、UnixとWindowsの両方のOpenMPランタイムに存在しますgettimeofday()

于 2012-06-03T22:20:23.217 に答える
21

clock()がリアルタイムではなくCPU時間を報告しているのを見てきました。

あなたが使うことができます

struct timeval start, end;
gettimeofday(&start, NULL);

// benchmark code

gettimeofday(&end, NULL);

delta = ((end.tv_sec  - start.tv_sec) * 1000000u + 
         end.tv_usec - start.tv_usec) / 1.e6;

代わりに物事の時間を計る

于 2012-06-03T22:21:30.233 に答える
6

そうですね、そうするclock()ことになっています。プログラムが使用したプロセッサ時間の長さを教えてください。

CPU時間ではなく、経過したリアルタイムを検索する場合は、などの実時間を返す関数を使用しますgettimeofday()

于 2012-06-03T22:20:13.013 に答える