У меня есть ядро CUDA, которое вызывает ряд функций устройства.
Как лучше всего получить время выполнения каждой из функций устройства?
Как лучше всего получить время выполнения участка кода в одной из функций устройства?
У меня есть ядро CUDA, которое вызывает ряд функций устройства.
Как лучше всего получить время выполнения каждой из функций устройства?
Как лучше всего получить время выполнения участка кода в одной из функций устройства?
В моем собственном коде я использую функцию clock()
для получения точного времени. Для удобства у меня есть макросы
enum {
tid_this = 0,
tid_that,
tid_count
};
__device__ float cuda_timers[ tid_count ];
#ifdef USETIMERS
#define TIMER_TIC clock_t tic; if ( threadIdx.x == 0 ) tic = clock();
#define TIMER_TOC(tid) clock_t toc = clock(); if ( threadIdx.x == 0 ) atomicAdd( &cuda_timers[tid] , ( toc > tic ) ? (toc - tic) : ( toc + (0xffffffff - tic) ) );
#else
#define TIMER_TIC
#define TIMER_TOC(tid)
#endif
Затем их можно использовать для инструментирования кода устройства следующим образом:
__global__ mykernel ( ... ) {
/* Start the timer. */
TIMER_TIC
/* Do stuff. */
...
/* Stop the timer and store the results to the "timer_this" counter. */
TIMER_TOC( tid_this );
}
Затем вы можете прочитать cuda_timers
в коде хоста.
Несколько заметок:
#ifdef USETIMERS
, чтобы вы могли легко их отключить.clock()
возвращает целочисленные значения типа clock_t
, я храню накопленные значения как float
, иначе значения будут циклически повторяться для ядер, которые занимают больше нескольких секунд (накопляются по всем блокам).( toc > tic ) ? (toc - tic) : ( toc + (0xffffffff - tic) ) )
необходим в случае, если счетчик часов зацикливается.P.S. Это копия моего ответа на этот вопрос, который не получил много баллов там, поскольку требуемое время было для всего ядра.
clock()
, я обнаружил, что есть также clock64()
, что может устранить необходимость проверки переполнения и преобразования в число с плавающей запятой.
- person Roger Dahl; 26.06.2012
clock64()
появилась в Руководстве по программированию CUDA только в версии 4.2. Что касается вашего первого пункта, я соответственно обновил свой ответ. Спасибо!
- person Pedro; 27.06.2012
volatile
, например. как описано в нижней части страницы 7 Руководство по использованию сборки PTX в CUDA.
- person Pedro; 27.06.2012