Frage

Bei der Beurteilung meines Programms habe ich festgestellt, dass ich irgendwann einen Zeitraffer von bis zu 100 ms erhalte.Ich habe jede Operation durchsucht, aber keine einzelne Operation hat dieses Mal Zeit in Anspruch genommen.Dann ist mir aufgefallen, dass der erste Aufruf überall dort, wo ich einen cudaThreadSynchronize-Aufruf tätige, 100 ms dauert.Dann habe ich unten ein solches Beispiel geschrieben.Wenn cudaThreadSynchronize in der ersten Zeile aufgerufen wird, wird festgestellt, dass der Wert der verstrichenen Zeit am Ende weniger als 1 ms beträgt.Wenn es jedoch nicht aufgerufen wird, dauert es durchschnittlich 110 ms.

int main(int argc, char **argv)
{
    cudaThreadSynchronize(); //Comment out it then get 110msec as elapsed time..

    unsigned int timer;
    cutCreateTimer(&timer);
    cutStartTimer(timer);

    float *data;
    CUDA_SAFE_CALL(cudaMalloc(&data, sizeof(float) * 1024));

    cutStopTimer(timer);
    printf("CUT Elapsed: %.3f\n", cutGetTimerValue(timer));

    cutDeleteTimer(timer);

    return EXIT_SUCCESS;
}

Ich denke, dass cudaThreadSynchronize() zu Beginn die Initialisierung der CUDA-Bibliothek übernimmt.Ist es der richtige Weg, den Kernel vollständig zu initialisieren, damit die Zeiteinschätzung anderer Vorgänge nicht beeinträchtigt wird?Ist es ausreichend und richtig, cudaThreadSynchronize am Anfang aufzurufen, oder gibt es einen richtigen Weg?

War es hilfreich?

Lösung

Um CUDA nutzen zu können, muss zunächst ein „CUDA-Kontext“ auf der GPU erstellt werden, dies dauert etwa 70-100ms.In deinem Beispiel cudaThreadSynchronize(); macht den Kontext.Für Ihre Anwendung wird nur einmal ein Kontext erstellt.Bei der Zeitanalyse mache ich auch eine Dummy-Speicherkopie, um einen Kontext zu erstellen (wie Sie es oben mit getan haben). cudaThreadSynchronize();).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top