2011-10-27 8 views
1

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

私の質問は何ですか?この問題にはどのような機能がありますか? clock_gettime()またはmb gettimeofday()?何か他に何かありますか?

clock_gettime()の場合は、どの時計ですか? CLOCK_REALTIMEまたはCLOCK_MONOTONIC?私はクロック()は、すべてのスレッド間での合計CPU使用率をカウントし、私もこの問題を抱えていたと思うのMac OS Xの(ユキヒョウに)

答えて

1

を使用して

...

ウォールクロックタイミング方法の選択個人的な好みです。私はタイムスタンプを取るためにインラインラッパー関数を使用しています(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); 
3

したい場合は、壁時計時間を、およびclock_gettime()が利用可能です、それは良い選択です。時間間隔を測定する場合はCLOCK_MONOTONIC、実際の時刻を取得する場合はCLOCK_REALTIMEを使用してください。

CLOCK_REALTIMEは実際の時刻を示しますが、システム時間の調整の影響を受けます。プログラムを実行している間にシステム時間を調整すると、それを使用した間隔の測定値が混乱します。

CLOCK_MONOTONICは正確な時刻を示しませんが、同じレートでカウントされ、システム時刻の変更に影響されません。したがって、間隔の測定には理想的ですが、正しい時刻が表示またはタイムスタンプに必要です。

関連する問題