15-05-2009
CUDA – sposób na teraflop(s)y
Technologia: Obliczenia prowadzone za pomocą kart
graficznych
CUDA – sposób na teraflop(s)y
O tym, że karty graficzne dysponują ogromną mocą obliczeniową, która nie
tak dawno zarezerwowana była wyłącznie dla superkomputerów, wiadomo nie od dziś.
NVIDIA GeForce GTX 280 dysponuje mocą obliczeniową rzędu 933 gigaflop(s)ów czyli
933 miliardów operacji zmiennoprzecinkowych na sekundę. Dwuukładowy ATI Radeon
HD 4870 X2 to moc rzędu 2,4 teraflop(s)a (2,4 biliona operacji na sekundę). Dla
porównania moc obliczeniowa jednego z najszybszych dostępnie obecnie procesorów,
czterordzeniowego układu Core i7 965 XE to 70 gigaflop(s)ów – ponad 13 razy
mniej niż wspomnianego GeForce’a. Nic dziwnego, że inżynierowie od dawna
zastanawiają się jak wykorzystać tę moc drzemiącą w kartach graficznych nie
tylko do generowania obrazów 3D.
Porównując moc obliczeniową kart graficznych i tradycyjnych
procesorów należy jednak pamiętać o tym, że moc obliczeniowa podawana w
wielokrotności flop(s)ów (FLOPS – FLoating Operations Per Second) – tak na
marginesie, w polskiej literaturze spotykane są dwie pisownie odmiany pisowni
tej wielkości flopsów i flopów, stąd postanowiliśmy zapisać w nawiasie (s), tak
aby każdy Czytelnik mógł wybrać odpowiadając mu wersję zapisu – w wypadku kart
graficznych dotyczy obliczeń w pojedynczej precyzji, a w wypadku CPU podwójnej
precyzji, co nie zmienia jednak faktu, że jest ona w dalszym ciągu ogromna.
Wróćmy jednak, do samego wykorzystania potencjału kart graficznych do obliczeń
niezwiązanych z generowaniem grafiki 3D. Najbardziej zainteresowana tym
zagadnieniem była i jest firma NVIDIA. Pierwsze prace nad wykorzystaniem kart
graficznych do strumieniowego przetwarzania danych rozpoczęto w 2004 roku.
Wówczas to zaczęto zastanawiać się jak obejść problemy związane z dwustronną
komunikacją między GPU a resztą systemu komputerowego oraz jak powinien wyglądać
software współpracujący z procesorem graficznym, który przecież wykorzystuje
bardzo specyficzne dane wektorowe oraz instrukcje operujące na wierzchołkach,
wielokątach, pikselach, tekselach i teksturach, co narzuca z kolei bardzo
restrykcyjny model oprogramowania.
Pierwsze udane próby wykorzystania do obliczeń karty NVIDIA Quadro FX 3400 miały
miejsce w listopadzie 2004 roku. Wówczas to zespół naukowców z laboratorium w
Los Alamos wspólnie z inżynierami z NVIDII opracował program wykonujący
obliczenia symulacji zapadającej się gwiazdy. Karta graficzna wykonała
obliczenia czterokrotnie szybciej niż kod wykonywany na procesorze Intel Pentium
4 Xeon 3.0 GHz. W tym miejscu warto dodać, że dla CPU kod został zoptymalizowany
do wykorzystywania 64-bitowych rozszerzeń EM64T oraz zmiennoprzecinkowych
instrukcji SIMD.

Źródło: NVIDIA
NVIDIA Quadro FX 3400. To na takiej karcie graficznej po raz
pierwszy w historii wykonano zaawansowane obliczenia niezwiązane z grafiką –
wykonano obliczenia symulacji zapadania się gwiazdy. Parametry karty to: 8
potoków renderujących, złącze PCI Express x16, taktowanie rdzenia 350 MHz,
taktowanie pamięci GDR3 (256 MB) 900 MHz, silnik CineFX 3.0, DirectX 9.0, Pixel
Shader 3.0.
W 2005 roku firma BionicFX rozpoczęła zaś prace nad
technologią Audio Video Exchange (AVEX), która dokonywała zamiany cyfrowych
sygnałów audio na sygnał wideo, które mogły być następnie przetwarzane przez
kartę graficzną. Innymi słowy, dzięki AVEX karta graficzna realizowała
obliczenia audio na odpowiednio spreparowanych danych, w taki sposób jakby
pracowała w normalny sposób na pikselach i werteksach przechowywanych w pamięci
wideo.
Czas na CUDA
Sukces inżynierów z Los Alamos oraz postęp dokonany przez firmę BionicFX w
sposobach przystosowywania danych na potrzeby kart graficznych sprawił, że
inżynierowie z NVIDII, na czele z Davidem Kirkiem, szefem działu rozwoju i badań
(to on uznawany jest za twórcę koncepcji CUDA), przekonali się, że warto zacząć
wykorzystywać karty graficzne do obliczeń naukowo-inżynierskich. Bardzo szybko
podjęto próby zaimplementowania odpowiednich mechanizmów obliczeniowych do
kolejnej generacji kart graficznych.

Źródło: NVIDIA
Przykład przepływu danych w architekturze i modelu
programowania CUDA. 1) Kopiowanie danych z pamięci RAM komputera do pamięci
karty graficznej, 2) Procesor wysyła program do GPU (instruowanie GPU), 3)
Równoległe wykonywanie obliczeń (w każdym procesorze strumieniowym) zgodnie z
przesłanym przez CPU programem, 4) Kopiowanie wyników obliczeń z pamięci karty
graficznej do pamięci RAM komputera.
Tak narodziła się koncepcja architektury i modelu
programowania znanego obecnie pod nazwą CUDA (Compute Unified Device
Architecture). CUDA zadebiutowały wraz z układami z serii GeForce 8800 GTX,
czyli kością o kodowej nazwie G80. Architektura ta z niewielkimi zmianami
wykorzystana została również w kolejnej serii kart NVIDII – GeForce 9000, a
także w nowym mainstreamowym modelu NVIDIA GeForce GTS 250.
W wypadku oryginalnej architektury G80 (GF 8800 GTX), jej podstawę stanowi osiem
jednostek cieniowania, z których każda ma 16 jednostek obliczeniowych tzw.
Streaming Processor – G80 dysponuje łącznie 128-takimi jednostkami. Jednostki
te, zgodnie przyjętymi założeniami architektury CUDA, są 32-bitowymi jednostkami
skalarnymi uniwersalnego przeznaczenia. Oznacza to, że jednostka taka może
wykonywać zarówno obliczenia charakterystyczne dla Vertex Shadera, jak i Pixel
Shadera, a także obliczenia dowolnego innego typu. Co ważne, każdy ze 128
układów Streaming Processor może w jednym cyklu wykonać dwie instrukcje
dodawania oraz jedną operację mnożenia. Dodatkowo w każdej jednostce cieniowania
znalazł się zestaw modułów odpowiedzialnych za operacje na teksturach. Moduły te
zoptymalizowane zostały pod kątem obliczeń typu HDR i mogą pracować w trybach
FP16 i FP32.
Zgodnie z założeniami architektury CUDA, jednostki Streaming Processor podczas
obliczeń mogą być łączone w większe zespoły (klastry) obliczeniowe liczące
cztery jednostki wykonujące wspólnie np. obliczenia wektorowe typu SIMT
wykonywane w tradycyjnej architekturze przez Vertex Shadery. Po skończeniu
kalkulacji, taki moduł obliczeniowy może być „rozformowany” a każda wchodząca w
jego skład jednostka przydzielona do innych zadań. W ten sposób nie tylko
zwiększyć szybkość obliczeń ale również ich efektywność wykorzystania –
praktycznie wyeliminowane zostały przestoje. W G80 zastosowana zunifikowana
architektura ma zatem strukturę nazywaną angielskim terminem Scalable Processor
Array, co przetłumaczyć można jako skalowalna matryca procesorów. Jej
podstawowym elementem są właśnie doraźnie tworzone bloki wykonawcze złożone z
kilku mniejszych procesorów nazywane klastrami. W wypadku G80 bloki te mogą
pracować w dwóch trybach: Texture Processing Clusters, wówczas wykonywane są
skalarne operacje na teksturach i pikselach oraz w trybie Thread Processing
Clusters, umożliwiającym równoległe przetwarzanie danych tak jak to ma miejsce w
tradycyjnych Vertex Shaderach i wprowadzonych w DX 10 Geometry Shaderach.
Operacje obliczeniowe wykonywane przez klastry wykorzystują instrukcje typu MIMD
(Multiple Instruction, Multiple Data), a do wykonywania kalkulacji w obrębie
jednostek Streaming Processor używa się skalarnych algorytmów SIMT (Single
Instruction, Multiple Thread). W odróżnieniu stosowanych w procesorach
mechanizmów SIMD (Single Instruction, Multiple Data), skalarny SIMT nie
potrzebuje do obliczeń pobierać informacji o szerokości wektora, stąd operacje
te realizowane są znacznie szybciej, niemniej należy programowo pilnować
ewentualnych zmian w szerokości wektora obliczeń, aby przypadkowo nie zmniejszyć
dokładności wykonywanych operacji.
Pojawienie się zunifikowanych uniwersalnych jednostek obliczeniowych sprawiło,
że do tradycyjnego modelu przetwarzania grafiki wykorzystującego moduły Vertex i
Pixel Shader można było dodać nową, wspomniana przed chwilą, grupę jednostek
obliczeniowych – Geometry Shader. Ujrzały one, tak jak już napisałem, światło
dzienne wraz z dziesiątą odsłoną bibliotek graficznych DirectX. Do ich zadań
należy m.in. przetwarzanie i deformacja elementów szkieletu sceny, stanowiących
większą całość. Oczywiście tymi obliczeniami zajmują się również odpowiednio
grupowane Streaming Processory. Do tej pory tymi obliczeniami parał się zaś CPU.
Układ G80 osiąga moc obliczeniową rzędu 518 gigaflop(s)ów. Jego moc obliczeniowa
jest też dość łatwo dostępna, dzięki zastosowaniu standardowych formatów danych,
ujednoliconych instrukcji, a co najważniejsze opracowanego w ramach CUDA
środowisku programistycznemu korzystającemu z implementacji języka C i pakietu
OpenCL – o czym za chwilę.

Architektura G80 - źródło: NVIDIA


Architektura zunifikowanych modułów graficznych pozwala
ograniczyć sytuację, w której albo jednostki Vertex Shader, albo Pixel Shader
będą miały puste cykle obliczeniowe wynikające z oczekiwania do momentu aż
bardziej obciążona grupa jednostek shaderowych skończy swoje obliczenia.
Parę słów o DirectX 10
Premiera GeForce’a 8800 i pojawienia się nowej zunifikowanej architektury CUDA
zbiegł się w czasie z premierą DirectX 10. Nie był to przypadek. DX 10 stworzony
został właśnie z myślą jak najbardziej efektywnego wykorzystania takiej
ujednoliconej architektury procesorów graficznych. Co więcej, wszystkie operacje
dotyczące przetwarzania wielokątów i pikseli realizowane przez jednostki Vertex
i Pixel Shader z punktu widzenia bibliotek graficznych DirectX 10 połączone
zostały w jedną fazę. Microsoft mógł sobie na taki krok śmiało pozwolić, bowiem
również konstrukcje firmy ATI – począwszy od układu o kodowej nazwie R600 czyli
układzie, na którym bazują karty z serii Radeon HD 2000/3000 – zaczęły
wykorzystywać architekturę zunifikowanych shaderów. Nie było więc obawy, o to że
któraś z wielkich firm produkujących układy graficzne nie będzie na wprowadzenie
nowych bibliotek 3D odpowiednio przygotowana. Co więcej taka, koncepcja
działania kart graficznych sprawdzona została „w praniu” w konsolach do gier
Xbox 360 i PlayStation 3.

Zunifikowana Architektura ATI oraz shadery geometrii -
źródło: ATI
Oczywiście, połączenie obliczeń shaderowych w DX 10 w jedna
fazę nie oznacza wcale, że karta zgodna z DirectX 10 musi koniecznie
wykorzystywać zunifikowaną architekturę procesorów graficznych. Kość graficzna
może z powodzeniem być zaprojektowana w tradycyjnej architekturze korzystającej
z Vertex i Pixel Shaderów, a fazą rozseparowania operacji zajmie się sterownik
urządzenia. Karta nie musi mieć też Geometry Shaderów. Tą częścią obliczeń może
zając się procesor. Pamiętajmy jednak, że w zasadniczy sposób odbije się to na
wydajności systemu grafiki.
CUDA – odsłona druga
Wsparcie dla architektury CUDA ze strony bibliotek graficznych DirectX 10 oraz
pojawianie się aplikacji wykorzystujących moc obliczeniowych (głownie za sprawą
akceleratorów obliczeniowych o nazwie Tesla, o których też za chwilę) umożliwiło
inżynierom z firmy NVIDIA znaczne usprawnienie systemu CUDA. Nowa architektura
zgodna z założeniami koncepcji CUDA, czyli tak naprawdę druga generacja
architektury zunifikowanych shaderów, pojawiła się w kartach z układami o
kodowej nazwie GT200 i GT20, a więc w GeForce’ach GTX 280 i 260.
Podstawą architektury GT200 są skalarne, ale tym razem już 64-bitowe,
zmiennoprzecinkowe jednostki obliczeniowe, które dla odmiany nazwane zostały
Thread Processor. Jak można się domyślić, do operacji wektorowych jednostki TP
łączy się w grupy po dwie, a nie jak w G80, po cztery jednostki pracujące w
trybie SIMT. W GT200 jednostek Thread Processor jest 240. Nieco inna niż w G80
jest ich organizacja. TP podzielono między 10 (poprzednio było ich osiem)
jednostek cieniowania, z których każda dysponuje nie dwoma, ale trzema zespołami
obliczeniowymi składającymi się z ośmiu Thread Processorów (10*3*8=240 dla
GT200, 8*2*8=128 dla G80). Więcej jest też jednostek filtrujących tekstur (80 vs.
64) i modułów ROP czyli Render Operation Processors (32 kontra 24), które, co
ciekawe wyposażono w pamięć cache L2 do przechowywania tekstur.

Architektura G200 (GeForce GTX 280) - źródło: NVIDIA
Istotną wprowadzoną w GT200 modyfikacją architektury CUDA
jest również poprawa wydajności (o około 20%) szybkości działania klastrów
obliczeniowych, lepszy podział zadań (wydajniejszy scheduler) oraz wprowadzenie
wielowątkowego zestawu instrukcji SIMT. GT200 potrafi jednocześnie przetworzyć
ponad 30000 wątków, w porównaniu z 12000 wykonanymi jednocześnie wątkami przez
układ G80. Przede wszystkim ze względu na możliwość prowadzenia skomplikowanych,
nie związanych z grafiką obliczeń, podwojono również pamięć przeznaczoną do
przetrzymywania plików rejestru. W G80 zbyt długi program shaderowy powodował
konieczność przenoszenia podczas kalkulacji części danych do zewnętrznej pamięci
karty graficznej, w GT200 zdarza się to teraz sporadycznie. W GT200 usprawniono
również inne związane z przetwarzaniem grafiki bloki wykonawcze, ale ze względu
na główny temat artykułu nie będziemy ich tutaj omawiać. Architekturę bazującą
na układzie GT200 mogą pochwalić się pozostałe nowe karty graficzne NVIDII,
czyli GeForce GTX 275, 285, 295, ale pamiętajmy, że i w tym wypadku ich budowa
wewnętrzna (różne są m.in. liczby użytych Thread Processorów) nie różni się
zasadniczy sposób od GeForce’a GTX 280.
GPGPU, czyli Tesla
Tak naprawdę zarówno GeForce 8800 GTX, jak i GeForce GTX 280 zaliczyć można
śmiało do układów typu GPGPU (General Purpose GPU), a więc układów graficznych
ogólnego przeznaczenia. Procesor graficzny GPGPU może być z powodzeniem
wykorzystywany do wykonywania zadań przeznaczonych dla tradycyjnych jednostek
centralnych. Innymi słowy, w razie potrzeby karta graficzna może wesprzeć CPU
podczas wykonywaniu skomplikowanych obliczeń, które w ogóle nie są związane z
generowaniem grafiki. Najczęściej są to obliczenia związane z kalkulacjami
fizyki w grach (np. PhysX), ale również obliczeniami naukowo-inżynierskimi
takimi jak np. symulacje wytrzymałościowe konstrukcji mechanicznych, numeryczne
rozwiązywanie równań mechaniki kwantowej, kalkulacje trajektorii rakiet i
pocisków, obliczenia fizykochemiczne, kalkulacje struktury cząsteczek
chemicznych itp.
Do powyższych naukowo-inżynierskich celów nie wykorzystuje się jednak zwykłych
kart graficznych. Takimi specjalnie przystosowanymi do obliczeń numerycznych
akceleratorami graficznymi są opracowana przez NVIDIĘ specjalna platforma
obliczeniowa o nazwie Tesla. W jej ramach dostępne są specjalne karty bazujące
na zmodernizowanych układach graficznych 8800 GTX, oznaczonych symbolem Tesla
T8P (są one już wycofywane ze sprzedaży) oraz nowsze wersje Tesli – T10P –
bazujące już na układach graficznych NVIDIA GeForce GTX 280.

Karta obliczeniowa GPGPU NVIDIA Tesla C1060 - źródło:
NVIDIA

System obliczeniowy NVIDIA Tesla S1070 1U - źródło: NVIDIA
Jak już wcześniej wspomniałem, moc obliczeniowa Tesli jest
łatwo dostępna, a to dzięki zastosowaniu standardowego formatu danych oraz
bardzo dobremu wsparciu ze strony środowiska programistycznego CUDA. NVIDIA
dostarcza bowiem wraz z Teslą odpowiednio przystosowane środowisko do tworzenia
aplikacji, co sprawiło, że systemy Tesla wykorzystywane są już w ponad 50
ośrodkach naukowo-badawczych, w tym tak znanych i prestiżowych, jak MIT
(Massachusetts Institute of Technology). Co więcej, wszystkie wykonywane bez
problemu przez systemy Tesla obliczenia zarezerwowane były do niedawna wyłącznie
dla superkomputerów.
Podobnie jak układ graficzny GT200, tak i Tesla T10P, ma do dyspozycji 240 w
pełni programowalnych procesorów Thread Processor. Oczywiście procesory te można
bez kłopotu programować za pośrednictwem środowiska C będącego częścią systemu
CUDA. W skład platformy Tesla wchodzi obecnie serwerowy system Tesla S1070 1U,
złożony z czterech układów Tesla T10P o łącznej mocy obliczeniowej 4 teraflopsów,
oraz karta obliczeniowa Tesla C1060 Computing Processor, która, jak można się
domyślić, wyposażona jest w kość Tesla T10P zamiast standardowego graficznego
układu GTX 280. Oczywiście, karta akceleratora obliczeniowego CUDA pozbawiona
jest wyjść i wejść wideo – jest to po prostu montowana w komputerze karta
rozszerzeń. Jej moc obliczeniowa jest nieco większa niż standardowego GeForce’a
GTX 280 i wynosi równo teraflop(s). Starsza, pojedyncza karta Tesla C870
wyposażona w rdzeń G80 charakteryzowała się zaś mocą obliczeniową 518
gigaflop(s)ów czyli taką samą jak odpowiadający jej GeForce 8800 GTX.
Ciekawostką jest to, że systemie komputerowym karty Tesla można łączyć ze sobą
razem w trybie SLI i tri SLI – dokładnie tak samo jak ma to miejsce w wypadku
zwyczajnych kart graficznych NVIDII z rodziny GeForce.
Jak wynika z różnych badań przeprowadzonych przez NVIDIĘ, właśnie wśród
naukowców największym zainteresowaniem, głownie ze względu na cenę, cieszy się
karta obliczeniowa Tesla C1060 (cena ok. 1500 USD) 1ub wykorzystujące ją gotowe
komputery, takie jak np. system firmy Sprinx Systems (cena ok. 10 tys. USD) z
trzema akceleratorami Tesla. Po jej zainstalowaniu w zwykłym pececie zmienia się
on w coś co można nazwać osobistym superkomputerem. Środowisko programistyczne i
uruchamiane na stacji aplikacje mogą pracować zarówno pod Linuksem jak i
systemem Windows. Obsługa odpowiednio zmodyfikowanych aplikacji w niczym nie
różni się od korzystania ze zwykłych wersji programów uruchamianych na CPU.
Odpowiednim rozdziałem zadań obliczeniowych zajmują się dołączone do Tesli
sterowniki.









Przykłady obliczeń wykonywanych na kartach Tesla - źródło:
NVIDIA
Nieco inaczej skonstruowany został system obliczeniowy Tesla
S1070 1U – stanowi on bowiem jedną niezależną całość. Współpracuje on z
większymi maszynami obliczeniowymi (np. niewielkimi superkomputerami,
obliczeniowymi stacjami roboczymi, klastrami lub serwerami) i komunikuje się z
nimi bezpośrednio za pomocą interfejsu FiberChannel lub gigabitowego ethernetu.
Superkomputer, klaster obliczeniowy bądź serwer przekazuje do systemu Tesla dane
do obliczeń, a po ich wykonaniu otrzymuje gotowe wyniki. Innymi słowy, Tesla
S1070 1U to coś na kształt zewnętrznego akceleratora obliczeniowego dużej mocy
wspomagającego niewielkie superkomputery, klastry, stacje robocze lub serwery.
Oczywiście, Tesla S1070 przystosowana została do instalacji w centrum
obliczeniowym lub serwerowni i dlatego zamknięto ją w typowej obudowie rackowej
1U przystosowanej do montażu w szafach stelażowych. Dostęp do mocy obliczeniowej
NVIDIA Tesla S1070 zapewnia zaś specjalne oprogramowanie, które instaluje się na
współpracującym z systemem Tesla komputerze.
CUDA w obliczeniach naukowo-inżynierskich
W tym miejscu warto zatrzymać się na chwilę na zagadnieniach związanych z
dostępnym dla systemu Tesla oprogramowaniem oraz wykorzystaniem systemu Tesla i
architektury CUDA do zaawansowanych obliczeń naukowo-inżynierskich, wymagających
wysokich wydajności, czyli obliczeń określanych angielskim terminem HPC (High
Performance Computing). Jak można się domyślić, choćby po tym, że pojedynczy
procesor Tesla T10P, ma do dyspozycji 240 w pełni programowalnych procesorów
Thread Processor, które swoje zadania wykonują niezależnie i równolegle, Teslę
wykorzystuje się przede wszystkim w tzw. wysokowydajnych obliczeniach
masowo-równoległych. Mówiąc inaczej, chodzi tutaj o prowadzenie za pomocą
stosunkowo prostego zestawu instrukcji wysokowydajnych równoległych obliczeń na
ogromnej (masowej) ilości danych.
Wraz z systemem obliczeniowym Tesla użytkownikom dostarczane są, przygotowane do
natychmiastowego wykorzystania i zaimplementowania w swoich programach,
biblioteki obliczeniowe dla szybkiej transformaty Fouriera (FFT – Fast Fourier
Transform) oraz zagadnień związanych z rozwiązywaniem równań liniowych, macierzy
form kwadratowych i innych problemów znanych z algebry liniowej – biblioteki
BLAS, Basic Linear Algebra Subroutines. Dostępne są także odpowiednie wtyczki do
programu Photoshop oraz Matlab (pliki MEX).
Na wielu uczelniach opracowywane są obecnie programy i dodatki do wielu
wykorzystywanych w nauce i technice aplikacji służących do wysokowydajnych
obliczeń. Przygotowywane oprogramowanie korzysta z możliwości technologii CUDA.
Obecnie realizowanych jest m.in. kilka różnych projektów związanych z
przyspieszeniem obliczeń z dziedziny chemii kwantowej, obliczeń finansowych,
obliczeń dynamiki płynów, dynamiki molekularnej, obliczeń związanych z
elektromagnetyzmem i elektrodynamiką oraz modelowaniem zachowania się atmosfery,
oceanów, próżni i modelowaniem zjawisk pogodowych – to tylko niektóre z nich
(patrz:
http://www.NVIDIA.pl/object/vertical_solutions_pl.html).
Jeśli chodzi o chemię, obecnie prowadzone prace dotyczą przede wszystkim
możliwości prowadzenia obliczeń HPC za pomocą GPU i technologii CUDA przy użyciu
takich programów jak Gaussian i GAMESS. Oprogramowanie finansowe skupia się nad
wyceną i analizą ryzyka oraz algorytmiczną analizą obrotów, przy analizie
dynamiki płynów wykorzystuje się wymagające ogromnych nakładów obliczeniowych
modele Naviera-Stokesa i metodę Lattice Boltzmana (patrz: poniższe wykresy) – to
tylko niektóre przykłady. Według danych udostępnionych przez NVIDIĘ, w
porównaniu z komputerem wykorzystującym do obliczeń tylko procesor, maszyna
wykorzystująca technologię CUDA charakteryzuje się zwiększoną wydajnością od 18
razy przy kodowaniu wideo do nawet 149-krotniego przyspieszenia podczas
prowadzenia symulacji finansowych metodą Monte Carlo. Inne przykłady to na
University of Utah komputer z technologią CUDA zapewnia 146-krotnie szybszą
pracę przy obrazowaniu medycznym, a z kolei na University of Maryland naukowcom
udało się ponad 30-krotnie szybciej wykonać sekwencjonowanie genomu.










Źródło: NVIDIA
Przedstawione powyżej wykresy przedstawiają przykłady
przyspieszenia uzyskiwanych wyników obliczeniowych w różnych aplikacjach
naukowo-inżynierskich oraz programach finansowych z wykorzystaniem wyłącznie
samego CPU oraz przy wspomaganiu obliczeń akceleratorami z rodziny Tesla
wykorzystującymi technologię CUDA.
Zastosowanie CUDA to nie tylko programy tworzone na
uczelniach, ale również aplikacje komercyjne. Przykładem takiego programu może
być Distributed Password Recovery firmy Elcomsoft. Program ten służy do łamania
zabezpieczeń kryptograficznych i może współpracować z czterema kartami Tesla
przypadającymi na jeden węzeł obliczeniowy. Jedna karta Tesla S1070 pozwala na
osiągnięcie 2,8 mld prób łamania na sekundę, podczas gdy procesor Intel Core 2
Quad 6600 umożliwia podjęcie zaledwie 87 milionów prób złamana kodu na sekundę.
Środowisko C w CUDA
CUDA to tak naprawdę również kompletne środowisko programistyczne wraz z
odpowiednim API (Application Programming Interface). Środowisko programistyczne
CUDA zawiera między innymi kompilator nvcc C, profiler oraz debugger dla
procesora graficznego, a także sterownik uruchomieniowy CUDA, który dostępny już
jest także w standardowym sterowniku dla procesorów graficznych z rodziny
GeForce, a nie tylko w sterownikach dla kart Tesla. Wszystkie te elementy CUDA
pozwalają programistom bez specjalnego przygotowania (wymagana jest znajomość
języka C) zaprząc do obliczeń nie tylko procesor w komputerze, ale również GPU.
Dostępny w API CUDA firmowy interfejs programistyczny, to nie jedyny interfejs
dostępny dla środowiska CUDA. Firma NVIDIA udostępnienia twórcom oprogramowania
również pakiet SDK dla języka OpenCL, który również pozwala skorzystać z
technologii CUDA. Opracowany i ustandaryzowany przez konsorcjum
Khronos Group OpenCL czyli Open
Computing Language, jest frameworkiem wspomagającym pisanie aplikacji
wieloplatformowych składających się z różnego rodzaju jednostek obliczeniowych –
przede wszystkim CPU i GPU. OpenCL zawiera w sobie język służący do tworzenia
oprogramowania, bazujący na specyfikacji ISO-C99 oraz API pozwalający na
sprawowanie kontroli nad poszczególnymi urządzeniami systemu. OpenCL ma w swoim
założeniu pozwolić na zaprogramowanie aplikacji i funkcji, które będą działy na
najróżniejszych, ale kompatybilnych z OpenCL procesorach i układach graficznych
– podobnie jak ma to miejsce z graficznymi bibliotekami OpenGL. Co ciekawe, z
OpenCL są również kompatybilne karty graficzne ATI (firma AMD, podobnie jak
NVIDIA, Apple, HP, IBM, Sun czy Intel należy również do konsorcjum Khronos
Group). Oznacza, to, wspomaganie obliczeń w programach przez procesory graficzne
będzie możliwe nie tylko dla kart NVIDII. Jak twierdzi NVIDIA aplikacje zgodne z
OpenCL bezproblemowo działają na kartach graficznych obsługujący technologię
CUDA. Odpowiednie procedury zostały już włączone do GeForce’owych sterowników.

Microsoft Windows 7 będzie pierwszym systemem operacyjnym
wykorzystującym do rożnych zadań jednocześnie moc obliczeniową karty graficznej
i centralnego procesora - źródło: NVIDIA
Konkurencyjnym rozwiązaniem technologicznym w stosunku do
OpenCL mają być wprowadzone przez Microsoft do DirectX 11 jednostki Compute
Shader. Oznacza to, że najprawdopodobniej będziemy mieli do czynienia z dwoma
interfejsami programistycznymi pozwalającymi wykorzystać do zadań niezwiązanych
z grafiką moc obliczeniową akceleratorów 3D. Podobną sytuację mamy dzisiaj w
stosunku do DirectX i OpenGL. Będzie to pewien kłopot dla programistów, ale we
wszystkich sterownikach do kart graficznych zarówno ATI, jak i NVIDII, a także
Intela (projekt Larrabee) znajdą się procedury obsługi zarówno OpenGL, jak i
Compute Shader.
Obróbka wideo, czyli wreszcie coś dla ludzi
Jak widać z powyższych przykładów oprogramowanie zgodne z technologią CUDA
rozwijało się do tej pory głównie na uniwersytetach i instytutach
naukowo-badawczych. I nie ma w tym nic dziwnego, przecież CUDA dały do ręki
naukowcom i inżynierom potężne narzędzie do prowadzenia zaawansowanych
wysokowydajnych obliczeń stosunkowo niewielkim kosztem. Naukowcy nie muszą też,
mając do dyspozycji na biurku „osobisty superkomputer”, czekać w kolejce na tzw.
slot obliczeniowy (tak wielu naukowców nazywa czas przyznany na ich obliczenia
wykonywane na superkomputerze), za który często trzeba jeszcze płacić.
Niemniej, do niedawna zwykły właściciel domowego peceta z GeForce’m na
pokładzie, nie mógł skorzystać z dostępnej ponad pół tera flop(s)owej mocy
obliczeniowej. A trzeba pamiętać, że grono takich osób jest naprawdę ogromne,
biorąc pod uwagę wszystkich użytkowników GeForce’ów z serii 8000, 9000 i 200.
Bardzo dobrze zdawali sobie z tego sprawę inżynierowie i marketingowcy z NVIDII.
Wiedzieli oni dobrze, że szersze promowanie technologii CUDA ma tylko sens
wtedy, kiedy będą z niej mogli skorzystać zwykli użytkownicy kart graficznych.
NVIDIA, nie bez racji, stwierdziła, że w domowych warunkach najlepszym
zastosowaniem technologii CUDA będzie wspomaganie obróbki i odtwarzania wideo.
Po pierwsze gros użytkowników pecetów ma, ogląda i przetwarza na swoim
komputerze, a następnie część z nich wysyła na takie serwisy internetowe jak
YouTube, materiały wideo – ot choćby te nakręcone komórką, a pamiętajmy,
przyspieszenie przy zastosowaniu technologii CUDA w przetwarzaniu strumienia
wideo jest co najmniej 20-procentowe. Przy okazji można też poprawić jakość
takich materiałów wykorzystując wbudowane w kartę graficzną mechanizmy
przetwarzania obrazu wideo.






Przykłady programów do obróbki wideo wykorzystujących
technologię CUDA - źródło: NVIDIA
Pierwszym zaprezentowanym przez NVIDIĘ programem do obróbki
wideo korzystającym z technologii CUDA był Badaboom. Przez długi czas nie zdobył
on jednak dużej popularności i był traktowany raczej jako ciekawostka
demonstrująca możliwości wykorzystania technologii CUDA do obróbki wideo.
Dopiero od niedawna zaobserwować można prawdziwy wysyp programów do obróbki i
odtwarzania wideo wspierających technologię CUDA. Wśród nich wymienić można:
CyberLink Power Director 7, LiLoScope Mars, MotionDSP vReveal czy przede
wszystkim Nero MovieIt. Oczywiście, wszystkie te programy pokazują „lwi pazur”
podczas obróbki i odtwarzania materiałów wideo w wysokiej rozdzielczości HD.
Wybrane oprogramowanie komercyjne dla technologii CUDA:
1. vReveal firmy MotionDSP
2. ArcSoft SimHD
3. Ikena
4. Badaboom Media Converter firmy Elemental Technologies
5. Cyberlink PowerDirector 7
6. Loilo Scope Mars
7. Nero MoveIt
8. Pegasys TMPGenc
9. Gra społecznosciowa Nurien
10. Firma Elcomsoft. High-Performance Distributed Password Recovery
11. North Star Imaging
12. SciFinance
13. Manifold System GIS Internet Map Server for web applications
14. WIPRO
źródło: NVIDIA
AMD Stream, czyli jak to robi ATI
Oczywiście technologia CUDA to nie jedyny system pozwalający wykonywać
obliczenia typu GPGPU na kartach graficznych. Konkurencja NVIDII, czyli firma
ATI/AMD dysponuje również tego typu techniką o nazwie AMD Stream. Jest ona
zdecydowanie mniej znana szerszemu gronu użytkowników i programistów, niemniej
pozwala dokładnie na prowadzenie w taki sam sposób obliczeń HPC jak w wypadku
CUDA. Jak już wspomniałem, technologia AMD Stream zgodna jest z OpenCL oraz
technologią Compute Shader Microsoftu. Ta ostatnia cecha oznacza też pełną
kompatybilność ze wszystkimi mechanizmami zaimplementowanymi Windows 7
związanymi z wykorzystywaniem mocy obliczeniowej GPU do zadań niegraficznych
oraz zgodność pod tym względem z bibliotekami DirectX 11.

Architektura Radeona HD 4800 (RV770) korzystającego z 800
procesorów strumieniowych - źródło: ATI/AMD
Obecnie ATI/AMD udostępnia już swój API Stream SDK.
Technologia AMD Stream dostępna jest w kartach bazujących na chipach RV670 i
RV770, a więc Radeonach HD z serii 3800 i 4800 oraz karcie AMD FireStream 9270.
Jeśli chodzi o tą ostatnią to AMD chwali się, że jest to karta specjalnie
dedykowana obliczeniom HPC. Jej moc obliczeniowa wynosi 1,2 teraflop(s)a i 240
gigaflop(sów) jeśli chodzi o obliczenia podwójnej precyzji.

Architektura strumieniowych procesorów ATI/AMD - źródło:
ATI/AMD
Jeśli chodzi o sam układ RV770, to zawiera on 800
zunifikowanych strumieniowych jednostek cieniujących SPU (Stream Processing
Unit) – w RV670 jest ich 320. Moduły te są w stanie wykonywać zmiennoprzecinkowe
obliczenia typu SIMD ze 128-bitową precyzją. Organizacyjnie jednostki SIMD
podzielono na klastry zawierające po 10 bloków obliczeniowych, z których każdy
ma do dyspozycji 80 SPU. Każda jednostka SIMD ma do swojego użytku po 16 KB
pamięci podręcznej cache Local DataShare oraz wspólną dla 10 bloków
obliczeniowych pamięć Global DataShare. Ta ostatnia służy do wymiany danych,
alokacji i komunikacji między 10 blokami obliczeniowymi. W strukturze
architektury, którą ATI/AMD nazywa TeraScale Engine, znalazło się także 40
jednostek teksturujących – po 4 na jeden z dziesięciu bloków obliczeniowych.
Oprogramowanie dla AMD Stream
Jeśli chodzi o dostępne dla systemu AMD Stream komercyjne oprogramowanie (nie
naukowo-inżynierskie) to obecnie jego wybór jest znacznie mniejszy niż w wypadku
CUDA. Firma AMD chwali się, że z technologii AMD Stream korzysta ATI Avivo Video
Converter, CyberLink PowerDirector 7, ArcSoft TotalMedia Theater oraz niektóre
aplikacje firmy Adobe.





Wybrane oprogramowanie dostępna dla technologii ATI/AMD Stream
- źródło: ATI/AMD


ATI Stream SDK - źródło: ATI/AMD
Przyszłość GPGPU
Jak widać technologie związane z obliczeniami pozagraficznymi realizowanymi na
akceleratorach graficznych zaczynają dynamicznie przyspieszać. Na pewno impulsem
do dalszych prac będzie pojawienie się systemu operacyjnego Windows 7 i
bibliotek DirectX 11. Co ciekawe, również w kierunku obliczeń realizowanych za
pośrednictwem kart graficznych zaczyna podążać Intel. Jego projekt karty
graficznej Larrabee jest typowym projektem związanym z wykorzystaniem
technologii GPGPU.
Czy tandem CPU + GPU będzie podstawą zaawansowanych obliczeń w najbliższej
przyszłości? Na pewno tak. Jedno jest obecnie pewne. Dzięki mocy obliczeniowej
kart graficznych wysokowydajne obliczenia HPC z pewnością będą mogły zawitać pod
przysłowiowe strzechy.
Autor: Marcin Bieńkowski
Komentarze (16) |