Inne
Artykuł
Piotr Urbaniak, Środa, 3 stycznia 2018, 14:00

Ostatnio coraz więcej słychać o tzw. obliczeniach o precyzji połowicznej, które zdaniem marketingowców mają przynieść znaczącą poprawę optymalizacji (wydajności) gier. W teorii brzmi to niezwykle ciekawie. Koniec końców dwukrotny wzrost liczby operacji zmiennoprzecinkowych wykonywanych w ciągu sekundy względem powszechnie stosowanej precyzji pojedynczej robi wrażenie. Ale czy to nie brzmi zbyt pięknie, żeby było prawdziwe?

Na wstępie krótka powtórka z lekcji informatyki. Jak wiadomo, każdy procesor, również graficzny, działa na podstawie modelu binarnego. Oznacza to, że wszystkie operacje są wykonywane na danych reprezentowanych przez sekwencje zer i jedynek, pełniących funkcję stanów logicznych. Takie sekwencje są przechowywane w komórkach pamięci, zwanych rejestrami, o rozmiarze wyrażonym liczbą bitów, czyli „miejsc”, które mogą przyjąć jeden z dwóch wspomnianych stanów.

Z cyklu niespodzianki. Technikę dzielenia rejestrów zastosowano już w mobilnym układzie Tegra X1, opartym na lekko zmodyfikowanej architekturze Maxwell

Za standard reprezentacji binarnej i działania na liczbach zmiennoprzecinkowych od lat przyjmuje się format IEEE-754. Do wyrażenia liczby zmiennoprzecinkowej pojedynczej precyzji wymagane są 32 bity. Jeden przechowuje znak, osiem – wykładnik (część całkowitą), a pozostałe 23 – mantysę (część ułamkową). To właśnie z anglojęzycznego określenia liczby zmiennoprzecinkowej, floating-point, a także liczby wykorzystywanych bitów powstał często stosowany akronim FP32, określający taką formę reprezentacji. Co jednak najistotniejsze, zapis ten wykorzystywany jest powszechnie przez jednostki wykonawcze współczesnych kart graficznych, niezależnie od tego, czy chodzi o CUDA Nvidii czy może Stream Processors AMD. 

Nie było tak, wbrew pozorom, zawsze. W zamierzchłych czasach, kiedy inżynierowie dysponowali ograniczoną przestrzenią na budowę układu za sprawą ówczesnych procesów litograficznych, zdolność kart graficznych do operowania w FP32 stanowiła twardy orzech do zgryzienia. Za ciekawostkę może posłużyć to, że wadliwa implementacja techniki wielu celów renderowania (ang. Multiple Render Targets) na 32 bitach była jedną z bezpośrednich przyczyn kiepskiej wydajności GeForce'ów z serii FX w środowisku DirectX 9. Co więcej, dopiero wraz z DirectX 9.0c oraz Shader Model 3.0 wprowadzono 32-bitową zmiennoprzecinkową reprezentację oświetlenia. Wcześniej obowiązywał model 8-bitowy, całkowity, który ograniczał kontrast do 255 : 1. Mało tego, precyzje niższe od FP32 były często stosowane jeszcze w grach na PlayStation 3. Jednostki cieniowania układu graficznego RSX, a więc również pecetowego G70, nie mogą bowiem pracować na liczbach zmiennoprzecinkowych o rozmiarze większym niż 16 bitów – choć kolor w pamięci kodowano na 32 bitach. Jaki z tego wniosek, zapytacie? Zmniejszenie precyzji zapisu w grafice komputerowej nie jest niczym odkrywczym; jest raczej rozwiązaniem sprzed lat, które postęp techniczny pozwolił zastąpić czymś wyraźnie lepszym.

„Słynne” GeForce'y FX poległy właśnie na obsłudze FP32. Ich właściciele w wybranych grach, np. Half-Life 2, musieli wymuszać połowiczną precyzję

Jakiś czas temu temat niższych precyzji powrócił. Inżynierowie wydedukowali, że zastosowanie 32-bitowej jednostki obliczeniowej pozwala wykonać symultanicznie dwie operacje 16-bitowe (FP16). Technicznie rzecz biorąc, względem FP32 oznacza to ograniczenie reprezentacji binarnej do znaku, 5-bitowego wykładnika oraz 10-bitowej mantysy, przez co topnieje porcja przetwarzanych danych, ale też dokładność obliczeń. Tym sposobem działy marketingu mogły przemnożyć przez dwa teoretyczną liczbę operacji zmiennoprzecinkowych wykonywanych w ciągu sekundy, wyrażaną we flopach. Jako pierwszy nad FP16 rozpływał się Mark Cerny z Sony, główny architekt PlayStation 4, gdy firma wprowadzała udoskonalony model Pro. Przedstawiciel japońskiej korporacji oszacował tak moc urządzenia na 8,4 teraflopa, choć wynikało to oczywiście z działań dostawcy układu graficznego, firmy AMD, która wdrożyła przetwarzanie połowicznej precyzji do użytej przez Sony architektury Polaris. Jak wiadomo, rozwiązanie to trafiło także do najnowszej rodziny Vega i do dziś jest szumnie promowane. Tymczasem niewielu zdaje sobie sprawę, że pomysłu na powrót do FP16 wcale nie zapoczątkowało AMD, ale konkurencyjna Nvidia, w opartym na architekturze Maxwell mobilnym układzie Tegra X1.

Demo technologiczne UE4 zostało uruchomione na Tegrze X1 m.in. dzięki połowicznej precyzji, ale jego jakość nie dorastała do pięt jakości pierwotnego wydania

Pamiętacie jeszcze Elemental Demo, oparte na silniku Unreal Engine 4? Pierwotnie uruchomiono je na karcie GeForce GTX 680. Wspomniano przy tym o konieczności zapewnienia około 2,5 teraflopa mocy obliczeniowej. Później jednak pojawiła się kompilacja tej pokazówki dla Tegry X1, której moc szacowana była na mniej więcej 0,5 teraflopa. Jednym z głównych założeń portu okazało się przeniesienie kodu na FP16, co oczywiście przełożyło się na znaczącą utratę jakości obrazu, m.in. dynamicznego oświetlenia globalnego.

Porównanie 16-bitowej mapy cieni z 32-bitową odpowiedniczką nie pozostawia złudzeń

W tym miejscu podam następny, nawet doskonalszy, przykład: technikę rozbieżnego mapowania cieni (ang. Variance Shadow Mapping – VSM), którą zaczęto stosować mniej więcej w czasach pierwszych kart graficznych zgodnych z DirectX 10. W mapach cieni w przededniu wprowadzenia VSM zamiast przetwarzania 32-bitowego wykorzystywano 16-bitowe. Wystarczy rzucić okiem na porównawcze zrzuty ekranu, by zdać sobie sprawę, jak negatywnie wpływało to na jakość generowanego obrazu. Ogólnie rzecz biorąc, obniżenie precyzji pozwala na wzrost szybkości renderowania kosztem jakości grafiki. Wiadomo, że czasem może być to rozsądny kompromis, umożliwiający chociażby przeportowanie jakiejś „dużej” produkcji na mobilną konsolkę Nintendo Switch, ale rynek urządzeń stacjonarnych rządzi się innymi prawami, a tym bardziej nie należy zestawiać osiągów w FP32 z osiągami w FP16.

Na razie najbardziej znanym przykładem wykorzystania obliczeń FP16 jest nowa część serii Wolfenstein, która wykorzystuje połowiczną precyzję do realizacji efektów postprodukcyjnych

No dobrze, ale dlaczego tak się w ogóle dzieje? Jak już zdążyłem wspomnieć, większa liczba bitów pozwala zapisywać większe wartości liczbowe, a przy tym zapewnia mniejsze różnice pomiędzy nimi w górnych partiach skali. Największym wykładnikiem w FP16 jest liczba dziesiętna 15, w FP32 zaś – 127. Jeśliby w obydwu systemach miał być realizowany gradient, zredukowana precyzja rodziłaby obawy związane ze zjawiskiem schodkowania, ze względu na zbyt duże różnice w natężeniu światła pomiędzy sąsiadującymi odcieniami. To przypadek dość skrajny, ale zarazem bardzo wymowny. Bezinwazyjnie precyzję ciąć można w tych zastosowaniach, które faktycznie zadowalają się 16-bitowym zapisem. I tylko wtedy. Są to przeważnie proste efekty postprodukcji, chociażby bloom.

Zobacz ranking najpopularniejszych kart graficznych w grudniu i styczniu

Cóż, teraz przynajmniej nie powinno być już wątpliwości, że nie istnieje coś takiego jak bezstratne przeniesienie kodu z FP32 na FP16. Entuzjastyczne teorie o imponującym przyroście wydajności wydają się zatem formułowane nieco na wyrost. Oczywiście, twórcy gier mogą podejść do optymalizacji bardziej kreatywnie, mianowicie skorzystać z precyzji połowicznej tylko tam, gdzie nie wiąże się to z nazbyt widocznymi cięciami (patrz przykład powyżej). Tutaj jednak upada mit o słupkach rosnących o dwie długości. Można natomiast odciążyć podsystem pamięci i jednostki renderujące, by osiągnąć wyższą rozdzielczość obrazu, ale powtórzę raz jeszcze: kosztem szczegółowości.

Ujmując to wszystko nieco kolokwialnie, można powiedzieć, że w programowaniu nie ma żadnych magicznych sztuczek, a mniejsza porcja danych siłą rzeczy przenosi mniej informacji.

Tak czy inaczej, to czas zweryfikuje, co precyzja połowiczna w istocie oznacza dla graczy. Ja mimo wszystko radzę zachować powściągliwość, do czego, mam nadzieję, udało mi się skłonić niektórych nazbyt optymistycznych Czytelników.

Ocena artykułu:
Ocen: 19
Zaloguj się, by móc oceniać
Piioo (2018.01.03, 14:18)
Ocena: 20

0%
No właśnie, grafika niemal stoi od 10 lat na jednym poziomie. Mimo wszystko ceny idą w górę i wymagania też. Komputery kosztują grube tysiące złotych, a my mamy nagle przejść na gorszą grafikę, żeby to wszystko lepiej teoretycznie chodziło? No chyba nie o taką przyszłość walczyliśmy :) ? Za wszystko odpowiadają Devi, nie dość, że gry w dzisiejszych czasach to w 90% totalne badziewia dla gimbazy + chore preordery + płatne DLC i patche w dniu premiery, to jeszcze bardziej nie chce im się optymalizować kodu, bo szkoda czasu i kasy, to lepiej zafundować graczom gorszą grafikę. Później oczywiście i tak do 60 fps wymagany będzie X080 Ti.
_gunnar_ (2018.01.03, 14:26)
Ocena: 9

0%
Można to nazwać optymalizacją. Tam gdzie nie trzeba dokładnych obliczeń, będzie zużywane mniej zasobów karty graficznej. Jest to dobre i logiczne posunięcie ale z drugiej strony każdy od razu widzi, że skala zysku będzie raczej niewielka. Zapewne kilka %. Uzysk będzie tyko tam gdzie precyzja nie ma tak istotnego znaczenia a takich rzeczy pewnie jest niewiele. Jednak nie bez przyczyny wszystko jest teraz liczone z wyższa precyzją. Pamiętam czasy jak się przechodziło z popularnej 16bitowej palety barw na 32 bity i jaka była różnica i w obrazie i niestety w wydajności. Nawet robiono testy na 2 paletach bo były czasy gdzie niewiele kart radziło sobie z płynnym przetwarzaniem grafiki w 32 bitowej palecie :D
Duchu (2018.01.03, 14:27)
Ocena: 21

0%
Gratuluję panie Piotrze. Poziom artykułu dawno nie spotykany na tym portalu.

Szkoda że taki krótki. W 2003r. podczas premiery Doom 3 mój guru J. Carmack wyjaśniał potencjał FP16 i podejście ATi i nV w DX9. Wtedy to były czary a teraz powrót do przeszłości... :)

Pozdr.
myszka91 (2018.01.03, 14:28)
Ocena: 12

67%
Niech złodziejskie korporacje przestaną zawyżać wymagania gier produkując sterowniki które wymuszają na producentach gier słabo zoptymalizowane produkty, mogę wam podać dziesiątki tytułów które ukazały się w ostatnich latach, a które wyglądają pod każdym względem dużo gorzej niż ten już ikoniczny Crysis, a wymagania kilkunastokrotnie większe.


Te dzisiejsze gry mają taką samą fizykę jak Half-Life 2 z 2004 roku, a grafika od czasów Crysisa z 2007 nie zmieniła się tak bardzo aby dzisiejsze gry wymagały 50 razy mocniejszego sprzętu niż 10 lat temu, nie wspominając już o tym, że sztuczna inteligencja przeciwników jest dzisiaj dużo gorsza niż w takim F.E.A.R z 2005 roku.
jf196 (2018.01.03, 14:48)
Ocena: 2

0%
Chyba tak to można ująć. Sprzęt - szczególnie w konsolach - nie domaga, więc obniżmy precyzję, a co za tym idzie jakość grafiki, żeby było płynniej. Zamiast postępu - cofanie się ;/
mati_zlota (2018.01.03, 14:53)
Ocena: 3

0%
Teraflopsa a nie teraflopa k***a ile można powtarzać
sideband (2018.01.03, 15:18)
Ocena: 10

0%
Nie tylko w przypadku bloom-a FP16 aż nadto wystarczające, ale sęk w tym stricte bloom jest nisko obciążającym efektem. Do tego Vega ma wąskie gardło ze strony Ropów, więc pomogło to tyle co umarłemu kadzidło. Realne korzyści FP16 przyniesie w momencie kiedy będą obliczane w obniżonej precyzji efekty znacznie bardziej obciążające. W przypadku TressFX w FP16 wzrost wydajności jest dwukrotny.
Kitu (2018.01.03, 16:10)
Ocena: -1

0%
Szkoda, że o takich rzeczach jak FP16/32 i ogólna architektura komputerów nie mówi się na lekcjach informatyki w szkołach - zamiast tego w nieskończoność tłucze się Worda, Excela i Powerpointa, co i tak kończy się tak, że większość ludzi tworzy potworki z jak największą ilością czcionek i kolorów. Żeby dowiedzieć się o formacie zmiennoprzecinkowym, działaniu, kodowaniu i różnicach dokładności musiałem iść na studia..

Jak dobrze, że zaczynają się na PCLabie pojawiać artykuły techniczne - niektóre mogą być 'zbyt płytkie' dla kogoś z większą wiedzą, ale świetnie tłumaczą zagadnienie. Aż chce się tutaj wchodzić :)
sevae (2018.01.03, 16:11)
Ocena: 4

0%
Jaki mit o słupkach rosnących o dwie długości? Z tego, że w teorii jakieś obliczenia da się zrobić zużywając dwa razy mniej zasobów nie znaczy, że wszystko można bez różnicy przerzucić na FP16 i nikt tak nie teoretyzował - więc obalacie teorię której nikt nie wysuwał. Pierwszy raz spotykam się ze stwierdzeniem, że to da 2x więcej fps.

_gunnar_ @ 2018.01.03 14:26  Post: 1117120
Można to nazwać optymalizacją. Tam gdzie nie trzeba dokładnych obliczeń, będzie zużywane mniej zasobów karty graficznej. Jest to dobre i logiczne posunięcie ale z drugiej strony każdy od razu widzi, że skala zysku będzie raczej niewielka. Zapewne kilka %. Uzysk będzie tyko tam gdzie precyzja nie ma tak istotnego znaczenia a takich rzeczy pewnie jest niewiele. Jednak nie bez przyczyny wszystko jest teraz liczone z wyższa precyzją. Pamiętam czasy jak się przechodziło z popularnej 16bitowej palety barw na 32 bity i jaka była różnica i w obrazie i niestety w wydajności. Nawet robiono testy na 2 paletach bo były czasy gdzie niewiele kart radziło sobie z płynnym przetwarzaniem grafiki w 32 bitowej palecie :D

Zyskuje się więcej zasobów dla zrobienia czegoś w FP16 jeżeli FP32 może policzyć równocześnie dwie FP16, ale też zamiast zużywać więcej FP32 zużywa się ich wtedy mniej, bo i tak musisz policzyć to co liczysz, więc i dla obliczeń FP32 zostaje więcej zasobów - tak naprawdę oba typy obliczeń na tym mogą zyskać.
Zaloguj się, by móc komentować
Artykuły spokrewnione
Facebook
Ostatnio komentowane