マルチスレッドプログラムの測定時間

私は機能時計()で時間を測定しましたが、結果は悪かったです。つまり、1つのスレッドで同じプログラムを実行し、OpenMPで多くのスレッドを実行している同じプログラムに対して同じ結果が得られるということです。しかし、実際には、私は多くのスレッドプログラムの数がより速いことを私の時計で知っています。 だから私は壁時計のタイマーが必要です...

私の質問は次のとおりです。この問題に対して、より良い機能は何ですか? clock_gettime()またはmb gettimeofday()?何か他に何かありますか?

もしclock_gettime()ならば、どの時計ですか? CLOCK_REALTIMEまたはCLOCK_MONOTONIC?

mac os x(snow leopard)を使用して

1

2 答え

ウォールクロックの時間が必要で、 clock_gettime()が利用可能な場合は、これが良い選択です。時間間隔を測定する場合は CLOCK_MONOTONIC 、実際の時刻を取得する場合は CLOCK_REALTIME で使用してください。

CLOCK_REALTIME gives you the actual time of day, but is affected by adjustments to the system time -- so if the system time is adjusted while your program runs that will mess up measurements of intervals using it.

CLOCK_MONOTONIC doesn't give you the correct time of day, but it does count at the same rate and is immune to changes to the system time -- so it's ideal for measuring intervals, but useless when correct time of day is needed for display or for timestamps.

3
追加された

私はclock()がすべてのスレッドの中で合計CPU使用量を数えていると思いますが、私もこの問題がありました...

ウォールクロックのタイミング方法の選択は個人的な好みです。私はタイムスタンプを取るためにインラインラッパー関数を使用しています(2つのタイムスタンプの差を取って処理時間を取る)。私は便宜のために浮動小数点を使用しています(単位は秒であり、整数のオーバーフローについて心配する必要はありません)。マルチスレッドでは、私の意見では1マイクロ秒以下の時間に意味をなさない非常に多くの非同期イベントがあります。これはこれまで私にとって非常にうまくいきました:)

どのようなものを選んでも、ラッパーは実験する最も簡単な方法です

inline double my_clock(void) {
  struct timeval t;
  gettimeofday(&t, NULL);
  return (1.0e-6*t.tv_usec + t.tv_sec);
}

使用法:

double start_time, end_time;
start_time = my_clock();
//some multi-threaded processing
end_time = my_clock();
printf("time is %lf\n", end_time-start_time);
1
追加された