Cómo medir el tiempo de kernel interno en NVIDIA CUDA?

Quiero medir el núcleo interno del tiempo de la GPU, ¿cómo medirlo en NVIDIA CUDA? p.ej

__global__ void kernelSample() { some code here get start time some code here get stop time some code here } 

Pruebe esto, mide el tiempo entre 2 eventos en milisegundos.

  cudaEvent_t start, stop; float elapsedTime; cudaEventCreate(&start); cudaEventRecord(start,0); //Do kernel activity here cudaEventCreate(&stop); cudaEventRecord(stop,0); cudaEventSynchronize(stop); cudaEventElapsedTime(&elapsedTime, start,stop); printf("Elapsed time : %f ms\n" ,elapsedTime); 

Puedes hacer algo como esto:

 __global__ void kernelSample(int *runtime) { // .... clock_t start_time = clock(); //some code here clock_t stop_time = clock(); // .... runtime[tidx] = (int)(stop_time - start_time); } 

Lo que da la cantidad de ciclos de reloj entre las dos llamadas. Tenga un poco de cuidado, sin embargo, el temporizador se desbordará después de un par de segundos, por lo que debe estar seguro de que la duración del código entre las llamadas sucesivas es bastante corta. También debe tener en cuenta que el comstackdor y el ensamblador realizan el reordenamiento de las instrucciones, por lo que es posible que desee verificar que las llamadas de reloj no cudaobjdump colocadas una al lado de la otra en la salida SASS (use cudaobjdump para verificar).