2014-04-24 11 views
8

Moim celem jest wykrycie dyskretnych GPU w systemach multi-GPU (na przykład zintegrowany Intel HD Graphics + dyskretna AMD Radeon karty) z C#Detect dyskretnych GPU

Ja zwykle wykorzystać ten kod:

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;     
      } 
    } 
} 

Działa jak urok dla mojego przykładu, opisanego powyżej.

Ale to nie nadaje się do AMD, VIA itp (nie wiem dokładnie wszystkich producentów) zintegrowane karty.

Czy istnieje uniwersalne podejście do odcinania wszystkich zintegrowanych GPU?

+0

Nie sądzę, że istnieje ogólny sposób robienia tego. Specjalnie dla AMD istnieją zintegrowane i dyskretne procesory graficzne ... – ChrFin

+1

http://sharpdx.org/ Może lub nie może ci pomóc – Machinarius

+0

@chrfin Przynajmniej mam nadzieję, że istnieje jakaś trzecia biblioteka, implementująca tę funkcjonalność :) – bairog

Odpowiedz

1

Aby zrozumieć odpowiedź, musimy zrozumieć, w jaki sposób sterowniki trybu jądra tworzą urządzenia.

Aby zobaczyć listę kierowców, powołać msinfo32 z dialogowym Uruchamianie select Środowisko oprogramowania ->Sterowniki systemowe. Stamtąd można zobaczyć wszystkie zarejestrowane sterowniki w systemie i ich tryb uruchamiania (ręczny/rozruchowy/systemowy) i stan (uruchomiony/zatrzymany).

drivers

Kiedy sterowniki urządzeń Plug and Play są ładowane (przez menedżera Plug and Play), każdy kierowca będzie utworzyć jedną lub więcej Devices (używając IoCreateDevice). Jednak niektóre z tych sterowników są klasyfikowane jako sterownik magistrali. W rezultacie system wyliczy urządzenia zgłoszone przez sterownik magistrali, a drzewo zostanie utworzone (zaczynając od wyimaginowanego urządzenia "root"). Na przykład, jeśli magistrala PCI wykryje urządzenie, nie wie nic o urządzeniu (może to być karta sieciowa, karta dźwiękowa, karta wideo itp.). Dlatego menedżer Plug and Play musi znaleźć odpowiedni sterownik urządzenia. Wszelkie wbudowane/zintegrowane urządzenia (dźwięk, sieć, wideo, usb, firewire, sata, itp.) Są traktowane tak samo i są również ogólnie urządzeniami PCI. Ostatecznie system operacyjny nie wie ani nie dba o to, czy urządzenie jest osadzone czy dyskretne.

idź do Device Manager wybierz Zobacz ->urządzeń poprzez połączenia spowoduje wyświetlenie drzewa, który jest tworzony.

device tree

Tak, odnoszące się do komentarza @Machinarius pinvoke, PInvoke nie pomoże tutaj. Jednak zgadzam się z nim w odniesieniu do wykrywania funkcji i możliwości. I pamiętaj, że nie wiemy, co przyniesie przyszłość, więc wyłączenie jakichkolwiek urządzeń może nie być mądre. Jakikolwiek kod będący stroną trzecią, który będzie asystował, będzie prawdopodobnie trudnym kodowaniem.

Mam nadzieję, że to pomoże.

+0

Wiele razy, aby uzyskać szczegółowe wyjaśnienie. – bairog

+0

Nie ma za co. Czy szukasz więcej lub czy to odpowiada na twoje pytanie? – Jeff

+0

Och, moje zapomnienie :) Przepraszamy – bairog