Warten auf ein einzelnes Ereignis in OpenCL

8

Ich schreibe ein OpenCL-Programm, in dem mehrere Kernel auf mehreren Geräten aufgerufen werden. Nachdem ich alle Kernel eingereiht habe, möchte ich warten, bis einer von ihnen fertig ist, und dann die Arbeit für dieses Gerät in die Warteschlange stellen.

Zum Beispiel habe ich Geräte A und B und jeder von ihnen hat einen Kernel. Wenn A zuerst fertig ist, möchte ich nach einigen Arbeiten einen neuen Kernel in die Warteschlange stellen. Wenn B zuerst fertig ist, möchte ich nach einigen Arbeiten einen neuen Kernel in die Warteschlange stellen. Ich suche nach etwas wie clWaitForAnyEvent , das zurückkommt, nachdem ein Ereignis vorbei ist.

Wenn ich mir die Spezifikation anschaue, sehe ich eine clWaitForEvents -Methode, aber es scheint, dass sie auf das Ende des gesamten Events wartet, bevor ich fortfahre. Ich möchte nach einem Event weitermachen (und wissen, welches Event beendet wurde). .

Die Optionen, die mir gerade einfallen, sind:

  1. Belegt-warten Sie mit clGetEventInfo , um die Ereignisvervollständigung zu testen.

  2. Multi-Thread mit einem Thread für jedes Ereignis (benötigt nur ein paar Threads, verwendet aber die CPU als eines der Geräte)

  3. Etwas in der Spezifikation verpasst und es gibt tatsächlich eine Methode, die das für mich tut.

Irgendwelche Vorschläge, wie ich vorgehen soll oder was mir fehlt?

Danke!

    
KLee1 14.11.2011, 05:44
quelle

1 Antwort

10

Ihre Antwort ist 3.

clWaitForEvents wird genau das tun, was Sie wollen. Nehmen wir an, Sie haben eine Befehlswarteschlange für ein Gerät, das wir klee_dev nennen. Sie können die Arbeit an klee_dev folgendermaßen in die Warteschlange stellen:

%Vor%

Der Aufruf von clWaitForEvents wird so lange blockiert, bis die in Warteschlange eingereihte Arbeit in der Befehlswarteschlange von klee_dev abgeschlossen ist. Es wird nicht auf andere Arbeiten warten. Nur die Arbeit, die durch den Warteschlangenaufruf spezifiziert wurde, der mit diesem einen Ereignis verbunden ist.

BEARBEITEN:

Ich habe die ursprüngliche Frage, die im Folgenden geklärt wurde, falsch verstanden. Das OP fragte, ob es eine Methode in der CL-Spezifikation gibt, die bei einer Menge von Ereignissen blockiert, bis eine der Ereignisse abgeschlossen ist. Es gibt derzeit keine solche Methode.

BEARBEITEN, nochmal:

Sie können eine Rückrufmethode für jedes Ereignis mit clSetEventCallback registrieren. Innerhalb des Callbacks können Sie das Ereignis mit clGetEventInfo abfragen, um herauszufinden, welche Befehlswarteschlange dem Ereignis zugeordnet war.

Das gibt Ihnen, was Sie benötigen, denke ich: Benachrichtigung über die beliebige Ereignisvervollständigung und die Möglichkeit, herauszufinden, welche Befehlswarteschlange mit dem Ereignis verknüpft ist.

    
James 14.11.2011, 06:01
quelle

Tags und Links