Novi ubedljivo efikasniji API | PC Press

Novi ubedljivo efikasniji API

Jedan od Microsoft‑ovih snažnih aduta za prelazak na Windows 10 je DirectX 12, koji će učiniti da igre izgledaju mnogo bolje. Najznačajnija promena koju donosi DirectX 12 odnosi se na draw call overhead reduction. Ovo je prosta funkcija gde procesor zahteva od GPU‑a da izrenderuje nešto, ali je ona tokom poslednjih nekoliko godina postala usko grlo kada su u pitanju performanse.

ASUS-ROG-Poseidon-GTX-980-TiWindows 10 je zaslužio visoke ocene, uz neizbežan utisak da nije bilo dovoljno vremena da se promeni sve što je trebalo. „Desetka“ je u suštini „sloj“ preko Windows‑a 8.1, koji je opet isto to u odnosu na Windows 7. Jedan od glasno najavljivanih noviteta veoma je značajan, a radi se o prvoj implementaciji DirectX 12 interfejsa. Pošto DirectX 12 neće biti podržan u ranijim verzijama Windows‑a, jasno je da je to adut kojim Microsoft želi da pospeši migraciju korisnika na novi operativni sistem.

Optimizovani pristup hardveru

Od momenta kada se prva verzija DirectX‑a pojavila kao deo operativnog  Windows sistema, ovaj API drastično je napredovao (kao i sve ostalo), ali najbitnija stvar koju je DirectX uveo jeste standardizacija u low level pristupu hardveru. Kombinacija WDM drajvera i DirectX API‑ja omogućila je stvari koje danas podrazumevamo kao standardne, gde je ta standardizacija od esencijalnog značaja. I ovoga puta DirectX 12 to čini, sklapajući razne tehnologije u jednu celinu koja je dostupna svima. Na primer, AMD je zvanično odustao od svog Mantle API‑ja, iako je u njega tokom poslednjih nekoliko godina mnogo ulagao, a sve u korist  DirectX 12 standarda. Pokazuje se da su ideje iz Mantle‑a u velikoj meri ugrađene su u DirectX 12, čime je napravljen dobar kompromis između integracije tehnologija i standardizacije.

Glavna ideja novog DirectX API‑ja jeste poboljšanje performansi, i to prvenstveno kroz low level pristup grafičkom procesoru i boljem iskorišćenju modernih centralnih procesora. Taj maksimalni pristup na najnižem nivou programskog koda trebalo bi da podseća na ono što imamo kod igračkih konzola, koje upravo na ovaj način ostvaruju svoje zavidne GPU performanse. Sada programeri imaju mnogo manje posla sa optimizacijama, jer sve to radi DirectX 12 (odnosno Direct3D, kao element celog paketa), gde jednostavno sam API nudi pomenuti low level pristup uz prosto generisanje programskog koda.

directx12-windows10-logoNajznačajnija promena koju donosi DirectX 12 odnosi se na draw call overhead reduction. Ovo je prosta funkcija gde procesor zahteva od GPU‑a da izrenderuje nešto, ali je ona tokom poslednjih nekoliko godina postala usko grlo kada su u pitanju performanse. Procesori odavno imaju više jezgara, ali to nije bilo u dovoljnoj meri iskorišćeno u DirectX‑ 11u, pa je brži GPU bukvalno čekao na instrukcije od procesora. Pored toga, i sami grafički procesori imaju veliki broj shader jedinica koje rade paralelno, ali DirectX 11 „razmišlja“ serijski. To znači da se uglavnom šalje jedna komanda od procesora do GPU‑a, i to opet najčešće upotrebom jednog konkretnog CPU jezgra.

Računica je jasna: što je određena scena komplikovanija, tu ima više draw call instrukcija gde postoji ograničenje u tome šta se i koliko brzo može obraditi, bez obzira na snagu hardvera. DirectX 12 za rešenje ovog problema uvodi liste komandi koje u paketu treba da izvrši grafički procesor. Budući da je svaka komanda na toj listi izolovana od drugih, DirectX 12 može da odredi optimalan način na koji će različita CPU jezgra distribuirati sve komande s liste do shader jedinica grafičkog procesora. Tako GPU pod DirectX 12 može da obradi kompletne liste komandi, bez čekanja na procesor da „odobri“ svaku sledeću instrukciju. Iako ovaj način optimizacije deluje sasvim logično, tek DirectX 12 uvodi ovaj efikasniji sistem.

Uz više procesora

Intel-Devils-CanyonJoš jedna značajna funkcija koju donosi DirectX 12 jeste Multiadapter. Prvi put podrška za više grafičkih procesora nalazi se direktno u API‑ju (ranije je realizovana kroz drajvere), omogućavajući da se razne instrukcije obavljaju paralelno na različitim GPU jedinicama. Da sve bude još interesantnije, DirectX 12 omogućava zajednički rad grafičkih procesora različitih proizvođača. To znači da možete imati jednu AMD i jednu NVIDIA grafičku karticu, i da integrisani GPU u Intel‑ovom procesoru takođe bude aktivan na zajedničkom zadatku. Iako će doprinos integrisanog GPU‑a biti mali, važno je to da će biti upotrebljeno nešto što se do sada nije koristilo. Shodno tome, promenjen je sistem rasporeda iscrtavanja frejmova: do sada je uvek pri bilo kojoj multi GPU konfiguraciji korišćen sistem AFR (Alternate Frame Rendering), što znači da svaki GPU dobija po jedan frejm za obradu, pa ukoliko je jedan GPU sporiji, onda drugi čeka i gubi se na efikasnosti. To je osnovni razlog zbog kog kombinacije SLI/Crossfire najbolje rade sa identičnim modelima grafičkih kartica.

DirectX 12 uvodi sistem SFR (Split‑Frame Rendering) koji svaki frejm deli na veći broj elemenata, a njih onda posebno obrađuje svaki GPU, a sve uz mogućnost procene efikasnosti određenog GPU‑a radi bolje raspodele tereta rendering‑a. Na kraju, DirectX 12 donosi i mogućnost da dve grafičke kartice vide svu raspoloživu memoriju. Do sada, ukoliko svaka od dve grafičke kartice u režimu SLI ima po 4 GB memorije, bilo je upotrebljivo samo prva 4 GB memorije. DirectX 12 prvi put nudi potencijalno rešenje ovog problema i mogućnosti upotrebe kompletne memorije, što će imati veliki značaj u 4K rezolucijama.

Nova generacija hardvera

Da bi se iskoristile mogućnosti koje nudi DirectX 12, morate imati Windows 10, grafičku karticu kompatibilnu sa DirectX 12 i adekvatno optimizovani softver (igre). Prve dve stvari nisu problem, operativni sistem je tu, a grafičke kartice koje podržavaju DirectX 12 postoje već neko vreme. Kao i kod svakog novog API‑ja, seta instrukcija i slično, problem na početku uvek je softverska podrška. Ipak, u ovom slučaju očekuje se da implementacija DirectX‑ 12a kod novih igara bude brza, pa će većina njih koji se budu pojavljivale do kraja godine imati podršku za DirectX 12. No, u ovom momentu bilo smo ograničeni na već postojeće igre za svrhe testiranja, odnosno najnoviju verziju 3DMark‑a koji u sebi ima test API Overhead.

Kao što se može videti u tabeli, drastična je razlika u broju izvršenih draw calls instrukcija u korist DirectX 12, čime se potvrđuje da je efikasnost višestruko povećana. Takođe, izmerili smo performanse u varijanti kada smo isključili dva CPU jezgra i dobili rezultate koje su gotovo upola slabiji, što znači da je skaliranje performansi u odnosu na broj CPU jezgara daleko bolje sa DirectX 12. S druge strane, u starijim igrama nema većeg skoka performansi, ali i pored odsustva direktne podrške, DirectX 12 ipak uspeva da izvuče koji frejm više nego DirectX 11. Iako je to u granicama od nekoliko procenata, dobro je videti da novi API izvlači maksimum i iz starih igara. Pravih igara optimizovanih za DirectX 12 još nema, tako da nismo mogli da isprobamo ni funkciju Multiadapter i to kako ona utiče na performanse. Pored toga, treba proveriti kako se DirectX 12 ponaša s kombinacijom NVIDIA i AMD kartica (za ovo testiranje koristili smo AMD‑ove kartice), i kako sve to zajedno radi s procesorima različitim po broju jezgara, što znači da nas uskoro očekuje još jedna analiza API‑ja koji zaista donosi veoma velike promene uz Windows 10.

2 CPU jezgra bez HT 4 CPU jezgra bez HT
DX11 Single Thread 453.871 796.172
DX11 Multi Thread 467.239 806.763
DX12 Multi Thread 6.254.721 11.472.286

Miloš Stamenković

(Objavljeno u Časopisu PC#224)