1

私は自分のコードパフォーマンス(OpenCLカーネルの実行)を測定しようとしていますが、スピードアップを本当に理解する必要があります。clock()関数とclock_gettime()関数を使用してみました。

最初のケースでは、私のコードは単純でわかりやすく、正しく測定されています。

    struct timespec start_r, start_m, stop_r, stop_m;
    double realtime, monotonic;

    time_t start2 = clock();

    if(clock_gettime(CLOCK_REALTIME, &start_r) == -1) {
        cout << "clock realtime error!" << endl;
    }

    if(clock_gettime(CLOCK_MONOTONIC, &start_m) == -1) {
        cout << "clock realtime error!" << endl;
    }

        double res = 0.0;
        for(unsigned long i = 0; i < total; i++) {
            res += data[i];
        }

    cout << "res = " << res << endl;

    time_t end2 = clock();
    if(clock_gettime(CLOCK_REALTIME, &stop_r) == -1) {
        cout << "clock realtime error!" << endl;
    }

    if(clock_gettime(CLOCK_MONOTONIC, &stop_m) == -1) {
        cout << "clock realtime error!" << endl;
    }

    cout << "Time clock() = " << (end2 - start2)/(double)CLOCKS_PER_SEC << endl;

    realtime = (stop_r.tv_sec - start_r.tv_sec) + (double)(stop_r.tv_nsec - start_r.tv_nsec) / (double)BILLION;
    monotonic = (stop_m.tv_sec - start_m.tv_sec) + (double)(stop_m.tv_nsec - start_m.tv_nsec) / (double)BILLION;

    cout << "Realtime = " << realtime << endl << "Monotonic = " << monotonic << endl;

それは理解できる結果をもたらします-3つの結果はすべてほぼ同じです。

OpenCLカーネルの実行時間の測定に関しては、まったく同じことを行いますが、得られる結果はひどいものです。

Time = 0.04
Realtime = 0.26113
Monotonic = 0.26113

何が悪いのか教えていただけますか?OpenCLカーネルのパフォーマンスを測定する通常の問題である場合、それを測定するための最良の方法を提案できますか?ありがとう!

4

2 に答える 2

2

この関数clockは、一部のシステムでは、アプリケーションが使用するCPU時間を測定します。アプリケーションがOpenCLを使用している場合、グラフィックカードによって実際の計算が実行されるのを待つためにほとんどの時間が費やされる可能性があるためclock、「結果を得るのにかかったリアルタイム」は得られません。これは、ファイルからデータを読み取るときに使用するのと似てclockいます。たとえば、ファイルから100MBを読み取るのにかかる時間はおそらく2秒です。ただし、コマンドをハードディスクに送信し、ハードディスクコントローラによってメモリに保存されたデータを収集するために必要なCPU時間はわずか0.01秒です。したがって、clockは「2s」ではなく「0.01s」を与えます。

于 2013-03-22T16:24:53.890 に答える
2

C++11 コンパイラにアクセスできる場合は、代わりに std::chrono の使用を検討してください: http://en.cppreference.com/w/cpp/chrono

新しい C++ 標準には、次の 3 つのクロック タイプが組み込まれています。

  1. std::steady_clock
  2. std::system_clock
  3. std::high_resolution_clock

さらに、ライブラリは、マイクロ秒の精度が必要な場合でも、その他の精度が必要な場合でも、さまざまなレベルの粒度を処理できるように適切に設計されています。私が過去に書いたソフトウェア(大規模な産業工学タイプのシミュレーション)については、 std::steady_clock に頼って、すべてのタイミングを文句なしに実行しました:-)。

于 2013-03-22T16:06:04.080 に答える