2012-05-20 20 views
5

私はOpenMP経由で並列化するためのシーケンシャルコードを持っています。対応するプラグマを入れてテストしています。テスト中は、主な機能で費やされた時間をチェックすることでパフォーマンスの向上を解釈します。奇妙なことは、cpu_time()で計算された経過時間であり、omp_get_wtime()は2つの異なる結果を返します。理由は何だと思いますか?OpenMPのtimeとclock()は2つの異なる結果を計算します

cpu_time()関数で計算された経過時間は、逐次時間と似ています。

計算は

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_); 
を終了した後に計算が

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

を開始する前

サンプル結果

7.009537 - 11.575277 seconds. 

答えて

11

clock機能策CPU時間、それは実行時に渡されたとして、あなたはCPUに積極的に費やす時間は、OMP機能は、2つの完全に異なるものを時間を測定します。

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

+5

Windowsでは、 'clock()'は実際に壁の時間を測定します。 – Mysticial

+1

@Mysticial、もう一度、彼らはスタンダードではなく、自分の気分に従っているようです。 * clock関数は、プログラム呼び出しにのみ関連する実装定義の時代が始まって以来、プログラムが使用しているプロセッサ時間に対する実装の最善の近似値を返します。 –

4

clock()機能は、CPU時間、ない時間を返します。代わりにgettimeofday()を使用してください。あなたが守っ何

6

は、任意の並列アプリケーションのための完全に有効な結果である - clock()によって返される組み合わせCPU時間をすべてのスレッドの通常、アプリケーションはほとんど寝たり待機している場合を除き、omp_get_wtime()で測定し壁時計時間以上のものです。

関連する問題