我有一台 Optimus 笔记本(意味着它有两张显卡;一张集成显卡,一张独立显卡(专用))。它们都支持 Vulkan,我可以在我的代码中单独使用它们。但是有一个问题,我不能在同一个程序上列出或使用它们。在运行我的代码之前,我必须选择它在哪个 GPU 上运行(在 Windows 上:右键单击“myProgram.exe”-> 使用图形处理器运行,在 Linux 上:./“myProgram”用于集成 GPU,primusrun ./“myProgram”用于离散的),即使两个 GPU 同时处于活动状态,它也只会检测到我在其上运行代码的那个。
我的 GPU 是 Intel UHD Graphics 630 和 NVIDIA GeForce GTX 1050 Ti。我在 Windows 上使用 LunarG Vulkan SDK 1.1.92、Intel 驱动程序版本 25.20.100.6326、NVIDIA 驱动程序版本 416.32 和 Linux 上的 415.25。作为 C 编译器和操作系统,Windows 10 上的 MSVC 1912 和 Arch Linux 上的 gcc 8.2.1。安装了 Vulkan 运行时和 ICD 加载程序,我在两个操作系统上得到了相同的结果。
这是我的代码:
uint32_t deviceCount;
vkEnumeratePhysicalDevices(instance, &deviceCount, NULL);
printf("Found: %d\n", deviceCount);
VkPhysicalDevice *devices = malloc(deviceCount * sizeof(VkPhysicalDevice));
vkEnumeratePhysicalDevices(instance, &deviceCount, devices);
for(uint32_t deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++)
{
VkPhysicalDeviceProperties deviceProperties;
vkGetPhysicalDeviceProperties(devices[deviceIndex], &deviceProperties);
printf("%s\n", deviceProperties.deviceName);
}
这是我得到的输出:
如果我在集成 GPU 上运行:
Found: 1
Intel(R) UHD Graphics 630
如果我在专用 GPU 上运行:
Found: 1
GeForce GTX 1050 Ti
我期待的是:
Found: 2
Intel(R) UHD Graphics 630
GeForce GTX 1050 Ti
而且我应该能够选择它们中的任何一个来在我的程序中使用,而无需在运行之前使用一些驱动程序级代码或在我的操作系统上设置它。Vulkan 毕竟是相对低级的 API。有没有办法强制列出我系统上所有活动的 GPU?