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

Вопрос

У меня есть приложение 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, включив только экран в нужной видеокарте, а затем включив другие / s.
    Это единственный способ использовать 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. Во всех случаях рендеринг работает на обоих экранах, но рендеринг GPU варьируется в зависимости от некоторых переменных:

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

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

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

1 Ответ

5 голосов
/ 10 июня 2011

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

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

...