Wie kann ich meine Anwendung so einstellen, dass sie standardmäßig auf der Hochleistungs-GPU ausgeführt wird?

12

Heutzutage werden viele Laptops mit 2 GPUs geliefert - einem Hochleistungs-und einem Stromspar-Notebook (weniger leistungsstark). Die meisten Anwendungen, die ich auf meinem Laptop verwende, laufen mit meiner integrierten (energiesparenden) GPU, aber einige von ihnen können mit der Hochleistungskarte geöffnet werden. Ich versuche, die App, die ich aufbaue, so zu konfigurieren, dass sie standardmäßig auf der Hochleistungs-GPU ausgeführt wird, aber ich kann nirgendwo Informationen zu diesem Thema finden. Ich hoffe, dass jemand ein bisschen Licht ins Dunkel bringen kann. Ich werde meine Anwendung mit einem NSIS-Installationsprogramm verteilen und ich denke, dass ich den Pfad meiner Anwendung zu einer Liste von Anwendungen für NVidia / ATI-Karten hinzufügen muss. Die Anwendung ist in C # programmiert. Weiß auch jemand, wie die Dinge mit Desktop-PCs stehen? Was passiert, wenn ein PC 2 GPUs hat und ich die leistungsstärkere wählen muss?

Milcho

Milcho
quelle

Antworten:

7

NVIDIA hat hier ein Dokument mit einigen Strategien, die für Sie hilfreich sein könnten: http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf - leider die, die ich sonst vorschlagen würde - das NvOptimusEnablement export - ist nur für C ++ dokumentiert; Möglicherweise ist dies auch mit C # möglich, aber jemand, der es tatsächlich weiß, müsste sich mit den Informationen einschalten.

Mir ist nichts Ähnliches für AMD bekannt.

Es sieht also leider so aus, als gäbe es keinen herstellerunabhängigen Weg, dies zu tun (selbst die Aufzählung von Anzeigegeräten würde Sie der Gnade von Benutzern aussetzen, die Einstellungen über ihre Treiberbedienfelder erzwingen, wozu Benutzer unglücklicherweise neigen, um das Maximum herauszuholen Spiele, die nicht mit vollständig konfigurierbaren Grafikeinstellungen geliefert werden. Sollte dies nicht der Fall sein, müssen Sie sich möglicherweise auf eine Readme-Datei verlassen und hoffen, dass die Leute sie tatsächlich lesen!

Maximus Minimus
quelle
+1: Ich kannte diesen Optimus- NvOptimusEnablementTrick nicht, hätte ihn aber haben sollen. Klingt so, als wäre es eine neue Sache (Treiber 302.x +). Vielen Dank.
Sean Middleditch
1
stackoverflow.com/questions/17458803/… Für alle anderen, die auf AMD-Entsprechungen neugierig sind, habe ich dies gefragt (auf SO, da nicht spielspezifisch ).
Sean Middleditch
1
Sie können C ++ - Funktionen von C # aus aufrufen, indem Sie p / invoke als letzten Ausweg verwenden.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft - Es ist keine C ++ - Funktion; Es ist eine exportierte globale Variable.
Maximus Minimus
5

Im Allgemeinen können Sie nicht.

Der Dual-GPU-Treiber verbirgt die beiden GPUs hinter einer einzigen Schnittstelle, sodass Lösungen wie die von Nathan Reed in den meisten gängigen Dual-GPU-Setups mit hoher Geschwindigkeit und geringem Stromverbrauch normalerweise nicht funktionieren.

Die GPU-Auswahl muss in irgendeiner Weise vom Treiber vorgenommen werden. Mit NVIDIA Optimus aktualisieren Sie normalerweise die Optimus-Profile, um die Anwendung zur Liste der Anwendungen hinzuzufügen, die die diskrete GPU verwenden. Klicken Sie dazu in der Regel mit der rechten Maustaste auf die EXE-Datei und klicken Sie auf Eigenschaften. Sie können auch einige Optimus-spezifische Aufrufe verwenden. gemäß der Antwort von mh01. Bei AMD-Setups ist dies völlig anders.

Auf noch anderen Systemen gibt es einen Hardware-Schalter oder ein Betriebssystem-Flag, um zu entscheiden, welche GPU aktiv ist. Auch hier hat die Anwendung keine Kontrolle darüber, welche GPU verwendet wird.

Dies ist etwas, von dem ich wirklich hoffe, dass es in einem zukünftigen DirectX-Update "behoben" wird. Im Idealfall werden beide GPUs wie von Nathan vorgeschlagen aufgelistet, und dann werden Hinweise angezeigt, welche davon für hohe oder niedrige Leistung gedacht sind, sodass eine Anwendung auf intelligente Weise die richtige auswählen oder sogar das verwendete Gerät wechseln kann Faktoren (z. B. die Auswahl eines Webbrowsers in Abhängigkeit von der WebGL-Belastung).

Sean Middleditch
quelle
Ahh, interessant. Ich habe keines dieser Dual-GPU-Systeme verwendet, daher wusste ich nicht, dass der Fahrer vorgibt, dass sie gleich sind. Man könnte meinen, der Treiber könnte den Grad der GPU-Nutzung für eine bestimmte App überwachen und ihn bei Bedarf auf die Hochleistungs-App umstellen.
Nathan Reed
1
Das geht nicht. Die Hardware hat unterschiedliche Fähigkeiten. Stellen Sie sich vor, Sie würden von einer GPU mit einer maximalen Texturgröße von 2048 auf eine mit einer maximalen Texturgröße von 1024 oder auf ein anderes Merkmal umsteigen - Ihre gesamte App würde kaputt gehen. Wenn in jedem Fall zu einer leistungsfähigeren GPU gewechselt werden soll, müssen die Puffer migriert werden (was Zeit in Anspruch nimmt und eine unerwünschte Frame-Kopplung verursacht) und die Shader müssen neu kompiliert werden. Die App muss für diesen Prozess verantwortlich sein und einen Switch aktivieren oder deaktivieren. Die APIs dafür sind leider noch nicht wirklich ausgearbeitet.
Sean Middleditch
1
Dies wird durch die Tatsache erschwert, dass Benutzer häufig die GPU-Schaltung ihres Laptops außer Kraft setzen möchten, um möglicherweise Batterie zu sparen. Dies ist ein Grund, warum ich die GPU-Umschaltung lieber an das Betriebssystem delegiere, da es auch den Energiezustand des Laptops kennt.
Fake Name
4

Sie sollten in der Lage sein, die GPUs im System aufzulisten und auszuwählen, welche beim Start Ihrer Anwendung verwendet werden sollen. Sie haben nicht erwähnt, welche API Sie verwenden, aber in D3D11 würden Sie beispielsweise IDXGIFactory :: EnumAdapters verwenden , um die Liste der GPUs abzurufen und die gewünschte an D3D11CreateDevice zu übergeben .

Mit DXGI können Sie einige eingeschränkte Informationen zur GPU erhalten, z. B. eine Beschreibungszeichenfolge, eine Hersteller-ID und eine Geräte-ID. Ich nehme an, Sie können diese Informationen verwenden, um festzustellen, welche GPU die Hochleistungs-GPU ist, aber Sie müssen eine Art Datenbank mit GPUs erstellen oder versuchen, Heuristiken zu verwenden, um dies zu erraten. Oder Sie können den Benutzer auswählen lassen, welche GPU beim Start verwendet werden soll.

Nathan Reed
quelle