2016-05-07 10 views
0

cプログラムの合計所要時間を計算するには、通常、<time.h>にあるclock()time()という関数を使用します。
clock()は、CPUが使用したティック数(CLOCKS_PER_SEC)を測定した後、CLOCKS_PER_SECで計算したいコードスニペットの開始点と終了点の差を簡単に分けることができます。これは、時間を秒単位で取得するのに役立ちます。
time(null)は、特定の時点からの秒数を返します。 here

ここに私の問題があります。 OpenMPを使用して実行すると、システムに存在するすべてのプロセッサーを使用する通常のCプログラムによって実行された合計時間(文書処理の高速化に要する時間)を計算するために、時間を計算する最良の方法は何ですか。 clock()だけで、基本的

(actual_time_taken x omp_get_max_threads())

と時間(各プロセッサ上でプログラムを実行するのにかかる累積時間)を返すように私は、ミリ秒単位の時間の計算に興味として計算するための非常に漠然とした方法があります。並列プログラムの時間計算

+0

IMHOこれはhttps://stackoverflow.com/questions/12392278/measure-time-in-linux-time-vs-clock-vs-getrusage-vs-clock-gettime-vs-gettimeofの複製です。私の個人的なお勧めは 'clock_gettime(CLOCK_MONOTONIC_RAW ...')です。残念ながら、銀色の弾丸はありません。時計の品質と移植性の間にトレードオフがあり、もちろん必要です。 – Zulan

+3

私は見ませんでしたomp_get_wtimeを回避するための理由Windowsの場合、クエリパフォーマンスAPIに基づいている可能性があるなど、OSによってタイマーの品質に問題がある場合は、合理的な解決方法が必要です。 – tim18

答えて

3

OpenMPはこれを正確に行うためにomp_get_wtime()を提供します。あなたのコードでこの関数を使わない何らかの理由はありますか?

-1

Cでプログラミングしているので、関数getrusage()を使用する必要があります。これにより、プロセス全体とその子プロセス、現在のプロセスだけ、またはすべてのスレッドのシステムとユーザーのモード時間が表示されます。開始時に1回、終了時に1回呼び出してから、その差を取ってください。

+0

この回答は多くのレベルで間違っています:1) 'TICKS_PER_SEC'はCPUの周波数とは関係ありません。これはヘッダー '#define'なので、おそらく頻度を参照することはできません。したがって、 'clock'がタイムスタンプカウンタ(TSC)を直接使用することは不可能です。 2)現代のCPUは[constant TSC](https://en.m.wikipedia.org/wiki/Time_Stamp_Counter#Implementation_in_various_processors)を持っているので、周波数スケーリングにもかかわらずTSCを使うことができます。 – Zulan

+0

最新のCPUで '1M 'と定義されている' CLOCKS_PER_SEC'では単純な誤称であると思われ、 'clock()'から読み取られたdouble値の差で使用して操作秒数を決定することができます。 –

+0

@Zulan:OK、私は答えのその部分を削除し、私はかなり良いアドバイスであると確信している部分を残しました。 :) ありがとうございました。 –