Jak mogę ustawić moją aplikację, aby domyślnie działała na GPU o wysokiej wydajności?

12

Obecnie wiele laptopów jest wyposażonych w 2 układy GPU - jeden o wysokiej wydajności i energooszczędny (mniej wydajny). Większość aplikacji, z których korzystam na laptopie, działa ze zintegrowanym (energooszczędnym) układem GPU, ale niektóre z nich są gotowe do uruchomienia z kartą o wysokiej wydajności. Próbuję skonfigurować aplikację, którą buduję, aby domyślnie działała na wysokiej wydajności GPU, ale nigdzie nie mogę znaleźć żadnych informacji na ten temat. Mam nadzieję, że ktoś może rzucić na to trochę światła. Będę dystrybuował moją aplikację za pomocą instalatora NSIS i myślę, że będę musiał dodać ścieżkę mojej aplikacji do listy aplikacji dla kart NVidia / ATI. Aplikacja jest programowana w języku C #. Ponadto, czy ktoś wie, jak wygląda sytuacja z komputerami stacjonarnymi? Co się stanie, jeśli komputer ma 2 procesory graficzne i muszę wybrać mocniejszy?

Milcho

Milcho
źródło

Odpowiedzi:

7

NVIDIA ma tutaj dokument opisujący niektóre strategie, które mogą być dla ciebie pomocne: http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf - niestety ten, który inaczej sugerowałbym - NvOptimusEnablement eksport - jest udokumentowany tylko dla C ++; może to być również możliwe w C #, ale ktoś, kto tak naprawdę wie, musiałby zagrać z informacją.

Nie znam niczego podobnego dla AMD.

Niestety wygląda na to, że nie ma sposobu na to, by nie był to niezależny od dostawcy sposób (nawet wyliczenie urządzeń wyświetlających pozostawiłoby cię na łasce użytkowników wymuszających ustawienia za pomocą paneli kontrolnych sterowników, których użytkownicy mają niefortunną tendencję, aby zmaksymalizować gry, które nie mają w pełni konfigurowalnych ustawień graficznych). W przypadku braku takich być może będziesz musiał polegać na pliku readme i mieć nadzieję, że ludzie go przeczytają!

Maximus Minimus
źródło
+1: Nie znałem tej NvOptimusEnablementsztuczki Optimusa , ale powinienem. Wygląda na to, że to nowość (sterownik 302.x +) Dziękuję.
Sean Middleditch
1
stackoverflow.com/questions/17458803/... Dla każdego, kto jest ciekawy ekwiwalentów AMD, zapytałem o to (na SO, ponieważ nie jest specyficzny dla gry).
Sean Middleditch
1
Możesz wywoływać funkcje C ++ z C # za pomocą p / invoke, w ostateczności.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft - To nie jest funkcja C ++; to eksportowana zmienna globalna.
Maximus Minimus
5

Ogólnie nie możesz.

Sterownik z dwoma GPU ukrywa dwa procesory graficzne za jednym interfejsem, więc rozwiązania takie jak Nathan Reed zwykle nie działają w większości popularnych konfiguracji z dwoma GPU o dużej prędkości / niskiej mocy.

Wybór GPU musi być w jakiś sposób obsługiwany przez kierowcę. Za pomocą NVIDIA Optimus zazwyczaj aktualizujesz profile Optimus, aby dodać aplikację do listy aplikacji korzystających z oddzielnego procesora graficznego, zwykle poprzez kliknięcie EXE i kliknięcie Właściwości. Możesz także użyć niektórych bardzo specyficznych połączeń do Optimusa. jak na odpowiedź mh01. W przypadku konfiguracji AMD sytuacja wygląda zupełnie inaczej.

W jeszcze innych systemach istnieje przełącznik sprzętowy lub flaga systemu operacyjnego, aby zdecydować, który GPU jest aktywny. Ponownie aplikacja nie ma kontroli nad tym, która karta graficzna jest używana.

To jest coś, co mam nadzieję, że zostanie „naprawione” w przyszłej aktualizacji DirectX. Idealnie byłoby, gdyby oba GPU były wyliczone, jak sugerował Nathan, a następnie pojawiłyby się wskazówki wskazujące, który z nich jest przeznaczony do szybkiej lub niskiej mocy, dzięki czemu aplikacja może inteligentnie wybrać właściwy, a nawet przełączyć urządzenie, którego używa, w oparciu o cokolwiek czynniki (powiedzmy, pozwalając przeglądarce wybrać w zależności od obciążenia WebGL).

Sean Middleditch
źródło
Ahh, ciekawe. Nie korzystałem z żadnego z tych podwójnych układów GPU, więc nie wiedziałem, że sterownik udaje, że są takie same. Można by pomyśleć, że sterownik może monitorować poziom wykorzystania GPU dla danej aplikacji i w razie potrzeby przełączyć ją na tryb wysokiej wydajności.
Nathan Reed
1
Nie może Sprzęt ma różne możliwości. Wyobraź sobie, że zostałeś przełączony z GPU o maksymalnym rozmiarze tekstury 2048 na jeden o maks. 1024 lub innej cechy - cała aplikacja się zepsułaby. Jeśli pod każdym względem pójdziemy do bardziej wydajnego procesora graficznego, bufory będą wymagały migracji (zabranie czasu i spowodowanie niechcianego zaczepu ramki), a shadery będą wymagały ponownej kompilacji. Aplikacja musi być odpowiedzialna za ten proces i włączyć lub zrezygnować z dowolnego przełącznika. Niestety interfejsy API tego nie zostały jeszcze dopracowane.
Sean Middleditch,
1
Komplikuje to fakt, że użytkownicy często chcą pominąć przełączanie GPU na laptopie, być może w celu oszczędzania baterii. To jeden z powodów, dla których wolę delegowanie przełączania GPU na system operacyjny, ponieważ zna on również stan zasilania laptopa.
Fałszywe imię
4

Powinieneś być w stanie wyliczyć procesory graficzne w systemie i wybrać, który z nich ma zostać użyty podczas uruchamiania aplikacji. Nie wspomniałeś, którego interfejsu API używasz, ale na przykład w D3D11 użyłbyś IDXGIFactory :: EnumAdapters, aby uzyskać listę GPU i przekazać ten, który chcesz D3D11CreateDevice .

DXGI może dostarczyć ci ograniczonych informacji o GPU, takich jak ciąg opisu, identyfikator dostawcy i identyfikator urządzenia. Podejrzewam, że możesz użyć tych informacji, aby stwierdzić, który procesor graficzny ma wysoką wydajność, ale musiałbyś zbudować jakąś bazę danych GPU lub spróbować użyć heurystyk do odgadnięcia. Lub możesz pozwolić użytkownikowi wybrać, którego procesora graficznego użyć podczas uruchamiania.

Nathan Reed
źródło