Vulkan SDK一次只能检测到1个GPU

时间:2018-12-26 22:55:59

标签: c vulkan optimus

我有一台Optimus笔记本电脑(这意味着它有两张图形卡;一张集成显卡和一张离散显卡(专用))。它们都支持Vulkan,我可以在代码中单独使用它们。但是有一个问题,我无法在同一程序上列出或使用它们。在运行我的代码之前,我必须选择它在哪个GPU上运行(在Windows上:右键单击“ myProgram.exe”->使用图形处理器运行,在Linux上:./“myProgram”用于集成GPU,而primusrun ./“myProgram”用于离散),即使两个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编译器和操作系统,Windows 10上的MSVC 1912和Arch Linux上的gcc 8.2.1。安装了Vulkan运行时和ICD加载程序,在两个OS上都得到了相同的结果。

这是我的代码:

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?

1 个答案:

答案 0 :(得分:0)

我不确定您是什么意思

  

如果我在集成GPU上运行

  

如果我在专用GPU上运行” ...

如果您要进入nVidia控制面板并为您的应用程序指定目标GPU,那么您将看到我所期望的几乎所有东西……只有该GPU可以在您的应用程序中看到。

我相信您应该做的是将其设置为自动检测,然后确保您正在二进制文件中导出“ Optimus Aware”标志。您的测试代码中应该有类似的内容

extern "C" {
_declspec(dllexport) uint32_t NvOptimusEnablement = 0x00000001;
}

这要么会使Vulkan看到两个GPU,要么迫使您的应用程序仅自动看到离散的GPU,但无需在控制面板中执行任何操作即可(不确定哪个)。