2014-11-01 3 views
6

Vorausgesetzt, dass OpenCL eine API für heterogene Programmierung sein soll, hat es fast definitionsbedingt eine große Latenzzeit. Daher muss es eine asynchrone API dafür geben.Asynchronous API

Ich finde es jedoch schwierig, die asynchrone API in OpenCL.net zu finden. Ich habe die OpenCl.Net.Event-Struktur gefunden, die bei den meisten API-Aufrufen ein out-Parameter zu sein scheint. Allerdings kann ich sowieso keinen Callback auf das Ereignis zuordnen, da es anscheinend clSetEventCallback von opencl.net fehlt.

Kann jemand await einen asynchronen Betrieb in opencl.net?

EDIT: Ich hasse es, wenn Menschen downvote ohne zumindest einen Kommentar abzugeben. Zur Erinnerung, ich HABE ziemlich viel um das Thema gegoogelt, lese gerade ein Buch über OpenCL, habe sogar den Quellcode ins OpenCL.net-Projekt heruntergeladen, aber vergeblich. Es gibt sehr wenig Dokumentation auf OpenCL.net.

+0

Was meinen Sie mit Latenz? Geht es um die Zeit, in der die Funktion Blockade aufruft, während sie auf Ergebnisse wartet? – Eric

+0

Zum Beispiel in OpenCL müssen Sie Ihre Daten in den Speicher des Zielgeräts laden. Dies geschieht durch Einreihen einer Ladespeicheroperation. Der Beispielcode zeigt, wie dies synchron geschieht (indem async auf false gesetzt wird und das "out" -Ereignisobjekt ignoriert wird). Aus der Sicht der Implementierung ist das Laden von Daten auf die GPU "langsam", da die Latenz hoch ist (selbst wenn wir nur GDDR5-Latenzzeiten berücksichtigen). Wenn wir Hunderte von Hin- und Rückfahrten über den PCI-E-Bus zur GPU haben, verlieren wir alle Leistungssteigerungen. Daher möchte ich in der Lage sein, Operationen in die Warteschlange zu stellen und über die Fertigstellung benachrichtigt zu werden. – Aron

+0

Ich bin mit openCl nicht vertraut, aber nicht die Batch-Verarbeitung von openCl, über die wir reden? Was Sie wollen, ist so viel Zeit wie möglich in die Warteschlange Daten und so wenig Zeit wie möglich warten auf Ergebnisse (oder etwas anderes) richtig? – Eric

Antwort

1

Ich weiß nicht viel über OpenCL.net, aber ist nicht die CommandQueue was Sie suchen? Sie können alle Ihre Aynch-Aufgaben mit dem Befehl Finish in eine Warteschlange stellen, bis alle Aufgaben erledigt sind.

Zum Beispiel hier: GPGPU image processing basics using OpenCL.NET unter Das Bildverarbeitungsteil

Für clSetEventCallback ich fand nur clFinish oder clWaitForEvents.

refering zu Ihrer Aussage:

wie es clSetEventCallback scheint fehlt opencl.net

ich keinen Weg finden konnte, zu tun, was Sie wollen, sorry.

BEARBEITEN: Dies scheint sehr interstring zu sein: Google-Code/GPUTracer. Sie sollten sich OpenCL.cs und Event.cs ansehen. Ich denke, sie haben dein Problem gelöst.

+0

Leider suche ich nicht danach. Ich bin auf der Suche nach der Verwendung dieses Befehls mit 'Blocking' auf' false' gesetzt, was das Gegenteil von jedem Tutorial ist, das ich bisher gefunden habe. In diesem Lernprogramm wird eine blockierende/synchrone API ausgeführt. – Aron

+0

Was ist damit gemeint: https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html (clFinish)? Entschuldigung, wenn ich völlig falsch bin, versuche nur zu helfen :) – BendEg

+0

"Blöcke, bis alle zuvor in die Warteschlange eingereihten OpenCL-Befehle in einer Befehlswarteschlange an das zugehörige Gerät ausgegeben und abgeschlossen wurden." Was definitionsgemäß das Gegenteil von asynchron ist. – Aron