8

私の目標は、C# を使用してマルチ GPU システム (たとえば、統合された Intel HD グラフィックス+ ディスクリートAMD Radeonカード) でディスクリート GPU を検出することです。

私は通常、そのコードを使用しています:

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

上記の私の例では、それは魅力のように機能します。

ただし、 AMDVIAなど (すべてのメーカーを正確に把握しているわけではありません) の統合カードには適していません。

では、統合されたすべての GPU を遮断するための普遍的なアプローチはありますか?

4

1 に答える 1

1

その答えを理解するには、カーネル モード ドライバーがデバイスを作成する方法を理解する必要があります。

ドライバーのリストを表示するには、実行ダイアログからmsinfo32を呼び出し、 Software Environment --> System Driversを選択します。そこから、システムに登録されているすべてのドライバー、およびそれらの開始モード (手動/起動/システム) と状態 (実行中/停止) を確認できます。

運転手

プラグ アンド プレイ デバイス ドライバーが (プラグ アンド プレイ マネージャーによって) 読み込まれると、各ドライバーは ( IoCreateDeviceを使用して) 1 つ以上のデバイスを作成します。ただし、これらのドライバーの一部は、バス ドライバーとして分類されます。その結果、システムはそのバス ドライバーによって報告されたデバイスを列挙し、ツリーが作成されます (仮想の「ルート」デバイスから始まります)。たとえば、PCI バスがデバイスを検出した場合、そのデバイス (ネットワーク カード、サウンド カード、ビデオ カードなど) について何も認識しません。そのため、プラグ アンド プレイ マネージャーは、デバイスの適切なドライバーを見つける必要があります。組み込み/統合デバイス (サウンド、ネットワーク、ビデオ、USB、firewire、sata など) はすべて同じように扱われ、通常は PCI デバイスでもあります。最終的に、OS はそうしません」

[デバイス マネージャー] に移動し、 [表示] --> [接続別デバイス]を選択すると、作成されたツリーが表示されます。

デバイスツリー

したがって、@Machinarius PInvoke コメントに関しては、PInvoke はここでは役に立ちません。しかし、私は機能と機能を検出することが進むべき道であるという点で彼に同意します. また、将来がどうなるかはわからないため、デバイスを除外することは賢明ではないことに注意してください. 支援するサードパーティのコードは、ハードコーディングされた値である可能性があります。

お役に立てれば。

于 2014-04-25T16:04:28.940 に答える