Z hybrydowymi układami graficznymi mamy do czynienia, gdy dwie lub więcej różnych kart korzysta z jednego (wspólnego) wyjścia wideo. Od kiedy Intel wprowadził układy graficzne zintegrowane z ich procesorami, jest to zjawisko niemalże powszechne w świecie laptopów. Niestety technologia ta sprawia wiele problemów użytkownikom Linuksa. Linuksiarze kierują pretensje (po części słusznie) do producentów kart graficznych, którzy czasami całkowicie ignorują problem (NVIDIA). Prawda jest jednak taka, że cały stos graficzny Linuksa nie był gotowy na tę technologię, a sterowniki to tylko jeden z problematycznych elementów. Wygląda na to, że jednak ten mroczny okres będziemy mieć wreszcie za sobą.
Największą przeszkodą w implementacji technologii hybrydowych na Linuksie jest chyba sam X-Server. Nie pozwala on na dynamiczne przełączanie wyświetlania między różnymi układami i przy każdej takiej zmianie wymaga swojego restartu. AMD zaimplementowało w swoich zamkniętych sterownikach (Catalyst) właśnie taką obsługę hybryd – zmiana karty graficznej wymaga restartu X’ów. Natomiast NVIDIA w ogóle nie zdecydowała się na implementacje Optimusa (hybrydowa technologia NVIDIA). Użytkownicy korzystają więc ze społecznościowego projektu Bumblebee. Działa on na tej zasadzie, że uruchamia 2 X-Servery jednocześnie (jeden na Intelu, a drugi na NVIDIA) i przenosi obraz z jednego na drugi przy pomocy VirtualGL. W praktyce jest to proteza, która powoduje znaczny spadek wydajności przy jednoczesnym wzroście zużycia energii (a w konsekwencji grzania się laptopa). Ponadto nie obsługuje wielu nowych hybryd, w szczególności tych MUX-less.
Mało jednak osób zdaje sobie sprawę, że w świecie otwartego oprogramowania i Linuksa od pewnego czasu trwają prace nad kompleksowym rozwiązaniem tego problemu. W jądrze systemu zaimplementowano mechanizmy współdzielenia buforów między różnymi (otwartymi) sterownikami – DMA-BUF, a cały stos graficzny został znacząco przebudowany na potrzeby technologii hybrydowej. Całościowo nazywa się tę implementację PRIME. Wraz z wydaniem X-Server 1.13 i ostatnimi aktualizacjami otwartych sterowników wygląda na to, że wszystkie elementy są już na miejscu.
W związku z tym jeden z użytkowników forum Phoronix postanowił wypróbować PRIME. Ku swojemu własnemu zaskoczeniu wszystko ruszyło z kopyta. Oto link do udanej próby. Użytkownik w celach testowych zastosował Ubuntu 12.10 beta z włączonymi repozytoriami proposed oraz repozytorium xorg edgers. Tester posiada hybrydę Radeona z Intelem, a przełączanie między nimi realizuje przy pomocy zmiennej środowiskowej „DRI_PRIME”. Tak więc ustawiając:
DRI_PRIME=0
pracuje na grafice Intela, a zmieniając na:
DRI_PRIME=1
przeskakuje na układ AMD. Nie potrzeba przy tym żadnego restartu X-Servera! Trzeba pamiętać, że póki co te mechanizmy działają jedynie dla otwartych sterowników. Można mieć jednak nadzieję, że wraz z X-Serverem 1.13, twórcy zamkniętych modułów wreszcie bezproblemowo zaimplementują obsługę hybryd.
Samemu nie posiadam żadnego laptopa z układem hybrydowym, więc nie jestem w stanie zweryfikować tego doniesienia, ale zapraszam wszystkich do testów i dzielenia się ich wynikami w komentarzach.
Działa!
glxgears
Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
299 frames in 5.0 seconds = 59.750 FPS
298 frames in 5.0 seconds = 59.524 FPS
298 frames in 5.0 seconds = 59.522 FPS
DRI_PRIME=1 glxgears
Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
6661 frames in 5.0 seconds = 1332.172 FPS
7011 frames in 5.0 seconds = 1402.090 FPS
6292 frames in 5.0 seconds = 1258.227 FPS
Dla mnie najważniejsze jest, że programik Bumblebee spisuje się bardzo dobrze i człowiek już się do tego tak przyzwyczaił, że jakieś automatyczne przełączanie nie jest mi potrzebne. Po prostu jaki to problem odpalić sobie jakąś grę w konsoli poleceniem np. optirun oilrush. Poza tym jakoś nie odczuwam specjalnych spadków wydajności lub przegrzewania się notebooka. Zresztą prawda jest taka, że od czasu do czasu tylko straszą, że rozwiążą problem z technologią Optimus pod Linuksem i tyle.
Pozdrawiam.
Hahaha faktycznie działa . Ubuntu 12.04 x64 plus repozytorium xorg edgers i śmiga . Dla porównania wynik karty geeforce 650m z komenda :
aragami@pqsdb9:~$ optirun glxgears
3514 frames in 5.0 seconds = 702.782 FPS
2191 frames in 5.0 seconds = 437.958 FPS
1351 frames in 5.0 seconds = 269.869 FPS
830 frames in 5.0 seconds = 165.804 FPS
886 frames in 5.0 seconds = 177.185 FPS
1164 frames in 5.0 seconds = 232.779 FPS
1871 frames in 5.0 seconds = 374.163 FPS
a tutaj miła niespodzianka 🙂
aragami@pqsdb9:~$ DRI_PRIME=1 glxgears
4051 frames in 5.0 seconds = 810.117 FPS
4300 frames in 5.0 seconds = 859.961 FPS
4839 frames in 5.0 seconds = 967.622 FPS
4243 frames in 5.0 seconds = 848.527 FPS
4267 frames in 5.0 seconds = 853.205 FPS
4259 frames in 5.0 seconds = 851.667 FPS
4270 frames in 5.0 seconds = 853.912 FPS
4260 frames in 5.0 seconds = 851.970 FPS
@up
Jak byłbyś tak miły, to podaj jakieś inne benchmarki niż glxgears. Coś wymagającego 😉
Panowie a jak to odpalić ?
a czy można odpalać go pod N-vidią??
Wreszcie się coś dzieje 🙂 A co z kartami ATI?
mietku, to samo co z AMD 😉
Nie mogę doczekać się aż będzie to rozwiązanie wspierane oficjalnie przez producentów, nie będę na razie sam grzebał bo z moim szczęściem zaraz coś uszkodzę :))
Ja niestety uważam, że nie jest to jeszcze kompletne rozwiązanie problemu. Co prawda faktycznie glxgears pokazuje ogromny wzrost kl/s lecz bateria w moim lapku (DELL Inspiron Q15R, intel+gf-gt525m) na 12.10 trzyma około 2h a na 12.04 z zainstalowanym bumblebee około 4h. Wniosek taki, że dalej karta NVidii NIE jest wyłączona i ssie baterie. A przecież o to właśnie chodzi w hybrydach, aby wydłużyć czas pracy lapka na baterii. Niestety nie jestem super-userem i nie wiem do końca jak to sprawdzić (jakim poleceniem?) aby mieć 100% pewności, że moje mongolskie teorie są słuszne 🙂
Pingback: Poniedzielnik: wieści ze świata OpenSource. Numer 66 :: Czytelnia Ubuntu
Faktycznie działa…
agusia@CoYa-GreenRaptor:~$ DRI_PRIME=1 glxgears
Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
32489 frames in 5.0 seconds = 6497.760 FPS
31148 frames in 5.0 seconds = 6229.485 FPS
agusia@CoYa-GreenRaptor:~$ DRI_PRIME=0 glxgears
Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
303 frames in 5.0 seconds = 60.444 FPS
300 frames in 5.0 seconds = 59.974 FPS
Ale:
@Kalten
Masz rację, karta nvidii nie zostaje fizycznie odłączona, i nadal pobiera energię.
Jednakże nie pracując pod obciążeniem zużywa jej niewiele.
Skąd wiem że karta nie jest fizycznie odłączana ? Ponieważ na moim laptopie są diody informujące która karta jest załączona, i zawsze pokazuje mi że obie karty pracują. (MSI GE40)
Hmmm chyba czegoś nie rozumiem,
Debian Jessie Intel I7 hd4000 i GTX 660M
DIR_PRIME=1 podnosi znacznie wydajność ale czy na pewno przełącza karty? Dobrze rozumuję?
$ DRI_PRIME=0 glxgears
304 frames in 5.0 seconds = 60.798 FPS
$ DRI_PRIME=1 glxgears
32311 frames in 5.0 seconds = 6462.123 FPS
$ DRI_PRIME=0 optirun -b primus glxgears
306 frames in 5.0 seconds = 61.069 FPS
$ DRI_PRIME=1 optirun -b primus glxgears
13613 frames in 5.0 seconds = 2722.588 FPS
$ DRI_PRIME=0 glxinfo | grep vendor
server glx vendor string: SGI
client glx vendor string: Mesa Project and SGI
OpenGL vendor string: Intel Open Source Technology Center
$ DRI_PRIME=1 glxinfo | grep vendor
server glx vendor string: SGI
client glx vendor string: Mesa Project and SGI
OpenGL vendor string: Intel Open Source Technology Center
$ DRI_PRIME=0 optirun glxinfo | grep vendor
server glx vendor string: NVIDIA Corporation
client glx vendor string: primus
OpenGL vendor string: NVIDIA Corporation
$ DRI_PRIME=1 optirun glxinfo | grep vendor
server glx vendor string: NVIDIA Corporation
client glx vendor string: primus
OpenGL vendor string: NVIDIA Corporation