Измерение времени выполнения в C ++: clock () и clock_gettime () дают совершенно разные результаты

Я пытаюсь измерить производительность моего кода (который является выполнением ядра 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;

Это дает понятные результаты — все три результата практически одинаковы.

Когда дело доходит до измерения времени выполнения ядра OpenCL, я делаю то же самое, но результаты, которые я получаю, ужасны:

Time = 0.04
Realtime = 0.26113
Monotonic = 0.26113

Можете ли вы дать мне представление о том, что с ним не так?
Если это обычная проблема измерения производительности ядра OpenCL, можете ли вы предложить лучший способ ее измерения? Спасибо!

1

Решение

Если у вас есть доступ к компилятору C ++ 11, попробуйте вместо этого использовать std :: chrono: http://en.cppreference.com/w/cpp/chrono

В новый стандарт C ++ встроены три типа часов:

  1. станд :: steady_clock
  2. станд :: system_clock
  3. станд :: high_resolution_clock

Кроме того, библиотека хорошо спроектирована для обработки различных уровней детализации, будь то точность микросекунды или что-то еще. Что касается программного обеспечения, которое я написал в прошлом (крупное промышленное моделирование), то я использовал std :: stable_clock для того, чтобы делать все свои измерения без нареканий :-).

2

Другие решения

Функция clock в некоторых системах будет измерять время процессора, используемое приложением. Если ваше приложение использует OpenCL, оно, вероятно, будет проводить большую часть своего времени в ожидании фактических вычислений, выполняемых графической картой, поэтому clock не даст вам «реального времени, необходимого для получения результата». Это похоже на использование clock например, при чтении данных из файла — время, необходимое для чтения 100 МБ из файла, составляет, возможно, 2 секунды. Но для отправки команд на жесткий диск и сбора данных обратно, когда они были сохранены в памяти контроллером жесткого диска, требуется всего 0,01 с процессорного времени. Итак clock дает «0,01 с», а не «2 с».

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector