2012-04-15 4 views
1

Diese Funktion wird in der Dokumentation PyOpenCL unkommentiert: http://documen.tician.de/pyopencl/runtime.html?highlight=enqueue#pyopencl.Event.waitPyOpenCL: Was ist Event.wait() für?

Mein Problem ist: Ich habe einen Kern in einer for-Schleife rufen und nach jedem Anruf mit pyopencl.enqueue_copy_buffer(dest, src, size) einen Kopiervorgang einreihen. Zuerst habe ich dies mit .wait() angefügt (d. H. pyopencl.enqueue_copy_buffer(dest, src, size).wait()), weil ich dies in einem Beispiel gefunden habe. Dann entfernte ich .wait() und bekam eine sehr deutliche Beschleunigung.

Also, was ist diese Funktion für und unter welchen Bedingungen kann es aufgegeben werden? Vielen Dank.

Antwort

4

.wait() warten auf den Vorgang abgeschlossen werden. Wenn Ihr Code fortfahren kann, ohne dass er beendet (oder sogar gestartet) wurde, können Sie ihn auslassen. Beachten Sie, dass dies nicht mit der Reihenfolge der Vorgänge in der Warteschlange zusammenhängt: Sie werden nacheinander (in der Reihenfolge, in der Sie sie in die Warteschlange eingereiht haben) ausgeführt (sofern Sie keine Warteschlange außerhalb der Reihenfolge verwenden).

+0

Aha, also im Falle einer Schleife, wo ich einen Kernel aufrufen und eine Pufferkopie direkt danach in die Warteschlange stellen, kann ich wait() auslassen, weil der Kernelaufruf und der Kopierfunktionsaufruf in der richtigen Reihenfolge eingereiht sind, richtig ? – Maxim

+0

Ja, stellen Sie sicher, dass Sie Ihre Daten nicht ändern, bevor die Warteschlange synchronisiert wird (in diesem Fall, abhängig vom genauen Zeitpunkt im jeweiligen Fall, können Daten vor oder nach der Änderung oder in der Mitte auf das Gerät kopiert werden) . Daten und Kernel direkt danach zu vererben ist in Ordnung. – eudoxos

+0

Vielen Dank. – Maxim