Vulkan SDK определяет только 1 графический процессор за раз

У меня есть ноутбук Optimus (имеется в виду две видеокарты: одна встроенная, а другая дискретная (выделенная)). Оба они поддерживают Vulkan, и я могу использовать каждый из них индивидуально в своем коде. Но есть проблема: я не могу перечислить или использовать их обоих в одной программе. Я должен выбрать, на каком графическом процессоре он работает, прежде чем запускать мой код (в Windows: щелкните правой кнопкой мыши «myProgram.exe» -> «Запускать с графическим процессором», в Linux: ./"myProgram »для встроенного графического процессора и primusrun ./"myProgram» для дискретный), и он обнаруживает только тот, на котором я запускаю свой код, даже когда оба графических процессора активны одновременно.

Мои графические процессоры - Intel UHD Graphics 630 и NVIDIA GeForce GTX 1050 Ti. Я использую LunarG Vulkan SDK 1.1.92, драйвер Intel версии 25.20.100.6326, драйвер NVIDIA версии 416.32 в Windows и 415.25 в Linux. В качестве компилятора C и операционной системы MSVC 1912 в Windows 10 и gcc 8.2.1 в Arch Linux. Установлена ​​среда выполнения 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);
}

Вот результаты, которые я получаю:

Если я работаю на встроенном графическом процессоре:

Found: 1
Intel(R) UHD Graphics 630

Если я работаю на выделенном графическом процессоре:

Found: 1
GeForce GTX 1050 Ti

Я ожидаю:

Found: 2
Intel(R) UHD Graphics 630
GeForce GTX 1050 Ti

И я должен иметь возможность выбрать любой из них для использования в моей программе, не беспокоясь о каком-либо коде уровня драйвера или не устанавливая его в своей ОС перед запуском. В конце концов, Vulkan - это относительно низкоуровневый API. Есть ли способ принудительно вывести список всех активных графических процессоров в моей системе?


person Israphel    schedule 26.12.2018    source источник


Ответы (1)


Я не уверен, что ты имеешь в виду под

Если я работаю на встроенном графическом процессоре

против

Если я буду работать на выделенном графическом процессоре "...

Если вы входите в панель управления nVidia и указываете целевой графический процессор для своего приложения, то вы видите в значительной степени то, что я ожидал ... только этот графический процессор, доступный для вашего приложения.

Я считаю, что вам следует установить его на автоматическое обнаружение, а затем убедиться, что вы экспортируете флаг «Optimus Aware» в свой двоичный файл. В вашем тестовом коде должно быть что-то подобное

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

Это должно либо привести к тому, что Vulkan увидит оба графических процессора, или заставит ваше приложение автоматически видеть только дискретный графический процессор, но вам не придется делать что-либо на панели управления, не зная, какой именно.

person Jherico    schedule 27.12.2018
comment
Спасибо за ответ. Однако установка его на автоматическое обнаружение на панели NVIDIA дает те же результаты, что и при запуске на Intel, он не перечисляет NVIDIA GPU. Также добавление __declspec(dllexport) uint32_t NvOptimusEnablement = 0x00000001; (без extern "C" {}, как это уже написано на C) ничего не изменило. Разве Vulkan не должен обнаруживать оба графических процессора независимо от конфигурации пользователя, если у них есть драйверы и они активны? - person Israphel; 27.12.2018
comment
@Israphel: Вы говорите о том, что должен делать Vulkan, как будто он имеет более высокий приоритет, чем то, что говорят драйверы или ОС. Это не так. Если технология NVIDIA Optimus захватывает серверную часть ОС, так что она всегда видит только один графический процессор, просто переключая, какой из них доступен приложению, Vulkan не сможет это исправить. Вулкан подчиняется; в конечном итоге все контролируют драйверы. Я не говорю, что способа нет, но вы не должны предполагать, что он должен быть. - person Nicol Bolas; 27.12.2018