o wykorzystaniu GPU
w renderingu 3D cz.1

Dawno, dawno temu… w odległej Galaktyce….  🙂 tak nasz wstęp mógłby się zaczynać gdyby nie to że technologia wspomagania obliczen związanych z generowaniem grafiki 3d za pomocą jednostek graficznych (GPU) jest całkiem  świeża. Jeszcze do niedawna proces renderingu( tworzenia) grafiki 3d był domeną procesora głównego. W zamierzchłych czasach , jeszcze przed pojawieniem się klasy XT na rynku raczkującej wtedy grafiki 3d rządził koputer o przyjaznej nam nazwie AMIGA. Procesor w jaki był wyposażony , a była to Motorola MC6800 był wyjątkową jednostką , a pod wzgledem swojej wydajności bił konkurencję na głowe….. Wszyscy którzy wtedy zaczynali swoją przygodę z 3D nigdy nie zapomną tych chwil oczekiwania ( czasem liczonych w godzinach) na wyliczone z jego pomocą w takich programach jak SCULPT3d czy Imagine pierwsze początki czegoś nowego ( najczęściej tym nowym była  oczywiscie nieśmiertelna kulka plus płaszczyzna… 🙂 ) Czas mijał , pojawił się komputer klasy xt a z nim pierwszy produkt  jeszcze w  firmy mało wtedy jeszcze znanej jaką był Autodesk.Produkt ten nazywał się 3dStudio DOS ( działał w Dos-ie !!!)  i zapewne przepadł by w historii nowinek gdyby nie wprowadzenie  windows 3.1  ( hahaha….  naprawdę była taka) i przeniesienie na blaszaka środowiska graficznego wydajnego na tyle że… dalej już poleciało.  Z biegiem lat oprogramowanie tego typu zaczęło się rozrastać i stawać się coraz bardziej wymagające obliczeniowo. Producenci procesorów odpowiadali na te potrzeby tworząc coraz szybsze procesory poprzez podnoszenie ich częstotliwości, dodawaniu i ulepszaniu instrukcji, ulepszaniu architektur. Jednak te zmiany nie prowadzały drastycznych przyrostów wydajności. Rozpowszechniły się procesory wielordzeniowe i wielowątkowe, lecz dla grafików do ciągle za mało. Bardzo często czas renderingu jednej klatki na takich procesorach przy większej produkcji potrafi trwać wiele godzin. Zaczęto szukać innego sposobu obliczeń, a że procesor posiada również karta graficzna, lecz wykonuje inne instrukcje, to programiści rozpoczęli prace nad silnikami renderującymi za pomocą GPU. Bardzo szybko pojawiły się rozwiązania które już dziś mogą stanowić milowy krok w dziedzinie przyspieszenia generownia klatek . Dzisiejsze karty graficzne to przecież ogromna ilość (nawet kilka tysięcy)  rdzeni graficznych, które swietnie można wykorzystać do renderingu.Faktem jest że 1 rdzeń CPU nie jest równy 1 rdzeniowi GPU (tu wygrywa CPU ) ale…. Współczesne procesory CPU to 16 a niezadługo 24 wątkowe bardzo drogie a przy tym prądochłonne  konstrukcje , podczas gdy karty graficzne  mogą mieć i ponad 1000 procesorów strumieniowych przy podobnym apetycie na energię. Bardzo istotne jest to że  karty graficzne można w prosty sposób łączyć ze sobą równolegle i mamy tyle razy więcej procesorów ile slotów PCI-x obsługuje płyta główna. Z procesorami nie jest tak łatwo. Kwestia trzecia to taka, że jeśli obserwujemy rozwój CPU i GPU to łatwo zauważyć, że przy rozwoju GPU średnio co 2 generacje widzimy wzrost liczby procesorów strumieniowych powiększony 2-krotnie (w zależności od architektur). Przy procesorach co dwie architektury nie mamy dwa razy więcej rdzeni, ani dwa razy szybszych procesorów. Poza tym producenci kart graficznych częściej wypuszczają nowe generacje swoich produktów niż producenci procesorów. Jak widzimy inwestycja w karty graficzne wygląda znacznie atrakcyjniej i śmiało można stwierdzić, że jest bardziej przyszłościowa jeśli chodzi o obliczenia równoległe.

Obecnie mamy dwie konkurencyjne technologie: OpenCL i CUDA.

OpenCL (Open Computing Language) to framework wspomagający pisanie aplikacji działających na heterogenicznych platformach składających się z różnego rodzaju jednostek obliczeniowych (m.in. CPU, GPU). Jego zaletą jest to, że dostępny jest dla różnych producentów (nVidia, AMD, Intel).

CUDA (Compute Unified Device Architecture) to opracowana przez firmę nVidia uniwersalna architektura procesorów wielordzeniowych (głównie kart graficznych) umożliwiająca wykorzystanie ich mocy obliczeniowej do rozwiązywania ogólnych problemów numerycznych w sposób wydajniejszy niż w tradycyjnych, sekwencyjnych procesorach ogólnego zastosowania. Wadą CUDA jest to, że można  korzystać tylko z kart nVidii aby cieszyc się zaletami tej technologii.

 Co na dziś może zaoferować nam wpomaganie renderingu przez jednostki GPU? Przede wszystkim zdecydowane przyspieszenie tego procesu które można , w zależności od aplikacji oszacować na od 3 do 50 razy szybciej od standartowego renderera opartego na klasycznym układzie wykorzystującym CPU. Ogólna moc układu łatwo się skaluje w zalezności od ilości użytych jednostek kart obliczeniowych ( kart graficznych) , i jest to skalowanie 100 %-owe. A ponieważ segment jednostek GPU jest bardzo bogaty a przy tym bardzo zróżnicowany cenowo posiadanie maszyny o ogromnej mocy wielu teraflopów jest potencjalnie tani.

Wady są typowe dla wad aplikacji wieku dziecięcego… niepełna kompatybilność z opisywaną sceną w stosunku do natywnego renderera, często brak lub znacząco ograniczenia w  implementacja efektów wolumetrycznych , problemy z particle rendering. Jednakże z dnia na dzień aplikacje te stają sie coraz doskonalsze i w coraz większym zakresie spełniają stawiane wobec nich oczekiwania.