2010-08-23 3 views
5

Ich arbeite an der Übersetzung einer CUDA-Anwendung (this if you must know) nach OpenCL. Die ursprüngliche Anwendung verwendet die CUDA-CUDA-API mit einem einzigen Stream, um die automatische Wartezeit beim Lesen der Ergebnisse zu vermeiden.OpenCL-Ereignisse und Befehlswarteschlangen

Jetzt stelle ich fest, dass OpenCL-Befehlswarteschlangen CUDA-Streams sehr ähnlich sehen. Aber in the device read command, und ebenso in den Befehlen write und kernel execute, merke ich Parameter für Ereignisse auch. Ich frage mich also, was man braucht, um ein Device-Write, eine Reihe von Kernels (z. B. ein Aufruf an einen Kernel, dann 100 Aufrufe an einen anderen Kernel) auszuführen und ein Gerät sequenziell zu lesen?

  1. Wenn ich sie einfach sequenziell in die gleiche Warteschlange einreihte, werden sie dann wie in CUDA sequenziell ausgeführt?
  2. Wenn das nicht funktioniert, kann/sollte ich Daisy-Chain-Ereignisse, die Warteliste jedes Anrufs das Ereignis des vorherigen Anrufs machen?
  3. Oder sollte ich alle vorherigen Ereignisse zur Warteliste jedes Anrufs hinzufügen, wie wenn es eine N^2 Suche nach Abhängigkeiten oder etwas gibt?
  4. Oder muss ich nur event.wait() für jeden Anruf einzeln, wie es in AMD's tutorial heißt?

Vielen Dank!

Antwort

5

Das hängt davon ab, wie Sie die Befehlswarteschlange erstellen. In clCreateCommandQueue gibt es einen Eigenschaftenparameter, der CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE enthalten kann, der die nicht sequenzielle Ausführung in der Befehlswarteschlange aktiviert.

Wenn diese Eigenschaft festgelegt ist, werden Befehle möglicherweise nicht in der richtigen Reihenfolge oder parallel ausgeführt, und die einzige Möglichkeit zur Synchronisierung besteht in der Verwendung von Ereignissen.

Wenn diese Eigenschaft nicht festgelegt ist, werden Befehle nacheinander in der Warteschlange ausgeführt.

+0

Der eine Ort, an den ich nicht geglaubt habe. Vielen Dank! –

+0

Ich werde meine Aussage zu "am meisten akzeptiert" ändern müssen. Es scheint richtig zu sein, dass eine Reihe von Kerneln in der Reihenfolge ihrer Reihenfolge in der Reihenfolge ihrer Reihenfolge in die Warteschlange eingereiht werden. Die Pufferlese- und -schreibvorgänge werden jedoch scheinbar nicht in der richtigen Reihenfolge ausgeführt, es sei denn, beide verwenden die Ereignisse * und * wartet, möglicherweise sogar dann, wenn das Lesen/Schreiben als synchron angegeben wurde. Siehe auch das atiopencl-Beispiel in BOINC (boinc.berkeley.edu) für ein funktionierendes Beispiel. –

+0

So funktioniert CL nicht. Informationen zum Erstellen von Befehlswarteschlangen finden Sie im Abschnitt zu OpenCL-Spezifikationen 5.1. Wenn Sie ein anderes Verhalten sehen, handelt es sich um einen Implementierungsfehler (Bug). –