Как создать таймер высокого разрешения в Linux для измерения производительности программы?

Я пытаюсь сравнить GPU с производительностью процессора. Для графического процессора NVIDIA я использую типы 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?

Ответ 1

Отъезд clock_gettime, который является интерфейсом POSIX для таймеров с высоким разрешением.

Если, прочитав man-страницу, вас не интересует разница между CLOCK_REALTIME и CLOCK_MONOTONIC, см. Разница между CLOCK_REALTIME и CLOCK_MONOTONIC?

Для получения полного примера см. следующую страницу: http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

Ответ 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_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);

Ответ 3

struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);

есть также CLOCK_REALTIME_HR, но я не уверен, имеет ли это значение.

Ответ 4

Вам интересно время на стене (сколько времени прошло) или количество циклов (сколько циклов)? В первом случае вы должны использовать что-то вроде gettimeofday.

Таймер с наивысшим разрешением использует инструкцию сборки RDTSC x86. Тем не менее, это измеряет такты, поэтому вы должны быть уверены, что режим энергосбережения отключен.

Страница wiki для TSC дает несколько примеров: http://en.wikipedia.org/wiki/Time_Stamp_Counter