Come posso impostare la mia applicazione per l'esecuzione sulla GPU ad alte prestazioni per impostazione predefinita?


12

Oggi molti laptop sono dotati di 2 GPU: una ad alte prestazioni e una a risparmio energetico (meno potente). La maggior parte dell'applicazione, che uso sul mio laptop, funziona con la mia GPU integrata (a risparmio energetico), ma alcune di esse sono ancora aperte con la scheda ad alte prestazioni. Sto cercando di configurare l'app che sto costruendo per essere eseguita sulla GPU ad alte prestazioni per impostazione predefinita, ma non riesco a trovare alcuna informazione sull'argomento da nessuna parte. Spero che qualcuno possa far luce su questo. Distribuirò la mia applicazione con un programma di installazione NSIS e suppongo che dovrò aggiungere il percorso della mia applicazione a un elenco di applicazioni per schede NVidia / ATI. L'applicazione è programmata in C #. Inoltre, qualcuno sa come stanno le cose con i PC desktop? Cosa succede se un PC ha 2 GPU e devo scegliere quella più potente?

Milcho

Risposte:


7

NVIDIA ha un documento che delinea alcune strategie che potrebbero esserti utili: http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf - sfortunatamente, quello che altrimenti suggerirei - NvOptimusEnablement export - è documentato solo per C ++; potrebbe essere possibile farlo anche con C #, ma qualcuno che in realtà sa dovrebbe entrare in contatto con le informazioni.

Non sono a conoscenza di qualcosa di simile per AMD.

Quindi sfortunatamente sembra che non ci sia un modo indipendente dal fornitore per farlo (anche l'enumerazione dei dispositivi di visualizzazione ti lascerebbe in balia degli utenti forzando le impostazioni attraverso i loro pannelli di controllo del driver, che gli utenti hanno una sfortunata tendenza a fare per massimizzare giochi che non hanno impostazioni grafiche completamente configurabili). In assenza di ciò, potresti dover fare affidamento su un file Leggimi e sperare che le persone lo leggano davvero!


+1: Non conoscevo questo NvOptimusEnablementtrucco di Optimus , ma avrei dovuto. Sembra una cosa recente (driver 302.x +) Grazie.
Sean Middleditch,

1
stackoverflow.com/questions/17458803/… Per chiunque fosse curioso di conoscere gli equivalenti AMD, l'ho chiesto (su SO poiché non specifico del gioco).
Sean Middleditch,

1
È possibile chiamare le funzioni C ++ da C # usando p / invoke, come ultima risorsa.
BlueRaja - Danny Pflughoeft,

@ BlueRaja-DannyPflughoeft - Non è una funzione C ++; è una variabile globale esportata.
Maximus Minimus,

5

In generale, non puoi.

Il driver a doppia GPU nasconde le due GPU dietro un'unica interfaccia, quindi le soluzioni come Nathan Reed in genere non funzionano nelle configurazioni più comuni a doppia GPU ad alta velocità / bassa potenza.

La selezione della GPU deve essere gestita dal driver in qualche modo. Con NVIDIA Optimus, di solito aggiorni i profili Optimus per aggiungere l'applicazione all'elenco delle applicazioni che utilizzano la GPU discreta, generalmente facendo clic con il pulsante destro del mouse su EXE e facendo clic su Proprietà. Puoi anche utilizzare alcune chiamate molto specifiche per Optimus. secondo la risposta di mh01. Con le configurazioni AMD, questo è totalmente diverso.

Su ancora altri sistemi, c'è uno switch hardware o un flag OS per decidere quale GPU è attiva. Ancora una volta, l'applicazione non ha alcun controllo su quale GPU viene utilizzata.

Questo è qualcosa che spero davvero sia "risolto" in un futuro aggiornamento di DirectX. Idealmente entrambe le GPU sarebbero enumerate come suggerito da Nathan e quindi ci sarebbero suggerimenti per indicare quale di esse è pensata per alta velocità o bassa potenza, quindi un'applicazione può scegliere in modo intelligente quella giusta o persino cambiare il dispositivo che utilizza in base a qualunque fattori (ad esempio, lasciare che un browser Web scelga a seconda del carico WebGL).


Ah, interessante. Non ho usato uno di questi sistemi a doppia GPU, quindi non sapevo che il driver fingesse che fossero gli stessi. Penseresti che il driver possa monitorare il livello di utilizzo della GPU per una data app e passare a quella ad alta prestazione se necessario.
Nathan Reed,

1
Non può. L'hardware ha diverse funzionalità. Immagina se passassi da una GPU con una dimensione massima della trama di 2048 a una con un massimo di 1024 o qualche altra caratteristica: l'intera app si spezzerebbe. Se si dovesse andare in una GPU più capace in ogni caso, i buffer avrebbero bisogno della migrazione (prendendo tempo e causando un frame hitch indesiderato) e gli shader avrebbero bisogno di essere ricompilati. L'app deve essere responsabile di questo processo e attivare o disattivare qualsiasi passaggio. Sfortunatamente, le API per questo non sono ancora state ben definite.
Sean Middleditch,

1
Ciò è complicato dal fatto che gli utenti spesso vogliono ignorare l'accensione della GPU sul proprio laptop, forse per risparmiare la batteria. Questo è uno dei motivi per cui preferisco delegare il passaggio della GPU al sistema operativo, perché conosce anche lo stato di alimentazione del laptop.
Nome falso

4

Dovresti essere in grado di enumerare le GPU sul sistema e scegliere quale utilizzare all'avvio dell'applicazione. Non hai menzionato l'API che stai utilizzando, ma ad esempio in D3D11 useresti IDXGIFactory :: EnumAdapters per ottenere l'elenco di GPU e passare quello che vuoi a D3D11CreateDevice .

DXGI può fornire alcune informazioni limitate sulla GPU, come una stringa di descrizione, un ID fornitore e un ID dispositivo. Suppongo che tu possa usare queste informazioni per dire quale GPU è quella ad alte prestazioni, ma dovresti costruire un qualche tipo di database di GPU, o provare a usare qualche euristica per indovinare. Oppure potresti consentire all'utente di scegliere quale GPU utilizzare all'avvio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.