Obietnica DirectX 12
Powstałe w ostatnich latach niskopoziomowe interfejsy programowania kart graficznych (Mantle, DirectX 12, Vulkan) obiecują programistom większą kontrolę nad sprzętem. Ma z tego wynikać szereg zalet. Dobrze wykorzystane, mogą między innymi pozwolić na lepsze spożytkowanie mocy obliczeniowej kart graficznych, szczególnie w konfiguracjach z mało wydajnymi procesorami.
Zmniejszenie wpływu wydajności CPU na płynność animacji to jedna z najbardziej kuszących obietnic, jakie składa DirectX 12. AMD w jednej z zeszłorocznych prezentacji pokazało taki oto diagram:
Wtedy nie powiedziano, jakiej gry dotyczy – teraz wiemy, że chodziło o Ashes of the Singularity. Wykres pokazuje czas, jaki spędziły poszczególne wątki procesora AMD FX na przygotowywaniu jednej klatki obrazu. Na fioletowo zaznaczono kod gry, czyli część programu odpowiedzialną za samą rozgrywkę, przetwarzanie danych z myszy i klawiatury, komunikację sieciową, symulację sztucznej inteligencji i tym podobne, na czerwono – czas spędzony na przetwarzaniu poleceń DirectX (część należącą do API i systemu operacyjnego), na niebiesko – pracę wykonaną dla sterownika karty graficznej, a na zielono – wyświetlanie obrazu na monitorze.
Dzięki zastosowaniu DirectX 12 zmniejszyła się całkowita ilość obliczeń potrzebnych do funkcjonowania sterownika graficznego, a pozostałą część rozłożono na większą liczbę wątków. Dzięki temu zasoby obliczeniowe procesora zostały wykorzystane w większym stopniu, a wyświetlanie obrazu trwało znacznie krócej.
Podobny wykres – choć dotyczący innego programu, czterowątkowego procesora Intela i zintegrowanego układu graficznego Iris Pro – przedstawił Microsoft. Oczywiście, pokazywane są wybrane przypadki, w których zysk z użycia nowego API jest szczególnie duży. Benchmark Ashes of the Singularity zapewnia pierwszą okazję, żeby sprawdzić, jak jest w praktyce.
O czym trzeba pamiętać, czytając ten test?
To jest benchmark wersji beta pewnej gry
Po pierwsze, mamy do czynienia z wersją beta. Jak ostrzega nas ekran startowy gry, ta beta spali nam komputer i zabije psa:
Sami pracownicy studia Oxide twierdzą, że ich implementacja DirectX 12 jest tylko jedną z wielu i jest daleka od doskonałości. Wyciąganie na jej podstawie wniosków o DirectX 12 lub w ogóle niskopoziomowych API byłoby skrajnie lekkomyślne.
Do tego Ashes of Singularity, strategia czasu rzeczywistego, nie jest przedstawicielem najbardziej popularnych gatunków gier. RTS-y nie kojarzą się z przełomami technicznymi w dziedzinie grafiki komputerowej i zwykle są cenione za aspekty inne niż estetyczne. Wyświetlanie mnóstwa pojazdów i pocisków nie jest typową pracą, jaką wykonują karty graficzne w trakcie gry, a tylko jednym z przykładów. Dlatego przekładanie obserwacji z Ashes... na inne gry byłoby bardzo pochopne. Jak twierdzi studio Oxide, benchmark wiernie odzwierciedla to, co zobaczymy na ekranie podczas zwykłej rozgrywki, ale i tak należy go traktować z rezerwą.
Testujemy ograniczoną liczbę konfiguracji
Po drugie, interakcja gry, API, sterownika graficznego i sprzętu to bardzo rozległy temat. Peceta można złożyć z tysięcy kombinacji podzespołów, a gotowej maszynie wydać polecenia (programy) na kolejne tysiące sposobów. Benchmark Ashes of Singularity prezentuje bardzo wiele informacji, nie tylko wyniki cząstkowe, pokazujące wydajność w kolejnych kilkusekundowych ujęciach pola walki. W trybie DirectX 12 może on zmierzyć czas spędzony na kolejnych zadaniach obliczeniowych potrzebnych do złożenia gotowej klatki obrazu. To pozwala rozdzielić przypadki, kiedy oczekujemy głównie na zakończenie przetwarzania czegoś przez procesor i kiedy czekamy głównie na kartę graficzną. To trochę za mało, by jednoznacznie określić, że to na przykład silnik symulacyjny gry albo sterownik graficzny najbardziej ogranicza wydajność, ale pozwala wyciągnąć pewne wnioski.
Niestety, nie da się przedstawić ogromu danych generowanych przez benchmark, a ich interpretacja byłaby problematyczna. Dlatego skupiliśmy się na sprawdzeniu, czy niskopoziomowe API spełniły wspomnianą obietnicę, a zatem czy DirectX 12 rzeczywiście przynosi spodziewane korzyści w tych konfiguracjach, które najbardziej ich potrzebują.
Ashes of Singularity to jedna z pierwszych gier (obok Thiefa w trybie Mantle), w których zastosowano stosunkowo nową technikę obliczeń asynchronicznych. Ta technika wymaga użycia niskopoziomowego API, takiego jak DirectX 12 czy Vulkan. Została już wykorzystana w kilku grach konsolowych (m.in. Battlefield 4 na PlayStation 4). Jej nazwa często pada w tekstach marketingowych i komentujących rozwój grafiki komputerowej. O co w niej chodzi?
Asynchroniczne obliczenia (asynchronous compute)
Układ graficzny jest bardzo szerokim procesorem równoległym, co znaczy, że umie wykonywać równocześnie bardzo wiele zadań. Najwydajniejsze obecnie GPU mają tysiące procesorów strumieniowych. Co prawda GPU z 2048 procesorami strumieniowymi nie umie wykonywać 2048 programów jednocześnie, ale grupy kilkunastu–kilkudziesięciu SP mogą pracować niezależnie od pozostałych grup. Dane i instrukcje dla procesorów strumieniowych muszą zostać pobrane z pamięci, przetworzone wcześniej przez procesory poleceń i inne podobwody GPU. Choć wyświetlanie grafiki wymaga przetworzenia ogromnych ilości danych przez stosunkowo prosty program, wykonany wiele razy, nie zawsze da się „zapełnić” wszystkie jednostki obliczeniowe pracą.
Można zwiększyć efektywność GPU: dać wszystkim jednostkom obliczeniowym coś do roboty. Posłużymy się ilustracją pokazywaną w zeszłym roku przez AMD:
Przestrzeń od lewej do prawej krawędzi to czas, jaki można poświęcić na przygotowanie jednej klatki obrazu. Na dole przedstawiono sytuację, w której GPU wykonuje kolejne typy zadań sekwencyjnie; dopiero kiedy zakończy się poprzednie, można zacząć następne. Górny, szerszy pasek pokazuje, że niektóre zadania nie muszą czekać na wynik poprzednich i że można je wykonać równocześnie z innymi. To pozwala oszczędzić czas i wyświetlić gotowy obraz szybciej, a więc osiągnąć lepszą płynność animacji i mniejsze opóźnienie między działaniem użytkownika a reakcją komputera wyświetlaną na ekranie.
Dlaczego to ważne?
Problem z sekwencyjnym wykonywaniem różnych zadań powstał w ostatnich latach i staje się coraz ważniejszy, ponieważ zmieniają się gry. Ich twórcy coraz chętniej korzystają z efektów graficznych, które trzeba obliczać w inny sposób niż tradycyjnie: symulacji fizycznych, ambient occlusion, wykrywania krawędzi, niektórych technik wygładzania krawędzi.
Starsze procesory graficzne mogą wykonywać jeden typ zadań na raz. Przełączenie pomiędzy zadaniami graficznymi a obliczeniowymi wymaga czasu i zakończenia bieżącej pracy. Częste przełączanie oraz zlecanie GPU zadań, które nie absorbują wszystkich jednostek obliczeniowych, wiązało się z marnotrawstwem mocy obliczeniowej.
Nowoczesne procesory graficzne umieją wykonywać obliczenia asynchronicznie, czyli niezależnie od stanu innych zadań zleconych danemu GPU. To pozwala uzyskać sytuację podobną do tej z górnej części ilustracji. Oczywiście, powyższy diagram jest nieco przesadzony. Asynchroniczne wykonywanie obliczeń nie powiększa całkowitej dostępnej mocy obliczeniowej, a jedynie pozwala rzadziej ją marnować. Dolny pasek na powyższym diagramie powinien mieć dwie dodatkowe kolejki zadań (puste). Możliwość asynchronicznego wykonywania obliczeń nie wpływa na programy całkowicie obliczeniowe ani całkowicie graficzne.
Pamiętajmy, że asynchroniczność to nie to samo co równoległość! Obliczenia ogólne równocześnie z graficznymi pozwala zlecić każda karta graficzna, ale nie zawsze działa to szybko. Niektóre procesory graficzne najpierw wykonają jedno zadanie, potem przez pewien czas procesor będzie się przełączał na drugie, a następnie wykona to drugie zadanie. Tak to zadziała w przypadku GPU Nvidii zbudowanych w architekturze starszej niż druga wersja Maxwell (seria GTX 500, GTX 600, GTX 700). Procesory w architekturach AMD GCN oraz Maxwell 2 mogą jednocześnie śledzić jedną kolejkę zadań graficznych i kilka (od 2 do 32, zależnie od GPU) kolejek obliczeń. Teoretycznie procesor graficzny może wykonać zadania ze wszystkich kolejek w dowolnej kolejności, zależnej od dostępnych zasobów (wolnych jednostek obliczeniowych, oczekiwania na dane z pamięci). W praktyce GPU Maxwell (wersja druga – GTX 750 i seria GTX 900) mają pewne ograniczenia dotyczące szybkiego przełączania między grafiką a obliczeniami i sterownik graficzny z wyprzedzeniem ustawia zadania w pożądanej kolejności. Z prezentacji Nvidii wynika, że w nadchodzącej architekturze Pascal będzie to rozwiązane inaczej i przełączanie między zadaniami będzie możliwe znacznie częściej. Dokładne informacje na temat asynchronicznego kolejkowania w kartach Nvidii są trudno dostępne.
Asynchroniczne obliczenia przydatne w VR
Jak twierdzi David Kanter (być może znany Wam jako wieloletni redaktor strony RealWorldTech.com), asynchroniczne obliczenia są szczególnie ważne dla płynności grafiki w wirtualnej rzeczywistości (VR). To dlatego, że gra, przygotowując obraz dla wyświetlacza HMD (zamontowanego na głowie), musi zdeformować gotową klatkę obrazu, żeby przystosować ją do projekcji przez sferyczne soczewki. Efekt rybiego oka najlepiej i najłatwiej zrealizować właśnie z wykorzystaniem shadera obliczeniowego. W DirectX 11 program musi najpierw przygotować całą klatkę, następnie przełączyć odpowiednie grupy procesorów strumieniowych na nowe zadanie – i dopiero wtedy może zacząć wykonywać shader deformujący obraz. Proces przełączania trwa stosunkowo długo, a w tym czasie jednostki obliczeniowe nic nie robią. W DirectX 12 i z wykorzystaniem asynchronicznych obliczeń można już zlecić procesorowi graficznemu renderowanie następnej klatki w czasie, gdy część jednostek obliczeniowych jeszcze pracuje nad deformowaniem wcześniejszej. Podobnie jest z operacją przesuwania obrazu. Od rozpoczęcia do zakończenia rysowania klatki mija tyle czasu, że dane pozycyjne stają się nieaktualne. Gotowy obraz przesuwa się nieco w kierunku ostatnio wykonanego ruchu, tak by widz nie miał wrażenia, że ruchy jego głowy są rejestrowane z opóźnieniem. Przesuwanie z uwzględnieniem sferycznej deformacji najlepiej wykonać tuż przed odświeżeniem ekranu – więc trzeba mieć pewność, że operacja będzie mieć pierwszeństwo przed innymi i zostanie zakończona w zaplanowanym czasie.
Ostatecznie gracz nie musi być zainteresowany szczegółami implementacji. Przypuszczamy, że asynchroniczne obliczenia w typowych desktopowych grach nie będą funkcją zasadniczo zmieniającą wydajność i odczucia z rozgrywki. Być może zmieni się to w wymagających grach VR, ale nie możemy tego teraz ocenić.
W Ashes of Singularity asynchroniczne obliczenia są domyślnie włączone, ale można tę funkcję wyłączyć przez edycję pliku konfiguracyjnego.
Platforma testowa
Platforma do pomiarów wydajności kart graficznych składała się z następujących podzespołów:
Sprzęt | Dostawca | |
---|---|---|
Procesor | Core i7-6700K @ 4,7 GHz | |
Płyta główna | Asus Z170 Deluxe | www.asus.com |
Płyta główna AM3+ | Asus Sabertooth 990X R2.0 | www.asus.com |
Monitor WQHD 144 Hz G-Sync | Asus ROG Swift PG278Q | www.nvidia.pl |
Monitor 4K 60 Hz G-Sync | Acer XB280HK | www.acer.pl |
Pamięć DDR-4 | Kingston HyperX Predator DDR4 16 GB 2666 MHz | www.kingston.com |
Pamięć DDR-3 | G.Skill Ripjaws Z 8 GB F3-17000CL10Q-16GBZH | www.gskill.com |
Nośnik systemowy | Crucial BX100 960 GB | www.crucial.com |
Nośnik dodatkowy | Crucial BX100 960 GB | www.crucial.com |
Schładzacz procesora | Noctua NH-D15 | www.noctua.at |
Zasilacz | Corsair RM1000i | www.corsair.com |
Obudowa | aerocool.com.plCorsair Graphite 780T | www.corsair.com |
Kopia zapasowa danych | Acronis True Image 2014 | www.acronis.pl |
Miernik natężenia dźwięku | Sonopan SON-50 | www.sonopan.com.pl |
System operacyjny:
- Windows 10 64-bitowy.
Sterowniki:
- AMD Radeon Software Crimson Edition 15.301-B35 beta (z 10 lutego);
- Nvidia GeForce 361.91 WHQL (z 15 lutego).
Wyniki procesorów (Nvidia GeForce GTX 980 Ti)
Wyniki procesorów (AMD Radeon R9 Fury X)
Wyniki procesorów (Nvidia GeForce GTX 970)
Wyniki procesorów (AMD Radeon R9 390)
Wyniki procesorów (Nvidia GeForce GTX 960)
Wyniki procesorów (AMD Radeon R9 380)
Wyniki kart graficznych (Intel Core i7-6700K OC)
Wyniki kart graficznych (Intel Core i7-6700K)
Wyniki kart graficznych (Intel Core i5-6600K)
Wyniki kart graficznych (Intel Core i5-6400)
Wyniki kart graficznych (Intel Core i3-6100)
Wyniki kart graficznych (Intel Celeron G3920)
Wyniki karty GeForce GTX 970 (DX11, DX12, obliczenia asynchroniczne)
Przetestowaliśmy również model GeForce GTX 970 we wszystkich predefiniowanych ustawieniach graficznych w trybach z obsługą DX11 oraz DX12 oraz przy włączonych i wyłączonych obliczeniach asynchronicznych.
Wyniki karty Radeon R9 390 (DX11, DX12, obliczenia asynchroniczne)
Przetestowaliśmy również model Radeon R9 390 we wszystkich predefiniowanych ustawieniach graficznych w trybach z obsługą DX11 oraz DX12 oraz przy włączonych i wyłączonych obliczeniach asynchronicznych.