Comment puis-je configurer mon application pour qu'elle s'exécute sur le GPU haute performance par défaut?

12

De nos jours, beaucoup d'ordinateurs portables sont livrés avec 2 GPU - un GPU haute performance et un économiseur d'énergie (moins puissant). La plupart des applications, que j'utilise sur mon ordinateur portable, fonctionnent avec mon GPU intégré (économie d'énergie), mais certaines d'entre elles sont toujours configurées pour s'ouvrir avec la carte haute performance. J'essaie de configurer l'application que je construis pour l'exécuter sur le GPU haute performance par défaut, mais je ne trouve aucune information sur le sujet nulle part. J'espère que quelqu'un pourra apporter un peu de lumière là-dessus. Je distribuerai mon application avec un programme d'installation NSIS et je suppose que je devrai ajouter le chemin de mon application à une liste d'applications pour les cartes NVidia / ATI. L'application est programmée en C #. En outre, quelqu'un sait-il comment les choses se passent avec les PC de bureau? Que se passe-t-il si un PC possède 2 GPU et que je dois choisir le plus puissant?

Milcho

Milcho
la source

Réponses:

7

NVIDIA a un document ici décrivant quelques stratégies qui peuvent vous être utiles: http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf - malheureusement, celle que je suggérerais autrement - le NvOptimusEnablement exportation - n'est documenté que pour C ++; il peut être possible de le faire également avec C #, mais quelqu'un qui sait réellement devrait faire sonner les informations.

Je ne connais rien de similaire pour AMD.

Donc, malheureusement, il semble qu'il n'y ait pas de moyen indépendant du fournisseur de le faire (même l'énumération des périphériques d'affichage vous laisserait à la merci des utilisateurs forçant les paramètres via leurs panneaux de contrôle du pilote, ce que les utilisateurs ont une fâcheuse tendance à faire afin de maximiser jeux qui ne viennent pas avec des paramètres graphiques entièrement configurables). En l’absence, vous devrez peut-être vous fier à un fichier Lisezmoi et espérer que les gens le liront!

Maximus Minimus
la source
+1: Je ne connaissais pas cette NvOptimusEnablementastuce Optimus , mais j'aurais dû. On dirait que c'est une chose récente (pilote 302.x +) Merci.
Sean Middleditch
1
stackoverflow.com/questions/17458803/… Pour toute autre personne curieuse des équivalents AMD, j'ai posé cette question (sur SO car non spécifique au jeu).
Sean Middleditch
1
Vous pouvez appeler des fonctions C ++ à partir de C # en utilisant p / invoke, en dernier recours.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft - Ce n'est pas une fonction C ++; c'est une variable globale exportée.
Maximus Minimus
5

En général, vous ne pouvez pas.

Le pilote à double GPU cache les deux GPU derrière une seule interface, de sorte que les solutions comme Nathan Reed ne fonctionnent généralement pas dans la plupart des configurations à double GPU haute vitesse / faible consommation.

La sélection du GPU doit être gérée par le pilote d'une manière ou d'une autre. Avec NVIDIA Optimus, vous mettez généralement à jour les profils Optimus pour ajouter l'application à la liste des applications qui utilisent le GPU discret, généralement en cliquant avec le bouton droit sur EXE et en cliquant sur Propriétés. Vous pouvez également utiliser des appels très spécifiques à Optimus. selon la réponse de mh01. Avec les configurations AMD, c'est totalement différent.

Sur d'autres systèmes encore, il existe un commutateur matériel ou un indicateur de système d'exploitation pour décider quel GPU est actif. Encore une fois, l'application n'a aucun contrôle sur le GPU utilisé.

C'est quelque chose que j'espère vraiment "corrigé" dans une future mise à jour de DirectX. Idéalement, les deux GPU devraient être énumérés comme Nathan l'a suggéré, puis il y aurait des indices pour indiquer lequel est destiné à une vitesse élevée ou à faible puissance, de sorte qu'une application peut choisir intelligemment le bon ou même changer d'appareil qu'elle utilise en fonction de tout facteurs (par exemple, laisser un navigateur Web choisir en fonction de la charge WebGL).

Sean Middleditch
la source
Ahh, intéressant. Je n'ai pas utilisé l'un de ces systèmes à double GPU, donc je ne savais pas que le pilote prétend qu'ils sont les mêmes. Vous penseriez que le pilote pourrait surveiller le niveau d'utilisation du GPU pour une application donnée et la changer si nécessaire.
Nathan Reed
1
Ça ne peut pas. Le matériel a des capacités différentes. Imaginez que vous passiez d'un GPU avec une taille de texture maximale de 2048 à un avec un maximum de 1024, ou une autre caractéristique - votre application entière se casserait. Si, dans tous les cas, vers un GPU plus performant, les tampons nécessiteraient une migration (prenant du temps et provoquant un accrochage de trame indésirable) et les shaders auraient besoin d'une recompilation. L'application doit être en charge de ce processus et activer ou désactiver tout commutateur. Malheureusement, les API pour cela ne sont pas encore vraiment étoffées.
Sean Middleditch du
1
Cela est compliqué par le fait que les utilisateurs souhaitent souvent remplacer la commutation GPU sur leur ordinateur portable, peut-être pour économiser la batterie. C'est une des raisons pour lesquelles je préfère déléguer la commutation GPU au système d'exploitation, car il connaît également l'état d'alimentation de l'ordinateur portable.
Fake Name
4

Vous devriez pouvoir énumérer les GPU du système et choisir celui à utiliser au démarrage de votre application. Vous n'avez pas mentionné quelle API vous utilisez, mais par exemple dans D3D11, vous utiliseriez IDXGIFactory :: EnumAdapters pour obtenir la liste des GPU et passer celle que vous voulez à D3D11CreateDevice .

DXGI peut vous fournir des informations limitées sur le GPU, telles qu'une chaîne de description, l'ID du fournisseur et l'ID de l'appareil. Je suppose que vous pouvez utiliser ces informations pour savoir quel GPU est le plus performant, mais vous devez créer une sorte de base de données de GPU ou essayer d'utiliser des heuristiques pour deviner. Ou vous pouvez laisser l'utilisateur choisir le GPU à utiliser au démarrage.

Nathan Reed
la source