CUDA-Kernel-Synchronisierung
Hallo ich habe eine Frage zur Programmierung in CUDA.
Ich habe den folgenden code:
int main () {
for (;;) {
kernel_1 (x1, x2, ....);
kernel_2 (x1, x2 ...);
kernel_3_Reduction (x1);
//code manipulation host_x1
//Copy the pointer device to host
cpy (host_x1, x1, DeviceToHost)
cpu_code_x1_manipulation;
kernel_ (x1, x2, ....);
}
}
So, wenn die Kopien gemacht und wie kann ich sicherstellen, dass kernel_1, kernel_2 kernel_3 und Ihre Aufgaben beendet?
- es sei denn, Sie verwenden, streams und einige andere Konstrukte, die alle Ihre cuda-Anrufe (Kernel, cudamemCpy, etc.) ausgestellt werden in der Standard-stream und Sie werden blockiert (wird erst beginnen, wenn vorhergehende cuda Aufrufe). Solange du nicht switch-streams, cudaMemcpy wird nicht wieder die Kontrolle an den CPU thread, bis es abgeschlossen ist. Ebenso die cudaMemcpy wird nicht beginnen, bis alle vorherigen cuda-Aufrufe abgeschlossen sind.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle Operationen gestartet, auf dem gleichen stream synchronisiert werden. In dem code oben wird alle Kernel läuft eine nach der anderen. Sie müssen explizit angeben, streams, wenn Sie brauchen, kernel_1 und kernel_2 parallel laufen.
Verwenden
cudaDeviceSynchronize();
nur, wo Sie wollen, um sicherzustellen, dass alle Kerne sind fertig. Nach diesem Befehl, können Sie davon ausgehen, alle Kerne und alle ausstehenden Geräte-Funktionsaufrufe durchgeführt werden.