如何过滤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:用于过滤重复的物理GPUSPDRP_DEVICE_MEMORY:准确的显存大小(注意单位为字节,需转换为GB等单位)
这种方式可以直接排除远程桌面生成的虚拟适配器,因为虚拟适配器的硬件ID会包含远程桌面相关标识。
内容的提问来源于stack exchange,提问作者LOST
相关产品推荐
相关产品推荐

