0

我有一台 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?

4

1 回答 1

1

我不确定你的意思

如果我在集成 GPU 上运行

相对

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

如果您要进入 nVidia 控制面板并为您的应用程序指定一个目标 GPU,那么您会看到几乎我所期望的……只有那个 GPU 暴露给您的应用程序。

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

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

这应该会导致 Vulkan 看到两个 GPU,或者强制您的应用程序自动只看到离散的 GPU,但您不必在控制面板中执行任何操作,不确定是哪个。

于 2018-12-27T00:22:35.983 回答