OpenCL / OpenGL Interop mit mehreren GPUs

9

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%     
matth 30.07.2013, 20:33
quelle

2 Antworten

1

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.

    
Garet Claborn 16.03.2015, 14:30
quelle
2

Mehrere verwandte Fragen und Beispiele

  • Hier ist ein ähnliches Beispiel eines reinen OpenGL-Ansatzes für Shared Verarbeitung zwischen mehreren GPUs
  • Eine andere Frage OpenGL multiple gpu Frage
  • Ein Beispiel Producer / Consumer mit mehreren gpus sehen sie die herstellerquelldatei für aufrufe, um aktuell zu machen (sieht windows spezifisch aus, aber der fluss wird anderswo ähnlich sein). Weitere Informationen finden Sie unter glContext
%Vor%

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?

    
Mark Essel 02.05.2014 13:55
quelle

Tags und Links