12

OpenMP を介して並列化する順次コードがあります。対応するプラグマを入れてテストしました。メイン関数で費やされた時間をチェックすることで、パフォーマンスの向上を測定します。

cpu_time()奇妙なことに、 と を介して計算された経過時間omp_get_wtime()は異なります。なんで?

による経過時間cpu_time()はシーケンシャル時間と同様です。

計算を開始する前に:

ctime1_ = cpu_time();
#ifdef _OPENMP
ctime1 = omp_get_wtime();
#endif

計算終了後:

ctime2_ = cpu_time();
#ifdef _OPENMP
ctime2 = omp_get_wtime();
#endif

cpu_time() 関数の定義:

double cpu_time(void)
{
  double value;
  value = (double) clock () / (double) CLOCKS_PER_SEC;
  return value;
}

印刷結果:

printf("%f - %f seconds.\n", ctime2 - ctime1, ctime2_ - ctime1_);

サンプル結果:

7.009537 - 11.575277 seconds.
4

3 に答える 3

18

関数は CPU 時間を測定します。これclockは、CPU でアクティブに費やした時間です。OMP 関数は、実行中に経過した時間を測定します。2 つのまったく異なるものです。

あなたのプロセスはどこかで待機中にブロックされているようです。

于 2012-05-20T13:26:25.467 に答える
12

あなたが観察したことは、どの並列アプリケーションでも完全に有効な結果です。アプリケーションがほとんどスリープまたは待機している場合を除いて、によって返されるすべてのスレッドの合計CPU 時間は、通常、によって測定されたウォールクロック時間clock()よりも長くなります。omp_get_wtime()

于 2012-05-20T16:00:22.070 に答える
6

このclock()関数は、時間ではなくCPU時間を返します。代わりに、を使用してください。gettimeofday()

于 2012-05-20T13:27:58.980 に答える