2012-05-14 103 views
16

Quiero medir el núcleo interno del tiempo de la GPU, ¿cómo se mide en NVIDIA CUDA? p.¿Cómo medir el tiempo de kernel interno en NVIDIA CUDA?

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

Amin, (hace algunos años) aceptó una respuesta que es información útil pero no responde su pregunta real. ¿Te importaría no aceptar o editar la pregunta para reflejar la respuesta? – einpoklum

Respuesta

5

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); 
+19

Ese código no puede usarse dentro de un kernel, que es lo que la pregunta está pidiendo. – talonmies

+0

@talonmies: Entonces, esta respuesta no responde a la pregunta, pero es aceptada. ¿Qué debemos hacer? Edita la pregunta tal vez? – einpoklum

+0

Ejecutando núcleos en hilos de openmp en múltiples gpus y este código me da 0 ms resultado – newbieee

33

se puede 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); 
} 

que da el número 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 compilador y el ensamblador realizan el reordenamiento de la instrucción por lo que es posible que desee verificar que las llamadas de reloj no terminen colocadas una al lado de la otra en la salida SASS (use cudaobjdump para verificar).

+0

Pruebo y no funciono correctamente. clock() es la función del anfitrión, no la función del dispositivo. – Amin

+5

'clock()' ** es ** una función del dispositivo y realmente funciona. Consulte la sección B10 de la guía de programación de CUDA para obtener una descripción de 'clock()' y 'clock64()'. Si "no funciona correctamente", está haciendo algo mal o ha entendido mal lo que significa la salida. – talonmies

+0

La salida es ciclo de reloj. ¿Cómo convertir a segundos? – Amin

Cuestiones relacionadas