tagger tag windows opengl multiple-monitors multi-gpu

windows - tagger - tag folders



¿Hay alguna forma de seleccionar mediante programación la GPU de representación en un entorno de múltiples GPU?(Windows) (1)

Pregunta

Tengo una aplicación OpenGL que se ejecutará en máquinas con diversas configuraciones multi-GPU (y posiblemente diferentes versiones de Windows, desde XP a 7). ¿Hay una forma general de seleccionar la GPU específica que actuará como el procesador OpenGL independientemente de la combinación de GPU (por ejemplo, NVIDIA + NVIDIA, NVIDIA + AMD, NVIDIA + Intel, etc.)? Debe ser una solución que se pueda aplicar desde el código de la aplicación, es decir, directamente en C ++ o un script que se llame desde la aplicación, sin la intervención del usuario final.

A continuación se muestran los detalles de varias pruebas que he hecho para intentar encontrar una solución, comenzando con casos muy específicos, pero tal vez haya una solución que pueda funcionar en todos o en la mayoría de los casos.

¿Hay algún método confiable para forzar qué GPU procesa OpenGL?

Cualquier sugerencia será muy apreciada. ¡Gracias por adelantado!

Probé posibles soluciones

Windows XP 64 con dos NVIDIA Quadro

Pruebas con combinaciones de dos tarjetas Quadro.

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

Al usar el mismo controlador (versión 275.36) en Windows XP de 64 bits, he tenido un éxito relativo con varios métodos, como:

  • Dejar que el conductor decida.
    Esta solución solo es válida siempre que ambas tarjetas utilicen el mismo controlador y decida utilizar la tarjeta deseada. Así que es demasiado específico y quizás impredecible.

  • Cambiar la configuración del controlador en el código con NVAPI antes de dejar que el controlador decida.
    Con esta solución, en teoría es posible hacer que el controlador decida como quiero, pero es difícil, necesita que ambas tarjetas usen los mismos controladores y no siempre funciona (con FX 1700 + NVS 285 no funciona).

  • Cambiando la pantalla principal.
    Esto tiene el efecto de que la aplicación se abre en la pantalla principal seleccionada de forma predeterminada. Esta solución solo ha funcionado por sí misma con la combinación FX 1700 + FX 570. Con FX 1700 + FX 540, el renderizador depende de la configuración del controlador, independientemente de la pantalla principal, y con FX 1700 + NVS 285, el renderizador es siempre el FX 1700.

  • Creando el contexto OpenGL cuando la ventana está en una pantalla específica.
    La ventana se puede crear en la pantalla deseada, independientemente de cuál sea la principal, pero tiene los mismos problemas que la solución anterior.

  • Creando el contexto OpenGL habiendo habilitado solo la pantalla en la tarjeta gráfica deseada y luego habilitando los otros / s.
    Esta es la única forma en que he encontrado usar el NVS 285 como procesador, pero es feo y no sé si es automatizable o si funcionaría en todos los casos.

  • Intentando seleccionar la GPU de representación con la extensión WGL_NV_gpu_affinity .
    Con la combinación del FX 1700 y el FX 570, la extensión informa que ambas GPU son compatibles y puedo limitar la representación solo a uno de ellos. Con el par FX 1700 + FX 540, la extensión solo reporta una GPU compatible, que es la que el controlador decide usar para la representación de OpenGL. Con la combinación FX 1700 + NVS 285, solo se reporta el FX 1700, siempre (supongo que el NVS 285 no es compatible con esta extensión, ya que si es la única tarjeta en uso, la extensión aún no lo informa).

Windows 7 64 con Intel y AMD

Este sistema funciona con Windows 7 de 64 bits y las tarjetas gráficas son una Intel HD Graphics 2000 (integrada en la CPU (Sandy Bridge)) y una AMD Radeon HD 6450. En todos los casos, la representación funciona en ambas pantallas, pero la representación de la GPU varía Dependiendo de algunas variables:

  • Si la pantalla principal está conectada a AMD y la ventana se abre en esta pantalla, AMD es el procesador.
  • Si la pantalla principal está conectada al AMD y la ventana se abre en la otra pantalla, entonces el renderizador es "GDI Genérico", que es muy lento.
  • Si la pantalla principal está conectada a Intel, entonces Intel es el procesador, independientemente de donde se abra la ventana.

Con este sistema también he probado una solución propuesta en los foros de OpenGL . TL; DR: es un método intrépido para elegir el controlador utilizado por OpenGL, por lo que puede elegir entre GPU que usan controladores diferentes, pero no entre tarjetas que usan el mismo controlador. Obtuve los siguientes resultados:

  • Si la pantalla principal está conectada al AMD, puedo elegir cualquier GPU como procesador.
  • Si la pantalla principal está conectada a Intel, puedo elegir Intel como procesador (inútil, ya que esto es automático), pero recibo un error si intento elegir el AMD; Creo que esto puede ser un error en el controlador.

Ya que está utilizando tarjetas Quadro de nvidia, puede usar la extensión WGL_NV_gpu_affinity para seleccionar la GPU.

No estoy seguro de los chips ATI, pero creo que es AMD_gpu_association