Есть ли способ программно выбрать GPU рендеринга в среде с несколькими GPU? (Windows)

Вопрос

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

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

Есть ли какой-либо надежный метод для принудительного преобразования графического процессора в 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, включающего только экран в желаемой графической карте, а затем включение других /s.
    Это единственный способ, которым я нашел NVS 285 в качестве средства визуализации, но он уродлив, и я не знаю, является ли он автоматизируемым или если он будет работать во всех случаях.

  • Попытка выбрать GPU рендеринга с помощью расширения WGL_NV_gpu_affinity.
    Благодаря комбинации FX 1700 и FX 570 расширение сообщает оба GPU как совместимые, и я могу ограничить рендеринг только одним из них. С парой 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 (интегрированной в CPU (Sandy Bridge)) и одним AMD Radeon HD 6450. Во всех случаях рендеринг работает на обоих экранах, но рендеринг GPU зависит от некоторых переменных:

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

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

  • Если основной экран подключен к AMD, я могу выбрать любой графический процессор в качестве средства визуализации.
  • Если основной экран подключен к Intel, я могу выбрать Intel как средство визуализации (бесполезно, поскольку это автоматически), но я получаю сообщение об ошибке, если я попытаюсь выбрать AMD; Я думаю, что это может быть ошибкой в ​​драйвере.
+17
10 июн. '11 в 12:13
источник поделиться
1 ответ

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

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

+4
10 июн. '11 в 13:38
источник

Посмотрите другие вопросы по меткам или Задайте вопрос