2013-10-05 8 views

Antwort

14

Ein Kernelstart ist asynchron. Das bedeutet, dass die Steuerung unmittelbar nach dem Start des GPU-Prozesses an den CPU-Thread zurückgegeben wird, bevor der Kernel die Ausführung beendet hat.

Was ist nun das nächste im CPU-Thread? Anwendung beenden

Beim Beenden der Anwendung wird die Fähigkeit, die Ausgabe an die Standardausgabe zu senden, vom Betriebssystem beendet.

So die Ausgabe, die später vom Kernel generiert wird, nirgends zu gehen, und Sie werden es nicht sehen.

Auf der anderen Seite, wenn Sie cudaDeviceSynchronize() verwenden, dann wird die Kernel zu beenden zu beenden (und die Ausgabe von dem Kernel findet eine Wartestandardausgabewarteschlange) garantiert wird vor die Anwendung erlaubt.

+0

aber wenn Sie den Link sehen, den ich gepostet habe, rufen wir sofort nach Kernal Call cudamemcpy (.... Gerät zu Host). Warum haben wir hier keine cushadevicesynchronize()? – gpuguy

+5

Da CUDA-Operationen (API-Aufrufe, Kernel-Aufrufe), die für denselben Stream ausgegeben werden, selbst wenn sie asynchron sind, werden sie garantiert seriell ausgeführt. Da sich der Kernel und die cudaMecpy-Operation im selben (Standard) -Stream befinden, wird der cudaMemcpy garantiert nicht so lange gestartet, bis der Kernel abgeschlossen ist, obwohl der Kernel-Start asynchron ist (in Bezug auf den Host-Thread). –