2012-05-14 4 views
16

Ich möchte Zeit inneren Kern der GPU messen, wie man es in NVIDIA CUDA messen? z.B.Wie wird die Zeit des inneren Kernels in NVIDIA CUDA gemessen?

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

Amin, (vor ein paar Jahren) haben Sie eine Antwort akzeptiert, die nützliche Informationen ist, aber Ihre eigentliche Frage nicht beantwortet. Würde es Ihnen etwas ausmachen, die Frage entweder abzulehnen oder zu bearbeiten, um die Antwort zu reflektieren? – einpoklum

Antwort

5

Versuchen Sie dies, misst es die Zeit zwischen 2 Ereignissen in Millisekunden.

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

Dieser Code kann nicht innerhalb eines Kernels verwendet werden, was die Frage verlangt. – talonmies

+0

@tononmies: Also, diese Antwort beantwortet die Frage nicht, sondern wird akzeptiert. Was sollen wir machen? Bearbeite die Frage vielleicht? – einpoklum

+0

Running Kernel in Openmp Threads auf mehreren GPUs und dieser Code gibt mir 0 ms Ergebnis – newbieee

33

Sie können etwas tun:

__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); 
} 

die die Anzahl der Taktzyklen zwischen den beiden Anrufen gibt. Seien Sie ein wenig vorsichtig, aber der Timer wird nach ein paar Sekunden überlaufen, so dass Sie sicher sein sollten, dass die Dauer des Codes zwischen aufeinanderfolgenden Aufrufen ziemlich kurz ist. Sie sollten sich auch darüber im Klaren sein, dass der Compiler und der Assembler eine Neuordnung der Befehle durchführen, damit Sie überprüfen können, ob die Uhraufrufe nicht in der SASS-Ausgabe nebeneinander platziert werden (überprüfen Sie dies anhand von cudaobjdump).

+0

Ich Test und nicht richtig funktionieren. clock() ist Host-Funktion, nicht Gerätefunktion. – Amin

+5

'Uhr()' ** ist ** eine Gerätefunktion und es funktioniert wirklich. Eine Beschreibung von 'clock()' und 'clock64()' finden Sie in Abschnitt B10 des CUDA-Programmierhandbuchs. Wenn es "nicht richtig funktioniert", tun Sie etwas falsch oder haben falsch verstanden, was die Ausgabe bedeutet. – talonmies

+0

Der Ausgang ist Taktzyklus. Wie konvertiert man in Sekunden? – Amin

Verwandte Themen