Есть ли способ программно выбрать графический процессор для рендеринга в среде с несколькими графическими процессорами? (Windows)

#windows #opengl #multiple-monitors #multi-gpu

#Windows #opengl #несколько мониторов #мульти-графический процессор

Вопрос:

Вопрос

У меня есть приложение OpenGL, которое будет запускаться на машинах с различными конфигурациями с несколькими графическими процессорами (и, возможно, с разными версиями Windows, от XP до 7). Есть ли общий способ выбрать конкретный графический процессор, который будет действовать как средство визуализации OpenGL независимо от комбинации графических процессоров (например, NVIDIA NVIDIA, NVIDIA AMD, NVIDIA Intel и т.д.)? Это должно быть решение, которое может быть применено из кода приложения, то есть непосредственно на C , или скрипт, который вызывался бы из приложения, без вмешательства конечного пользователя.

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

Есть ли какой-либо надежный способ заставить какой графический процессор выполняет рендеринг OpenGL?

Любая подсказка будет очень оценена. Заранее спасибо!

Пробовал возможные решения

Windows XP 64 с двумя NVIDIA Quadro

Тестирование с использованием комбинаций двух карт Quadro

  • Quadro FX 1700 Quadro FX 570
  • Quadro FX 1700 Quadro FX 540
  • Quadro FX 1700 Quadro NVS 285

используя тот же драйвер (версия 275.36) под 64-разрядной версией Windows XP, я добился относительного успеха с различными методами, такими как:

  • Предоставив драйверу решать.
    Это решение хорошо только до тех пор, пока обе карты используют один и тот же драйвер, и он решает использовать нужную карту. Так что это слишком специфично и, возможно, непредсказуемо.

  • Изменение настроек драйвера в коде с помощью NVAPI, прежде чем позволить драйверу принимать решение.
    С помощью этого решения теоретически возможно заставить драйвер выбирать так, как я хочу, но это сложно, требует, чтобы обе карты использовали одни и те же драйверы, и не всегда работает (с FX 1700 NVS 285 это не работает).

  • Изменение главного экрана.
    Это приводит к тому, что приложение открывается на выбранном главном экране по умолчанию. Это решение работало само по себе только с комбинацией FX 1700 FX 570. С FX 1700 FX 540 средство визуализации зависит от настроек драйвера, независимо от главного экрана, а с FX 1700 NVS 285 средством визуализации всегда является FX 1700.

  • Создание контекста OpenGL, когда окно находится на определенном экране.
    Окно может быть создано на желаемом экране, независимо от того, какой из них является основным, но оно имеет те же проблемы, что и вышеупомянутое решение.

  • Создаем контекст OpenGL, включив только экран на нужной видеокарте, а затем включив другие / ы.
    Это единственный найденный мной способ использовать NVS 285 в качестве средства рендеринга, но он уродлив, и я не знаю, можно ли его автоматизировать или он будет работать во всех случаях.

  • Пытаюсь выбрать графический процессор для рендеринга, используя расширение WGL_NV_gpu_affinity.
    При сочетании FX 1700 и FX 570 расширение сообщает, что оба графических процессора совместимы, и я могу ограничить рендеринг только одним из них. В паре FX 1700 FX 540 расширение сообщает только об одном совместимом графическом процессоре, который драйвер решает использовать для рендеринга OpenGL. При использовании комбинации FX 1700 NVS 285 всегда отображается только FX 1700 (я полагаю, что NVS 285 не поддерживает это расширение, потому что, если это единственная используемая карта, расширение все равно не сообщает о ней).

Windows 7 64 с Intel и AMD

Эта система работает с 64-разрядной версией Windows 7, а графические карты — одна Intel HD Graphics 2000 (интегрирована в центральный процессор (Sandy Bridge)) и одна AMD Radeon HD 6450. Во всех случаях рендеринг работает на обоих экранах, но графический процессор рендеринга варьируется в зависимости от некоторых переменных:

  • Если главный экран подключен к AMD и на этом экране открыто окно, то AMD является средством рендеринга.
  • Если главный экран подключен к AMD, а окно открыто на другом экране, то средство рендеринга является «универсальным GDI», что работает очень медленно.
  • Если главный экран подключен к Intel, то Intel является средством рендеринга, независимо от того, где открыто окно.

С этой системой я также попробовал решение, предложенное на форумах OpenGL. TL; DR: это хакерский метод выбора драйвера, используемого OpenGL, поэтому он может выбирать между графическими процессорами, которые используют разные драйверы, но не между картами, которые используют один и тот же драйвер. Я получил следующие результаты:

  • Если главный экран подключен к AMD, я могу выбрать любой графический процессор в качестве средства рендеринга.
  • Если главный экран подключен к Intel, я могу выбрать Intel в качестве средства рендеринга (бесполезно, поскольку это происходит автоматически), но я получаю сообщение об ошибке, если пытаюсь выбрать AMD; Я думаю, это может быть ошибка в драйвере.

Комментарии:

1. Любопытно, что с Direct3D рендеринг работает на обоих экранах «из коробки», даже с комбинацией FX 1700 NVS 285.

2. Ссылка на форум недоступна. Не могли бы вы пересказать идею?

3. Новая ссылка: community.khronos.org/t /…

Ответ №1:

Поскольку вы используете видеокарты nvidia Quadro, вы можете использовать расширение WGL_NV_gpu_affinity для выбора графического процессора.

Я не уверен насчет чипов ATI, но я думаю, что это AMD_gpu_association

Комментарии:

1. Спасибо за ваш ответ. Я уже пробовал расширение WGL_NV_gpu_affinity (забыл упомянуть об этом в вопросе, извините), хотя результаты не были удовлетворительными: он обнаружил оба графических процессора только в одном случае, в остальных обнаружил только один графический процессор, так что это было бесполезно : ( Я отредактирую вопрос с более подробным объяснением моих результатов с помощью расширения WGL_NV_gpu_affinity.