1

これは私のc++コードです。

double start_time = time(NULL);
double start_clock = clock();

#pragma omp parallel for private(i) 
for(i=0;i<max_i;i++)
      PROCESS(i);

double end_time = time(NULL);
double end_clock = clock();

printf("%lf second(s)\n", end_time-start_time);
printf("%lf second(s)\n", (end_clock-start_clock)/CLOCKS_PER_SEC);

これが出力です。

took 2.000000 second(s)
took 11.410000 second(s)

これらが一貫していない理由を誰かが知っていますか?これを測定する他の方法はありますか?ところで、私がここで見ている時間に基づいて、2秒はより合理的なようです。

4

3 に答える 3

8

このclock()関数は、リアルタイムクロックによる絶対時間ではなく、プロセスが開始されてから使用されたCPU時間を返します。

別のコメントでCODE_BLOCKは、これは並列ループであるとおっしゃいました。つまり、あなたの場合、実際の(「壁時計」)時間の2秒で11.41秒のCPU時間に相当する時間を使用しました。明らかに、約6個のCPUの能力を並行して使用しています。

于 2012-09-01T00:20:03.353 に答える
1

これは役立つかもしれません:

int main() {
    double start_time = time(NULL);
    double start_clock = clock();

    sleep(10);

    double end_time = time(NULL);
    double end_clock = clock();

    printf("%lf second(s)\n", end_time-start_time);
    printf("%lf second(s)\n", (end_clock-start_clock)/CLOCKS_PER_SEC);
}

これの出力は次のとおりです。

10.000000 second(s)
0.000070 second(s)

したがって、何らかの方法でカーネルを呼び出している場合、またはプロセッサをホップオフしている場合、それは2つのタイマーのうちの1つにのみ表示されます。

OpenMPを使用していると述べたメモから:あなたがおそらく見ているのは乗数効果でもあります。openMPスレッドが8コアを使用している場合、2番目のタイマーは最初のタイマーの8倍をカウントします。

于 2012-09-01T00:17:45.900 に答える
0

コードブロックの内容を投稿しませんでしたが、プログラムの開始以降にプログラムが実行されている絶対時間をクロックティックで測定し、実際の量を測定しているため、通常、時間は異なります。プログラムが消費したCPU時間の割合。これらは2つの劇的に異なるものです。

また、から返される値clock()は浮動小数点値ではありません。それらclock_tは、整数型である型値でなければなりません。time()型を返す場合も同様ですtime_t。したがって、ある種の除算を実行し、結果として浮動小数点値が必要になるまで、それらを浮動小数点型に割り当てる必要はありません。

于 2012-09-01T00:14:17.833 に答える