время выполнения cudaEventElapsedTime и nvprof - PullRequest
1 голос
/ 01 ноября 2019

Рассмотрим следующее ядро ​​

__global__ void elementAccess( int *a, int N )
{
  int i = blockDim.x * blockIdx.x + threadIdx.x;
  int z = a[ i ];
}

Которое вызывается

cudaEvent_t start, stop;
float elapsedTime;
cudaEventCreate(&start);
cudaEventRecord(start,0);

elementAccess<<< 1, 1>>>( d_A, 1 );

cudaEventCreate(&stop);
cudaEventRecord(stop,0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedTime, start,stop);

printf("Elapsed time : %f ms\n" ,elapsedTime);

Где d_A - целочисленный массив.

Когда я запускаю код втерминал, я вижу

Elapsed time : 0.015328 ms

Когда я профилирую его с помощью nvprof --metrics SOME_METRICS -o e.nvvp ./element_access, я вижу, что длительность ядра равна 2.95 us.

Итак, почему события часов говорят, что время выполнения ядра составляет 15usв то время как nvvp говорит, что это 2.95us?

Это две разные вещи? Или чего-то еще не хватает?

1 Ответ

1 голос
/ 01 ноября 2019

Ваше первое измерение (на основе истекшего времени) включает в себя накладные расходы на запуск ядра. Второе (основанное на событиях CUDA) в основном исключает накладные расходы на запуск.

Учитывая, что ваше ядро ​​абсолютно ничего не делает (загрузка одной памяти будет оптимизирована из-за отсутствия последующего использования значения), кажется разумным, чтоистекшее время почти полностью состоит из затрат на запуск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...