我有一个Optimus笔记本(意味着它有两个图形卡;一个是集成的,一个是离散的(专用))。它们都支持Vulkan,我可以在代码中单独使用它们。但有一个问题,我不能在同一个程序中列出或使用它们。在运行我的代码之前,我必须选择它在哪个GPU上运行(在Windows上:右键单击"myProgram.exe"->使用图形处理器运行,在Linux上:./"myProgram"用于集成GPU,"myProgram"用于离散GPU),即使两个GPU同时处于活动状态,它也只检测我运行代码的GPU。
我的GPU是Intel UHD Graphics 630和NVIDIA GeForce GTX 1050 Ti。我使用的是LunarG Vulkan SDK 1.1.92、Intel驱动程序版本25.20.100.6326、Windows上的NVIDIA驱动程序版本416.32和Linux上的415.25。作为C编译器和操作系统,MSVC 1912在Windows 10上运行,gcc 8.2.1在Arch Linux上运行。安装了Vulkan运行时和ICD加载程序,我在两个操作系统上都得到了相同的结果。
这是我的代码:
uint32_t deviceCount;
vkEnumeratePhysicalDevices(instance, &deviceCount, NULL);
printf("Found: %dn", 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("%sn", 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?
我不知道你所说的是什么意思
如果我在集成GPU 上运行
与
如果我在专用GPU上运行"…
如果你进入英伟达控制面板并为你的应用程序指定目标GPU,那么你会看到我所期待的。。。只有暴露在应用程序中的GPU。
我认为您应该将其设置为自动检测,然后确保在二进制文件中导出"Optimus Aware"标志。你应该在你的测试代码中有这样的东西
extern "C" {
_declspec(dllexport) uint32_t NvOptimusEnablement = 0x00000001;
}
这应该会导致Vulkan同时看到两个GPU,或强制应用程序自动只看到离散GPU,但不必在控制面板中做任何事情,也不确定是哪一个。