1

私は現在、アルゴリズムの 2 つの実装を行っています。1 つは C で、もう 1 つは CUDA で、実行時間に関して 2 つの間の比較を行う予定です。私の質問は、C と CUDA のランタイムを比較することを考えると、どの C タイマーを使用するのが最適かということです。CUDA の場合、私はイベントを使用する予定であり、clock() や gettimeofday() などの C の壁時計タイマーや、clock_gettime() などの高解像度タイマーについて読んだことがありますが、どの C を使用すればよいかわかりません。 C の時間を CUDA の時間と比較する場合は?

ありがとう :-)

4

4 に答える 4

3

アプリケーション レベルでのエンド ツー エンドの測定には、以下のコードのように、10 年以上使用してきた高精度のホスト タイマーを使用することをお勧めします。非常に短い可能性がある GPU アクティビティの詳細な測定については、CUDA イベントを使用することをお勧めします。

#if defined(_WIN32)
#if !defined(WIN32_LEAN_AND_MEAN)
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
double second (void)
{
    LARGE_INTEGER t;
    static double oofreq;
    static int checkedForHighResTimer;
    static BOOL hasHighResTimer;

    if (!checkedForHighResTimer) {
        hasHighResTimer = QueryPerformanceFrequency (&t);
        oofreq = 1.0 / (double)t.QuadPart;
        checkedForHighResTimer = 1;
    }
    if (hasHighResTimer) {
        QueryPerformanceCounter (&t);
        return (double)t.QuadPart * oofreq;
    } else {
        return (double)GetTickCount() * 1.0e-3;
    }
}
#elif defined(__linux__) || defined(__APPLE__)
#include <stddef.h>
#include <sys/time.h>
double second (void)
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (double)tv.tv_sec + (double)tv.tv_usec * 1.0e-6;
}
#else
#error unsupported platform
#endif
于 2012-07-30T16:26:44.780 に答える
1

比較的単純なものに固執するのがおそらく最善です。マイクロ秒の精度でタイムスタンプを提供する gettimeofday をお勧めします。計算の前後の時間を記録し、その 2 つを引きます。これを行うには、timersub マクロを使用できます。

http://linux.die.net/man/2/gettimeofday

http://linux.die.net/man/3/timercmp

于 2012-07-30T08:57:55.947 に答える
0
#include "time.h"

clock_t init, final;

init=clock();

...
//your sequential algoritm
...

final=clock()-init;
float seq_time ((double)final / ((double)CLOCKS_PER_SEC));
printf("\nThe sequential duration is %f seconds.", seq_time);

//Clock is initialized again
init=clock();

...
//your parallel algoritm
...

final=clock()-init;
float par_time ((double)final / ((double)CLOCKS_PER_SEC));
printf("\nThe parallel duration is %f seconds.", par_time);

printf("\n\nSpped up is %f seconds. (%dX Faster)", (seq_time - par_time), ((int)(seq_time / par_time)));
于 2012-07-30T21:08:26.867 に答える
0

次のコードを使用して、大成功/正確な成功を収めました。

#include <time.h>

long unsigned int get_tick()
{
  struct timespec ts;
  if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) return (0);
  return ts.tv_sec*(long int)1000 + ts.tv_nsec / (long int) 1000000;
}

次に、時間を計るコードで get_tick メソッドをその前後に配置し、2 つの変数を減算して結果を取得します。答えを 1000 で割ると数秒になります

于 2015-02-09T18:19:06.567 に答える