【问题标题】:Vulkan SDK detects only 1 GPU at a timeVulkan SDK 一次只检测到 1 个 GPU
【发布时间】:2018-12-26 22:55:59
【问题描述】:

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

【问题讨论】:

    标签: c vulkan optimus


    【解决方案1】:

    我不知道你的意思是什么

    如果我在集成 GPU 上运行

    对比

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

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

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

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

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

    【讨论】:

    • 感谢您的回复。但是,将其设置为在 NVIDIA 面板上自动检测会产生与在 Intel 上运行相同的结果,但它没有列出 NVIDIA GPU。还添加__declspec(dllexport) uint32_t NvOptimusEnablement = 0x00000001;(没有extern "C" {},因为它已经用C 编写)并没有改变任何东西。如果 Vulkan 有驱动程序并且它们处于活动状态,那么无论用户配置如何,Vulkan 是否都应该能够检测到这两个 GPU?
    • @Israphel:您谈论“Vulkan”应该做什么,好像它比驱动程序或操作系统所说的具有更高的优先级。它没有。如果 NVIDIA 的 Optimus 技术劫持了操作系统后端,以至于它总是只能看到一个 GPU,只需切换哪个 GPU 暴露给应用程序,Vulkan 就无法解决这个问题。 Vulkan 是屈从的;驱动因素最终是在控制之中。现在,我并不是说没有办法,但你不应该假设一定有办法。
    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2019-06-13
    • 2016-05-06
    • 2012-12-01
    相关资源
    最近更新 更多