-1

プロセッサー時間を理解するのに苦労しています。このプログラムの結果:

#include <iostream>
#include <chrono>

// the function f() does some time-consuming work
void f()
{
    volatile long double d;
    int size = 10000;
    for(int n=0; n<size; ++n)
       for(int m=0; m<size; ++m)
           d = n*m;
}

int main()
{
    std::clock_t start = std::clock();
    f();
    std::clock_t end = std::clock();

    std::cout << "CPU time used: "
              << (end - start)
              << "\n";
}

210 000、220 000、230 000 の間でランダムに変動しているようです。なぜこれらの離散値なのか、最初は驚きました。次に、おおよそのプロセッサ時間std::clock()のみを返すことがわかりました。おそらく、によって返される値は10,000 の倍数に丸められます。これは、CPU 時間の最大差が 20,000 である理由も説明します (10,000 == への最初の呼び出しによる丸め誤差と 2 番目の呼び出しによる 10,000)。std::clock()std::clock()

int size = 40000;しかし、 の本体でに変更するとf()、丸めでは説明できない 3 400 000 から 3 500 000 の範囲の変動が得られます。

ウィキペディアでクロックレートについて読んだことから:

CPU は、各命令を実行するために一定数のクロック ティック (またはクロック サイクル) を必要とします。クロックが速いほど、CPU が 1 秒間に実行できる命令が多くなります。

つまり、プログラムが決定論的である場合 (私の場合はそうであることを願っています)、終了に必要な CPU 時間は次のようになります。

  1. いつも同じ
  2. 実行された命令の数よりもわずかに多い

私のプログラムは少なくとも3 * size * size命令を実行する必要があるため、私の実験ではどちらも示されません。私が間違っていることを説明していただけますか?

4

4 に答える 4

2

あなたのプログラムは決定論的ではないライブラリとシステム関数を使用しているため、決定論的ではありません。

特定の例として、メモリを割り当てる場合、これは仮想メモリであり、物理メモリにマップする必要があります。これはカーネル コードを実行するシステム コールですが、スレッド上で実行され、クロック タイムにカウントされます。これにかかる時間は、全体的なメモリ割り当ての状況によって異なります。

于 2013-05-02T13:44:42.413 に答える