web-dev-qa-db-ja.com

C ++ OpenMPコードで実行時間を測定する

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

#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プログラムで時間を測定するために使用する他のタイミング関数を私に提案したりできますか?

ありがとう。

27
Benny

リアルタイムではなく、CPU時間を報告するclock()を見ました。

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

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;

代わりに時間を計る

17
sehe

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

これはexactlyclock()が行うこと-プロセスが使用するCPU時間を測定します。これは、少なくともLinuxおよびMac OS Xでは、これまでに実行されたすべてのスレッドの累積CPU時間を意味します開始以来、プロセスに存在していました。

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

35
Hristo Iliev

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

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

5
Ben Voigt
#include "ctime"

std::time_t start, end;
long delta = 0;
start = std::time(NULL);

// do your code here

end = std::time(NULL);
delta = end - start;

// output delta
0
Erdinc Ay