Рассмотрим следующее ядро
__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?
Это две разные вещи? Или чего-то еще не хватает?