Como posso definir meu aplicativo para executar na GPU de alto desempenho por padrão?

12

Atualmente, boa parte dos laptops vem com 2 GPUs - uma de alto desempenho e outra de economia de energia (menos potente). A maioria dos aplicativos que uso no meu laptop é executada com minha GPU integrada (de economia de energia), mas algumas delas estão definidas para abrir com o cartão de alto desempenho. Estou tentando configurar o aplicativo que estou criando para executar na GPU de alto desempenho por padrão, mas não consigo encontrar nenhuma informação sobre o tópico em nenhum lugar. Espero que alguém possa esclarecer um pouco isso. Distribuirei meu aplicativo com um instalador do NSIS e acho que terei que adicionar o caminho do meu aplicativo a uma lista de aplicativos para placas NVidia / ATI. O aplicativo está programado em C #. Além disso, alguém sabe como as coisas estão nos PCs de mesa? O que acontece se um PC tiver 2 GPUs e eu tiver que escolher o mais poderoso?

Milcho

Milcho
fonte

Respostas:

7

A NVIDIA possui um documento aqui descrevendo algumas estratégias que podem ser úteis para você: http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf - infelizmente, o que eu sugeriria de outra forma - o NvOptimusEnablement exportar - está documentado apenas para C ++; pode ser possível também fazer isso com C #, mas alguém que realmente conhece precisaria concordar com as informações.

Não estou ciente de nada semelhante para a AMD.

Infelizmente, parece que não há uma maneira independente de fornecedor de fazer isso (até mesmo enumerar dispositivos de exibição deixaria você à mercê dos usuários forçando as configurações através de seus painéis de controle do driver, o que os usuários têm uma tendência infeliz de fazer para maximizar jogos que não vêm com configurações gráficas totalmente configuráveis). Na ausência de tal, você pode ter que confiar em um leia-me e esperar que as pessoas o leiam de verdade!

Maximus Minimus
fonte
+1: Eu não conhecia esse NvOptimusEnablementtruque da Optimus , mas deveria. Parece algo recente (driver 302.x +) Obrigado.
23413 Sean Sean Middleditch
1
stackoverflow.com/questions/17458803/… Para qualquer pessoa curiosa sobre os equivalentes da AMD, perguntei isso (no SO, uma vez que não é específico do jogo).
6133 Sean Middleditch
1
Você pode chamar funções C ++ do C # usando p / invoke, como último recurso.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft - Não é uma função C ++; é uma variável global exportada.
Maximus Minimus
5

Em geral, você não pode.

O driver de GPU dupla oculta as duas GPUs por trás de uma única interface; portanto, soluções como a de Nathan Reed normalmente não funcionam nas configurações mais comuns de GPU dupla de alta velocidade / baixa potência.

A seleção da GPU deve ser tratada pelo driver de alguma forma. Com o NVIDIA Optimus, você geralmente atualiza os perfis Optimus para adicionar o aplicativo à lista de aplicativos que usam a GPU discreta, geralmente clicando com o botão direito do mouse no EXE e clicando em Propriedades. Você também pode usar algumas chamadas muito específicas da Optimus. conforme resposta do mh01. Com as configurações da AMD, isso é totalmente diferente.

Em outros sistemas, existe um comutador de hardware ou um sinalizador do SO para decidir qual GPU está ativo. Novamente, o aplicativo não tem controle sobre qual GPU é usada.

Isso é algo que realmente espero que seja "corrigido" em uma futura atualização do DirectX. Idealmente, ambas as GPUs seriam enumeradas como sugerido por Nathan e, em seguida, haveria dicas para indicar qual delas se destina a alta velocidade ou baixa potência, para que um aplicativo possa escolher de maneira inteligente a correta ou até alternar qual dispositivo usa com base em qualquer fatores (digamos, deixar um navegador da Web escolher dependendo da carga do WebGL).

Sean Middleditch
fonte
Ahh, interessante. Não usei um desses sistemas com GPU dupla, então não sabia que o motorista fingia que era o mesmo. Você acha que o driver pode monitorar o nível de uso da GPU para um determinado aplicativo e alterná-lo para o de alto desempenho, se necessário.
Nathan Reed
1
Não pode. O hardware tem recursos diferentes. Imagine se você tivesse mudado de uma GPU com um tamanho máximo de textura de 2048 para uma com um máximo de 1024, ou alguma outra característica - todo o aplicativo seria interrompido. Se, se fosse para uma GPU mais capaz, os buffers precisariam de migração (demorando tempo e causando um engate de quadro indesejado) e os shaders precisariam de recompilação. O aplicativo precisa ser responsável por esse processo e ativar ou desativar qualquer opção. Infelizmente, as APIs para isso ainda não foram desenvolvidas.
Sean Middleditch
1
Isso é complicado pelo fato de os usuários frequentemente quererem substituir a comutação da GPU em seu laptop, talvez para economizar bateria. Esse é um dos motivos pelos quais prefiro delegar a comutação de GPU no sistema operacional, porque ele também sabe o estado de energia do laptop.
Fake Name
4

Você deve poder enumerar as GPUs no sistema e escolher qual delas usar quando o aplicativo iniciar. Você não mencionou qual API está usando, mas, por exemplo, no D3D11, você usaria o IDXGIFactory :: EnumAdapters para obter a lista de GPUs e passar a que você deseja D3D11CreateDevice .

O DXGI pode fornecer algumas informações limitadas sobre a GPU, como uma sequência de descrição, ID do fornecedor e ID do dispositivo. Suponho que você possa usar essas informações para dizer qual GPU é de alto desempenho, mas você precisaria criar algum tipo de banco de dados de GPUs ou tentar usar algumas heurísticas para adivinhar. Ou você pode deixar o usuário escolher qual GPU usar na inicialização.

Nathan Reed
fonte