Я пытаюсь измерить производительность моего кода (который является выполнением ядра 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, можете ли вы предложить лучший способ ее измерения? Спасибо!
Если у вас есть доступ к компилятору C ++ 11, попробуйте вместо этого использовать std :: chrono: http://en.cppreference.com/w/cpp/chrono
В новый стандарт C ++ встроены три типа часов:
Кроме того, библиотека хорошо спроектирована для обработки различных уровней детализации, будь то точность микросекунды или что-то еще. Что касается программного обеспечения, которое я написал в прошлом (крупное промышленное моделирование), то я использовал std :: stable_clock для того, чтобы делать все свои измерения без нареканий :-).
Функция clock
в некоторых системах будет измерять время процессора, используемое приложением. Если ваше приложение использует OpenCL, оно, вероятно, будет проводить большую часть своего времени в ожидании фактических вычислений, выполняемых графической картой, поэтому clock
не даст вам «реального времени, необходимого для получения результата». Это похоже на использование clock
например, при чтении данных из файла — время, необходимое для чтения 100 МБ из файла, составляет, возможно, 2 секунды. Но для отправки команд на жесткий диск и сбора данных обратно, когда они были сохранены в памяти контроллером жесткого диска, требуется всего 0,01 с процессорного времени. Итак clock
дает «0,01 с», а не «2 с».