Ich habe Probleme mit mehreren GPUs mit OpenCL / OpenGL-Interop. Ich versuche eine Anwendung zu schreiben, die das Ergebnis einer intensiven Berechnung darstellt. Am Ende wird es ein Optimierungsproblem ausführen und dann, basierend auf dem Ergebnis, etwas auf den Bildschirm rendern. Als Testfall beginne ich mit dem Beispielcode der Partikelsimulation aus diesem Kurs: Ссылка
Der Beispielcode erstellt einen OpenGL-Kontext und erstellt dann mithilfe der cl_khr_gl_sharing-Erweiterung einen OpenCL-Kontext, der den Status teilt. Alles funktioniert gut, wenn ich eine einzelne GPU verwende. Das Erstellen eines Kontexts sieht folgendermaßen aus:
%Vor%Später erstellt das Beispiel gemeinsam genutzte CL / GL-Puffer mit clCreateFromGLBuffer.
Nun möchte ich einen Kontext von zwei GPU-Geräten erstellen:
%Vor%Ich habe die Geräte erfolgreich geöffnet und kann abfragen, dass beide cl_khr_gl_sharing unterstützen und beide einzeln funktionieren. Wenn ich jedoch versuche, den Kontext wie oben beschrieben zu erstellen, bekomme ich
%Vor%Welcher Fehlercode wird von der Erweiterung cl_khr_gl_sharing hinzugefügt? In der Erweiterungsbeschreibung (oben verlinkt) steht
CL_INVALID_OPERATION, wenn es sich um ein Kontext- oder Gruppenobjekt handelt angegeben für eines von CGL, EGL, GLX oder WGL und eines der Folgende Bedingungen gelten:
- Die OpenGL-Implementierung unterstützt das Fenstersystem nicht binding-API, für die ein Kontext oder Gruppenobjekte waren angegeben.
- Mehr als eines der Attribute CL_CGL_SHAREGROUP_KHR, CL_EGL_DISPLAY_KHR, CL_GLX_DISPLAY_KHR und CL_WGL_HDC_KHR ist auf einen nicht standardmäßigen Wert festgelegt.
- Beide Attribute CL_CGL_SHAREGROUP_KHR und CL_GL_CONTEXT_KHR sind auf nicht standardmäßige Werte gesetzt.
- Jedes der im Argument angegebenen Geräte kann nicht unterstützen OpenCL-Objekte, die sich den Datenspeicher eines OpenGL teilen Objekt, wie in Abschnitt 9.12 beschrieben. "
Diese Beschreibung scheint nicht genau zu meinen Fällen zu passen. Ist es nicht möglich OpenCL / OpenGL Interop mit mehreren GPUs zu machen? Oder habe ich heterogene Hardware? Ich habe einige Parameter aus meinen aufgezählten Geräten ausgedruckt. Ich habe gerade zwei zufällige GPUs genommen, die ich in die Finger bekommen konnte.
%Vor%Beachten Sie, dass, wenn ich den Kontext ohne den Interop-Teil (so dass das Requisiten-Array wie folgt aussieht) erstellt wird, erstellt er erfolgreich den Kontext, aber kann offensichtlich keine Puffer mit der OpenGL-Seite der Anwendung teilen.
%Vor%Wenn Sie diese zwei Zeilen aufrufen:
CL_GL_CONTEXT_KHR, (cl_context_properties) glXGetCurrentContext( ),
CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay( ),
Die Aufrufe müssen von innerhalb eines neuen Threads mit einem neuen OpenGL-Kontext kommen. Sie können einem Thread normalerweise nur jeweils einen OpenCL-Kontext mit einem OpenGL-Kontext für ein Gerät zuordnen.
Mehrere verwandte Fragen und Beispiele
OpenCL spezifisch, aber relevant für diese Frage :
"Wenn Sie einen Schreibvorgang in den Puffer auf queueA (deviceA) einfügen, verwendet OpenCL dieses Gerät zum Schreiben. Wenn Sie jedoch den Puffer für queueB (deviceB) im selben Kontext verwenden, OpenCL erkennt, dass deviceA die neuesten Daten hat und wird sie vor der Verwendung an deviceB übertragen Kurz gesagt, solange Sie Ereignisse verwenden, um sicherzustellen, dass nicht zwei Geräte gleichzeitig auf dasselbe Speicherobjekt zugreifen, wird OpenCL Stellen Sie sicher, dass jede Verwendung des Speicherobjekts die neuesten Daten enthält, unabhängig davon, welches Gerät sie zuletzt verwendet hat. "
Ich nehme an, wenn Sie OpenGL aus der Gleichung nehmen, das Teilen des Gedächtnisses zwischen gpus arbeitet wie erwartet?