2016-07-09 9 views
0

Ich habe ein kleines komisches Problem hier, dass ich eine Menge Schwierigkeiten habe, um die Antwort herauszufinden.Wie erkennt man die Standard-GPU zur Laufzeit?

Ich habe eine C++ - 3D-Engine, und ich verwende OpenCL für Optimierungen und OpenGL-Interoperabilität.

In meiner Maschine habe ich zwei GPUs installiert, eine GTX 960 und eine AMD R9 280X.

Alles funktioniert gut, einschließlich der Erkennung der GPUs und CPU und die Grafik-Interoperabilität läuft sehr schnell wie erwartet.

Aber immer in einer Maschine haben wir eine Standard-GPU auf dem System (Dies sind auf Windows abhängig von der Reihenfolge, installieren wir die Treiber).

Also, wenn ich Sein Ausgangs lesen Sie die alle Geräte und die GPU's erkennen, wenn ich die Interoperabilität Kontexte i eine seltsame Situation zu schaffen versuchen haben:

Wenn ich AMD als Standard GPU haben: im Fall von NVIDIA-Geräten gibt die OpenCL-Datei einen Fehler zurück, der besagt, dass der CL-Kontext nicht erstellt werden kann (Becouse ist nicht die Standard-GPU). Wenn ich den OpenGL-Kontext für die AMD-GPU erstelle, wird der Kontext korrekt erstellt.

Wenn ich NVIDIA als Standard-GPU: im Falle von NVIDIA-Geräten den Kontext richtig erstellt haben, aber wenn ich versuche, erstellen Sie den AMD-Kontext, stattdessen geben Sie mir einen Fehler, das System Crash!

Also, mein Hauptproblem ist, wie die Standard-GPU während Runtime zu Interoperabilitätskontexten zu erkennen, nur für die Standard-GPU, da die AMD Absturz statt Rückgabe Fehler ... (Becouse mit den Fehlern kann ich ein Flag einrichten die Standard-GPU basierend auf diesem Ergebnis ...).

Jeder hat eine Idee, wie kann ich die Standard-GPU zur Laufzeit mit C++ erkennen?

Mit freundlichen Grüßen.

Antwort

0

Wahrscheinlich mischen Sie Sachen von beiden GPUs. Beispielsweise wird ein Kontext für eine nicht standardmäßige GPU erstellt, die ein Gerät von der Standard-GPU verwendet. Sie können auf diese Art von Problemen stoßen, wenn Sie Khronos C++ - Bindungen für OpenCL verwenden. Was auch immer nicht explizit erstellt und als Standard für eine nicht standardmäßige GPU festgelegt wird, wird von dem Wrapper für Sie erstellt, der die Standard-GPU verwendet.

Andere C++ - Wrapper können unter ähnlichen Problemen leiden. Es ist schwer, etwas mehr zu sagen, ohne den Quellcode zu sehen.

+0

Ja, ich kodiere meine eigene Optimierungskomponente von Grund auf, und ich mische viele Kontexte, da ich mehr als ein Gerät habe. –

1

Eine Technik besteht darin, OpenGL nach dem Gerätenamen zu fragen und damit das OpenCL-Gerät zu wählen. Hinweis: Sie können diese vor dem Vergleich auf Enumerationen reduzieren, da die Zeichenfolgen nicht übereinstimmen (z. B. AMD vs. ATI).

+0

Ich mag es, ich werde versuchen, herauszufinden, wie das geht. –

+0

'glGetString (GL_VENDOR)' - ordnen Sie "AMD", "ATI" und "Advanced Micro Devices" zu Ihrer AMD enum, "NVIDIA" zu NVIDIA enum und "Intel" und "INTEL" zu Intel enum zu. Dann 'clGetDeviceInfo' mit' CL_DEVICE_VENDOR' und ähnliches Mapping durchführen. Dann vergleiche enums. – Dithermaster

+1

Vielen Dank! Funktioniert wirklich gut! –

0

Endlich nach vielen Tests, funktioniert es wie erwartet und wirklich schnell !!!

Grundsätzlich i haben zwei Komponenten:

01) OpenGL Component

02) OpenCL Component

also in der OpenGL Komponente i die GPU-Anbieter aus dem Graphikkontext (da der GL erstellt extrahieren Kontext ist das erste, was auf dem System erstellt wird, um die Grafiken in einem Fenster rendern zu können.

Nach dieser Initialisierung, ich beginne die Inizialisierung der OpenCL-Komponente zu übergeben, der Hersteller von OpenGL gesammelt, da die Standard-GPU-Karte auf dem System registriert ist.

Während der Initialisierung des Geräts habe ich ein Flag gesetzt, das die Standard-GPU für OpenGL-Interoperabilität markiert, sodass für alle anderen Geräte ein normaler Ausführungskontext erstellt wird und für das Standard-GPU-Gerät der Interoperationskontext erstellt wird.

danach, wenn ich eine Kernel - Ausführung anfordern, übertrage ich den Komponentennamen damit und wenn diese Komponente eine normale Komponente sind, werden die CPU - und Second - GPU - Geräte für Heterogene Computing verwendet, und wenn dieser Aufruf kommt von 3D-Komponente die GPU für OpenGL-Interoperabilität verwendet werden !!!

Reeaaallly Cool !!!

Ich habe getestet, die Standard-GPU von NVIDIA zu AMD und AMD zu NVIDIA zu invertieren, und arbeitet lieblich !!!

Ich habe getestet, meine Mathematik und Physik-Komponente auf die zweite GPU und die 3D-Grafikkomponente auf die Standard-GPU zeigen, und ich erreiche tolle Ergebnisse!

Die Software läuft jetzt wie ein Monster Dragster !!!

Vielen Dank für Ihre Hilfe!

Mit freundlichen Grüßen.

Verwandte Themen