43

GPUとCPUのパフォーマンスを比較しようとしています。NVIDIA GPUの場合cudaEvent_t、非常に正確なタイミングを取得するためにタイプを使用しています。

CPUの場合、私は次のコードを使用しています。

// Timers
clock_t start, stop;
float elapsedTime = 0;

// Capture the start time

start = clock();

// Do something here
.......

// Capture the stop time
stop = clock();
// Retrieve time elapsed in milliseconds
elapsedTime = (float)(stop - start) / (float)CLOCKS_PER_SEC * 1000.0f;

どうやら、そのコードは数秒で数えている場合にのみ有効です。また、結果がかなり奇妙になることもあります。

Linuxで高解像度タイマーを作成する方法を知っている人はいますか?

4

7 に答える 7

60

clock_gettime高精度タイマーへの POSIX インターフェイスである を確認してください。

マンページを読んでも と の違いが気になる場合は、CLOCK_REALTIME と CLOCK_MONOTONIC の違いをCLOCK_REALTIME参照CLOCK_MONOTONICしてください。

完全な例については、次のページを参照してください: http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

#include <iostream>
#include <time.h>
using namespace std;

timespec diff(timespec start, timespec end);

int main()
{
    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    for (int i = 0; i< 242000000; i++)
        temp+=temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
    return 0;
}

timespec diff(timespec start, timespec end)
{
    timespec temp;
    if ((end.tv_nsec-start.tv_nsec)<0) {
        temp.tv_sec = end.tv_sec-start.tv_sec-1;
        temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
    } else {
        temp.tv_sec = end.tv_sec-start.tv_sec;
        temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    }
    return temp;
}
于 2011-07-19T15:27:24.243 に答える
20

これまでに紹介した情報を要約すると、これらは典型的なアプリケーションに必要な 2 つの機能です。

#include <time.h>

// call this function to start a nanosecond-resolution timer
struct timespec timer_start(){
    struct timespec start_time;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time);
    return start_time;
}

// call this function to end a timer, returning nanoseconds elapsed as a long
long timer_end(struct timespec start_time){
    struct timespec end_time;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time);
    long diffInNanos = (end_time.tv_sec - start_time.tv_sec) * (long)1e9 + (end_time.tv_nsec - start_time.tv_nsec);
    return diffInNanos;
}

以下は、入力のリストの分散を計算するのにかかる時間を測定するためにそれらを使用する方法の例です。

struct timespec vartime = timer_start();  // begin a timer called 'vartime'
double variance = var(input, MAXLEN);  // perform the task we want to time
long time_elapsed_nanos = timer_end(vartime);
printf("Variance = %f, Time taken (nanoseconds): %ld\n", variance, time_elapsed_nanos);
于 2013-11-11T03:07:55.453 に答える
1

実時間(実際に経過する時間)またはサイクル数(サイクル数)に関心がありますか?最初のケースでは、のようなものを使用する必要がありますgettimeofday

最高解像度のタイマーは、RDTSCx86アセンブリ命令を使用します。ただし、これはクロックティックを測定するため、省電力モードが無効になっていることを確認する必要があります。

TSCのwikiページにはいくつかの例があります:http://en.wikipedia.org/wiki/Time_Stamp_Counter

于 2011-07-19T22:41:16.170 に答える
1
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);

CLOCK_REALTIME_HRもありますが、違いがあるかどうかはわかりません..

于 2011-07-19T15:28:40.343 に答える
0

clock_gettime(2)

于 2011-07-19T15:27:30.160 に答える