2014-04-24 7 views
8

Mein Ziel ist es diskreten GPU auf Multi-GPU-Systemen zu erfassen (zum Beispiel integrierten Intel HD Graphics + diskretes AMD Radeon-Karte) mit C#Detect diskret GPU

ich in der Regel diesen Code verwenden habe:

String gpuName = String.Empty; 

ManagementObjectCollection objectCollection = 
new ManagementObjectSearcher("SELECT Name FROM Win32_VideoController").Get(); 

foreach (ManagementObject managementObject in objectCollection) 
{ 
    foreach (PropertyData propertyData in managementObject.Properties) 
    {      
      if ((gpuName == String.Empty) || (propertyData.Value.ToString().ToLower().IndexOf("intel") == -1)) 
      { 
       gpuName = propertyData.Value.ToString(); 
       break;     
      } 
    } 
} 

Es funktioniert wie ein Charme für mein Beispiel, oben beschrieben.

Aber es ist nicht geeignet für AMD, VIA, etc. (Ich weiß nicht genau, alle Hersteller) integrierte Karten.

Gibt es einen universellen Ansatz, um alle integrierten GPUs abzutrennen?

+0

Ich glaube nicht, dass es eine generische Art, dies zu tun ist. Speziell für AMD gibt es integrierte und diskrete GPUs ... – ChrFin

+1

http://sharpdx.org/ Kann oder kann nicht helfen – Machinarius

+0

@chrfin Wenigstens hoffe ich, dass einige Drittanbieter-Bibliotheken, die diese Funktionalität implementieren, existieren :) – bairog

Antwort

1

Um die Antwort zu verstehen, müssen wir verstehen, wie Kernel-Modus-Treiber Geräte erstellen.

Um eine Liste der Treiber zu sehen, rufen Sie msinfo32 aus dem Ausführen-Dialog, die Auswahl Software-Umgebung ->Systemtreiber. Von dort können Sie alle registrierten Treiber auf Ihrem System sehen und deren Startmodus (Manuell/Boot/System) und Status (Laufen/Angehalten).

drivers

Wenn Plug and Play-Gerätetreiber geladen werden (durch den Plug-and-Play-Manager), wobei jeder Treiber ein oder mehr A-Geräte schaffen (unter Verwendung von IoCreateDevice). Einige dieser Treiber sind jedoch als Bustreiber kategorisiert. Als Ergebnis wird das System die von diesem Bustreiber gemeldeten Geräte aufzählen, und es wird ein Baum erstellt (beginnend mit einem imaginären "Root" -Gerät). Zum Beispiel, wenn der PCI-Bus ein Gerät erkennt, weiß es nichts über das Gerät (könnte eine Netzwerkkarte, Soundkarte, Grafikkarte, etc. sein). Daher muss der Plug-and-Play-Manager den passenden Treiber des Geräts finden. Alle eingebetteten/integrierten Geräte (Sound, Netzwerk, Video, USB, Firewire, SATA usw.) werden gleich behandelt und sind in der Regel auch PCI-Geräte. Letztendlich weiß das Betriebssystem nicht, ob das Gerät eingebettet oder diskret ist.

Zum Geräte-Manager, wählen Ansicht ->Geräte nach Verbindung den Baum angezeigt werden, die erstellt wird.

device tree

Also, um den Kommentar @Machinarius PInvoke betreffen, werden PInvoke hier nicht helfen. Allerdings stimme ich ihm in Bezug auf die Erkennung von Funktionen und Fähigkeiten sind der Weg zu gehen. Und denken Sie daran, dass wir nicht wissen, was die Zukunft bringt, deshalb ist der Ausschluss von Geräten möglicherweise nicht weise. Jeder Code von Drittanbietern zur Unterstützung wird wahrscheinlich hartcodierende Werte sein.

Hoffe, das hilft.

+0

Viele thx, für eine detaillierte Erklärung. – bairog

+0

Gern geschehen. Suchst du mehr, oder beantwortet das deine Frage? – Jeff

+0

Oh, meine Vergesslichkeit :) Sorry – bairog