¿Cómo puedo configurar mi aplicación para que se ejecute en la GPU de alto rendimiento de forma predeterminada?

12

Hoy en día, una gran cantidad de computadoras portátiles vienen con 2 GPU: una de alto rendimiento y una de bajo consumo (menos potente). La mayor parte de la aplicación, que uso en mi computadora portátil, se ejecuta con mi GPU integrada (de ahorro de energía), pero aún así algunas de ellas están configuradas para abrirse con la tarjeta de alto rendimiento. Estoy tratando de configurar la aplicación que estoy construyendo para ejecutarse en la GPU de alto rendimiento de forma predeterminada, pero no puedo encontrar ninguna información sobre el tema en ninguna parte. Espero que alguien pueda arrojar un poco de luz sobre esto. Distribuiré mi aplicación con un instalador NSIS y supongo que tendré que agregar la ruta de mi aplicación a una lista de aplicaciones para tarjetas NVidia / ATI. La aplicación está programada en C #. Además, ¿alguien sabe cómo están las cosas con las PC de escritorio? ¿Qué sucede si una PC tiene 2 GPU y tengo que elegir la más potente?

Milcho

Milcho
fuente

Respuestas:

7

NVIDIA tiene un documento aquí que describe algunas estrategias que pueden ser útiles para usted: http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf - desafortunadamente, la que sugeriría de otro modo - NvOptimusEnablement export - solo está documentado para C ++; También es posible hacer esto con C #, pero alguien que realmente sepa tendría que intervenir con la información.

No estoy al tanto de nada similar para AMD.

Desafortunadamente, parece que no hay una forma independiente de hacer esto por parte del vendedor (incluso enumerar dispositivos de visualización lo dejaría a merced de los usuarios forzando la configuración a través de sus paneles de control del controlador, que los usuarios tienen una desafortunada tendencia a hacer para maximizar juegos que no vienen con configuraciones gráficas totalmente configurables). ¡En ausencia de tal, puede que tenga que confiar en un archivo Léame y esperar que la gente realmente lo lea!

Maximus Minimus
fuente
+1: No conocía este NvOptimusEnablementtruco de Optimus , pero debería haberlo sabido . Parece que es algo reciente (controlador 302.x +) Gracias.
Sean Middleditch
1
stackoverflow.com/questions/17458803/… Para cualquier otra persona curiosa sobre los equivalentes de AMD, pregunté esto (en SO, ya que no es específico del juego).
Sean Middleditch
1
Puede llamar a las funciones de C ++ desde C # usando p / invoke, como último recurso.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft: no es una función de C ++; Es una variable global exportada.
Maximus Minimus
5

En general, no puedes.

El controlador de doble GPU oculta las dos GPU detrás de una sola interfaz, por lo que las soluciones como las de Nathan Reed generalmente no funcionan en las configuraciones de GPU dual de alta velocidad / baja potencia más comunes.

La selección de GPU debe ser manejada por el controlador de alguna manera. Con NVIDIA Optimus, generalmente actualiza los perfiles Optimus para agregar la aplicación a la lista de aplicaciones que usan la GPU discreta, generalmente haciendo clic derecho en el EXE y haciendo clic en Propiedades. También puede usar algunas llamadas muy específicas a Optimus. según la respuesta de mh01. Con las configuraciones de AMD, esto es totalmente diferente.

En otros sistemas, hay un interruptor de hardware o un indicador del sistema operativo para decidir qué GPU está activa. Nuevamente, la aplicación no tiene control sobre qué GPU se usa.

Esto es algo que realmente espero que esté "arreglado" en una futura actualización de DirectX. Idealmente, ambas GPU se enumerarían como sugirió Nathan y luego habría indicios para indicar cuál de ellas está destinada a alta velocidad o baja potencia, por lo que una aplicación puede elegir de manera inteligente la correcta o incluso cambiar el dispositivo que usa en función de lo que sea factores (por ejemplo, dejar que un navegador web elija dependiendo de la carga de WebGL).

Sean Middleditch
fuente
Ahh, interesante. No he usado uno de estos sistemas de doble GPU, así que no sabía que el controlador finge que son iguales. Se podría pensar que el controlador podría monitorear el nivel de uso de GPU para una aplicación determinada y cambiarlo al de alto rendimiento si es necesario.
Nathan Reed
1
No puede El hardware tiene diferentes capacidades. Imagínese si se cambia de una GPU con un tamaño máximo de textura de 2048 a una con un máximo de 1024, o alguna otra característica: toda su aplicación se rompería. Si fuera a una GPU más capaz en todos los sentidos, los búferes necesitarían migración (tomar tiempo y causar un enganche de marco no deseado) y los sombreadores necesitarían recompilación. La aplicación debe estar a cargo de este proceso y activar o desactivar cualquier cambio. Desafortunadamente, las API para él simplemente aún no se han desarrollado.
Sean Middleditch
1
Esto se complica por el hecho de que los usuarios a menudo quieren anular el cambio de GPU en su computadora portátil, tal vez para ahorrar batería. Esta es una razón por la que prefiero delegar el cambio de GPU al sistema operativo, porque también conoce el estado de energía de la computadora portátil.
Nombre falso el
4

Debería poder enumerar las GPU en el sistema y elegir cuál usar cuando se inicia su aplicación. No mencionó qué API está utilizando, pero por ejemplo en D3D11 usaría IDXGIFactory :: EnumAdapters para obtener la lista de GPU y pasar la que desea a D3D11CreateDevice .

DXGI puede brindarle información limitada sobre la GPU, como una cadena de descripción, ID de proveedor e ID de dispositivo. Supongo que puede usar esta información para saber qué GPU es la de alto rendimiento, pero tendría que construir algún tipo de base de datos de GPU, o tratar de usar algunas heurísticas para adivinar. O puede dejar que el usuario elija qué GPU usar en el inicio.

Nathan Reed
fuente