You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤IDXGIFactory.EnumAdapters返回的重复GPU?

解决IDXGIFactory.EnumAdapters重复GPU问题及显存获取方案

过滤重复GPU的方法

远程桌面连接时,IDXGIFactory.EnumAdapters会返回虚拟适配器,导致同一物理GPU被重复枚举且LUID不同。此时不能用LUID做唯一标识,建议改用以下两种方式过滤:

  • 硬件ID组合:对每个枚举到的IDXGIAdapter,调用GetDesc获取DXGI_ADAPTER_DESC,将VendorId、DeviceId、SubSysId、Revision这四个字段组合成唯一标识,同一物理GPU的这组值完全一致。
  • 设备实例路径:直接使用DXGI_ADAPTER_DESC中的DeviceName字段,它是系统给设备分配的唯一路径(格式类似\\?\pci#ven_10de&dev_1e07...),物理GPU的路径不会随远程桌面连接变化。

实现时维护一个存储已标识的集合,遍历枚举结果时只保留首次出现的唯一标识对应的适配器即可。

获取准确显存信息

Win32_VideoController的AdapterRAM字段确实不可靠,推荐用DXGI接口获取:

  • 升级到IDXGIAdapter1(通过QueryInterface从IDXGIAdapter转换),调用GetDesc1获取DXGI_ADAPTER_DESC1结构,其中:
    • DedicatedVideoMemory:物理独立显存大小
    • DedicatedSystemMemory:GPU专用的系统内存
    • SharedSystemMemory:GPU可共享的系统内存
      这些值都是准确的,比如12GB的Titan V会返回对应大小的数值。

替代枚举方案

如果IDXGIFactory的枚举逻辑仍有问题,可以用Win32 SetupAPI直接枚举显示设备:

  • 调用SetupDiGetClassDevs,指定GUID_DEVINTERFACE_DISPLAY_ADAPTER作为设备类GUID。
  • 用SetupDiEnumDeviceInterfaces遍历所有显示适配器,通过SetupDiGetDeviceRegistryProperty读取:
    • SPDRP_HARDWAREID:用于过滤重复的物理GPU
    • SPDRP_DEVICE_MEMORY:准确的显存大小(注意单位为字节,需转换为GB等单位)
      这种方式可以直接排除远程桌面生成的虚拟适配器,因为虚拟适配器的硬件ID会包含远程桌面相关标识。

内容的提问来源于stack exchange,提问作者LOST

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:52:05