niedziela, 10 kwietnia 2016

Vulkan na mobilnym GeForce (Optimus)

Nie każdy sterownik Nvidii obsługujący API Vulkan pod Linuksem, potrafi to robić również w przypadku kart mobilnych do zastosowań domowych (o dziwo to ograniczenie nie dotyczy profesjonalnej serii Quadro). Mój układ graficzny może działać przy wykorzystaniu sterownika 364.15, którego opis zawiera:

GeForce 600M Series (Notebooks):GeForce GTX 680MX, GeForce GTX 680M, GeForce GTX 675MX, GeForce GTX 675M, GeForce GTX 670MX, GeForce GTX 670M, GeForce GTX 660M, GeForce GT 650M, GeForce GT 645M, GeForce GT 640M, GeForce GT 640M LE, GeForce GT 635M, GeForce GT 630M, GeForce GT 625M, GeForce GT 620M, GeForce 610M

Uruchomienie sterownika Vulkan na Kubuntu 16.04

Zdecydowanie najprostszą metodą na zdobycie tego sterownika jest dodanie dedykowanego repozytorium:
sudo apt-add-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install vulkan-utils nvidia-364 nvidia-prime

Kolejnym krokiem powinno być zawsze zajrzenie do dokumentacji Nvidii, która nakazuje nam stworzenie tak wyglądającego /etc/X11/xorg.conf:
Section "Module"
    Load "modesetting"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "BusID for NVIDIA device here"
    Option "AllowEmptyInitialConfiguration"
EndSection

BusID uzyskamy wykorzystując lspci:
lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GK107M [GeForce GT 645M] (rev a1)

Stąd w moim przypadku xorg.conf będzie wyglądać tak:
Section "Module"
    Load "modesetting"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "PCI:1:0:0"
    Option "AllowEmptyInitialConfiguration"
EndSection

Wydaje mi się, że modyfikacje .xinitrc opisane w dokumentacji nie są potrzebne, bo xrandr wywoływany jest przez skrypt /sbin/prime-offload będący częścią pakietu nvidia-prime (który zainstalowaliśmy wcześniej).

Warto sprawdzić konfigurację dla OpenGL, która wygląda u mnie następująco:
sudo update-alternatives --config x86_64-linux-gnu_gl_conf
Są 3 dostępne alternatywy dla x86_64-linux-gnu_gl_conf (dostarczające /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf).

  Wybór       Ścieżka                                  Priorytet  Status
------------------------------------------------------------
  0            /usr/lib/nvidia-364/ld.so.conf              8604      tryb auto
  1            /usr/lib/nvidia-364-prime/ld.so.conf        8603      tryb ręczny
* 2            /usr/lib/nvidia-364/ld.so.conf              8604      tryb ręczny
  3            /usr/lib/x86_64-linux-gnu/mesa/ld.so.conf   500       tryb ręczny

W tym momencie pozostaje restart i uruchomienie vulkaninfo by sprawdzić poprawność instalacji.

Test wydajności

Obecnie jedyną wydaną grą wykorzystującą API Vulkan jest The Talos Principle. Aby uruchomić ją na Vulkanie, trzeba wykonać kilka kroków:
  1. Włączyć kanał beta "publicbeta": PPM na grę w kliencie Steam-Właściwości-BETA-publicbeta
  2. W opcjach uruchamiania (PPM-Właściwości-Ustaw Opcje uruchamiania) wpisać %command% +gfx_strAPI = "VLK"
  3. Podczas startu gry wybrać wersję 64-bitową
  4. Jeśli chcemy używać nakładki Steam (Steam overlay) to musimy również klienta Steam zaktualizować do kanału beta
Poniżej znajdują się wyniki wbudowanego benchmarku dla kilku konfiguracji. Szersze omówienie w dalszej części posta.


Dane sprzętu testowego (zapisane w pliku Talos.log):
11:34:00 LOG:  Power saving settings:
11:34:00 WRN:  CPU Power saving is enabled and performance governor is not used.
11:34:00 LOG:  
11:34:00 LOG:  XDG_CURRENT_DESKTOP: KDE
11:34:00 LOG:  GDMSESSION: (null)
11:34:00 LOG:  DESKTOP_SESSION: /usr/share/xsessions/plasma
11:34:00 LOG:  KDE_SESSION_VERSION: 5
11:34:00 LOG:  
11:34:00 LOG:  * CPU...
11:34:00 LOG:  Vendor: GenuineIntel
11:34:00 LOG:  Name: Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
11:34:00 LOG:  Type: 0, Family: 6, Model: 10, Stepping: 9
11:34:00 LOG:  Clock: 2.20 GHz
11:34:00 LOG:  Cores: 8
11:34:00 LOG:  CMOV: Yes
11:34:00 LOG:  SSE: Yes
11:34:00 LOG:  Invariant TSC: Yes


1:34:00 INF:  * Desktop settings...
11:34:00 INF:  Color depth: 32-bit
11:34:00 INF:  Desktop resolution: 1366 x 768
11:34:00 LOG:  Loaded "/home/adi/.local/share/Steam/steamapps/common/The Talos Principle/Bin/x64/GfxVLK.so".
11:34:01 LOG:    Content/CachedShaders_PC_Talos.gro: 14905 files, signature: OFFICIAL
11:34:01 LOG:  Zip file system updated in 0.37 seconds.
11:34:01 LOG:  Setting fullscreen flag on the window.
11:34:01 LOG:  Loaded "libvulkan.so.1".
11:34:01 LOG:  Device memory used: 771 MB in 9 block(s)
11:34:01 LOG:    Host memory used: 2000 MB
11:34:04 INF:  
11:34:04 INF:  Gfx API: Vulkan
11:34:04 INF:  Resolution: 1366 x 768
11:34:04 INF:  Vendor: nVidia (0x10DE)
11:34:04 INF:  Driver: Vulkan (0x0FD9)
11:34:04 INF:  Renderer: GT 645M
11:34:04 INF:  Version: 1526972416
11:34:04 INF:  Video memory size: 2048 MB
11:34:04 INF:  Available for textures: 1365 MB
11:34:04 INF:  Shader model version: 5.0
11:34:04 INF:  Active GPU(s): 1
11:34:04 INF:  GPU architecture: forward conventional rendering
11:34:04 INF:  Allowed memory size used for streaming: 136

I dla OpenGL:
11:40:03 LOG:  GPU #1: GeForce GT 645M/PCIe/SSE2 from NVIDIA Corporation
11:40:03 INF:  [OpenGL] Detected GLSL 4.50
11:40:18 INF:  
11:40:18 INF:  Gfx API: OpenGL
11:40:18 INF:  Resolution: 1366 x 768
11:40:18 INF:  Vendor: nVidia (0x10DE)
11:40:18 INF:  Driver: NVIDIA Corporation (0x0FD9)
11:40:18 INF:  Renderer: GeForce GT 645M/PCIe/SSE2
11:40:18 INF:  Version: 4.5.0 NVIDIA 364.15
11:40:18 INF:  Video memory size: 2048 MB
11:40:18 INF:  Available for textures: 2048 MB
11:40:18 INF:  Shader model version: 5.0
11:40:18 INF:  Active GPU(s): 1
11:40:18 INF:  GPU architecture: forward conventional rendering
11:40:18 INF:  Allowed memory size used for streaming: 256.0 MB

Przy standardowych ustawieniach (zalecanych przez autodetekcję gry) CPU średnie, GPU średnie, pamięć GPU wysokie, Vulkan jest nieco szybszy (34,7 kl./s) od OpenGL (32,4 kl./s):
11:36:53 INF:    Gfx API: Vulkan
11:36:53 INF:   Duration: 60.0 seconds (2083 frames)
11:36:53 INF:    Average: 34.7 FPS (35.4 w/o extremes)
11:36:53 INF:   Extremes: 66.3 max, 21.7 min
11:36:53 INF:   Sections: AI=3%, physics=1%, sound=1%, scene=86%, shadows=6%, misc=3%
11:36:53 INF:      Highs: 317 in 7.3 seconds (43.5 FPS)
11:36:53 INF:       Lows: 441 in 15.3 seconds (28.8 FPS)
11:36:53 INF:  20-30 FPS: 18%
11:36:53 INF:  30-60 FPS: 82%

11:43:12 INF:    Gfx API: OpenGL
11:43:12 INF:   Duration: 60.0 seconds (1941 frames)
11:43:12 INF:    Average: 32.4 FPS (33.1 w/o extremes)
11:43:12 INF:   Extremes: 106.7 max, 16.5 min
11:43:12 INF:   Sections: AI=3%, physics=1%, sound=1%, scene=82%, shadows=10%, misc=3%
11:43:12 INF:      Highs: 286 in 5.4 seconds (53.0 FPS)
11:43:12 INF:       Lows: 328 in 14.4 seconds (22.7 FPS)
11:43:12 INF:   < 20 FPS:  3%
11:43:12 INF:  20-30 FPS: 32%
11:43:12 INF:  30-60 FPS: 62%
11:43:12 INF:   > 60 FPS:  3%

Sytuację zmienia włączenie nakładki Steam, która wpływa negatywnie tylko na renderer korzystający z Vulkana. Tu widać, że ktoś z trójki: Croteam, Valve, Nvidia ma błąd do naprawy:
11:48:20 INF:    Gfx API: Vulkan
11:48:20 INF:   Duration: 60.0 seconds (1640 frames)
11:48:20 INF:    Average: 27.3 FPS (27.8 w/o extremes)
11:48:20 INF:   Extremes: 39.4 max, 12.0 min
11:48:20 INF:   Sections: AI=3%, physics=1%, sound=1%, scene=89%, shadows=4%, misc=2%
11:48:20 INF:      Highs: 244 in 7.2 seconds (33.8 FPS)
11:48:20 INF:       Lows: 292 in 13.0 seconds (22.4 FPS)
11:48:20 INF:  20-30 FPS: 69%
11:48:20 INF:  30-60 FPS: 31%

11:50:21 INF:    Gfx API: OpenGL
11:50:21 INF:   Duration: 60.0 seconds (1938 frames)
11:50:21 INF:    Average: 32.3 FPS (33.1 w/o extremes)
11:50:21 INF:   Extremes: 99.9 max, 10.6 min
11:50:21 INF:   Sections: AI=3%, physics=1%, sound=1%, scene=82%, shadows=10%, misc=3%
11:50:21 INF:      Highs: 263 in 5.0 seconds (53.1 FPS)
11:50:21 INF:       Lows: 306 in 13.7 seconds (22.3 FPS)
11:50:21 INF:   < 20 FPS:  3%
11:50:21 INF:  20-30 FPS: 32%
11:50:21 INF:  30-60 FPS: 63%
11:50:21 INF:   > 60 FPS:  2% 

Warto zwrócić uwagę na tzw. stuttering, czyli nierównomierności w czasie trwania klatek. Górny zrzut ekranu przedstawia grę na Vulkanie z włączonym wykresem kl./s (można to zrobić wpisując w konsoli prf_bShowFPSGraph = 1).
Dolny przedstawia analogiczną sytuację na OpenGL.



Różnica jest druzgocząca i pokazuje jak gra na OpenGL może sprawiać wrażenie niepłynnej nawet przy wysokiej średniej liczbie klatek na sekundę.

Pozostała jeszcze jedna rzecz do zbadania, a mianowicie sprawdzenie wydajności gdy gra ograniczana jest przez procesor a nie kartę graficzną. Ustawiłem w tym celu: GPU najniższe, pamięć GPU najniższe, pozostawiając pozostałe ustawienia niezmienione. W tym wypadku Vulkan był aż o jedną piątą szybszy niż OpenGL!
11:39:48 INF:    Gfx API: Vulkan
11:39:48 INF:   Duration: 60.0 seconds (7502 frames)
11:39:48 INF:    Average: 125.1 FPS (126.0 w/o extremes)
11:39:48 INF:   Extremes: 251.1 max, 78.7 min
11:39:48 INF:   Sections: AI=10%, physics=3%, sound=2%, scene=76%, shadows=0%, misc=9%
11:39:48 INF:      Highs: 1266 in 7.5 seconds (168.0 FPS)
11:39:48 INF:       Lows: 1239 in 12.8 seconds (96.8 FPS)
11:39:48 INF:   > 60 FPS: 100%
 
11:45:55 INF:    Gfx API: OpenGL
11:45:55 INF:   Duration: 60.0 seconds (6116 frames)
11:45:55 INF:    Average: 101.9 FPS (109.2 w/o extremes)
11:45:55 INF:   Extremes: 220.9 max, 29.1 min
11:45:55 INF:   Sections: AI=9%, physics=2%, sound=1%, scene=80%, shadows=0%, misc=8%
11:45:55 INF:      Highs: 657 in 3.9 seconds (168.3 FPS)
11:45:55 INF:       Lows: 862 in 14.0 seconds (61.6 FPS)
11:45:55 INF:  30-60 FPS:  5%
11:45:55 INF:   > 60 FPS: 95% 

Co z Intelem? 

Chcąc użyć Vulkana na otwartym sterowniku Intela potrzebujemy innego repozytorium.

Instalacja sterownika:
sudo apt-add-repository ppa:canonical-x/vulkan
sudo apt update
sudo apt install vulkan-utils mesa-vulkan-drivers vkcube

Konieczne jest też włączenie DRI3 w xorg.conf:
Section "Device"
    Identifier "Intel Graphics"
    Driver "intel"
    Option "DRI" "3"
EndSection

Niestety w na moim sprzęcie już najprostsze demo vkcube alarmowało:
vkcube 
WARNING: Ivy Bridge Vulkan support is incomplete

by zaraz po starcie się wysypać. Podobny problem dotyczył również Talosa. Co gorsza, tak długo jak był zainstalowany sterownik Intela, aplikacje nie potrafiły wykorzystywać implementacji dostaczonej przez Nvidię. Nie pozostało mi nic innego jak usunąć repozytorium:
sudo ppa-purge canonical-x/vulkan

Słowo podsumowania 

Już dziś gra działająca na Vulkanie potrafi dostarczyć znacznie lepszych doznań niż na dopieszczanym przez lata rendererze wykorzystującym OpenGL. Szczególne brawa należą się za stabilną prędkość wyświetlania, coś co można osiągnąć gdy aplikacja ma ścisłą kontrolę nad sprzętem. Za Vulkanem stoi hipoteza twierdząca, że twórca aplikacji wie lepiej co ona robi niż twórca sterownika.

Pozostało parę drobnych błędów, jak spadek wydajności po włączeniu nakładki Steam czy zawodne przełączanie API w menu TTP (stąd użyliśmy opcji przy starcie). Pozostaje mieć tylko jedno życzenie: więcej gier korzystających z Vulkana!

1 komentarz: