Architektura zunifikowana – zasady przetwarzania shaderów

Transkrypt

Architektura zunifikowana – zasady przetwarzania shaderów
Politechnika Świętokrzyska
Architektura procesorów graficznych
Architektura zunifikowana – zasady
przetwarzania shaderów
Anita Szymańska
Informatyka, gr. 413B
1) Architektura zunifikowana
„Pierwsza w branży zunifikowana architektura zaprojektowana pod kątem dynamicznego
przydziału zasobów układu GPU do zadań obliczeniowych, przetwarzania geometrii i
pikseli oraz cieniowania, optymalizując w ten sposób działanie pod kątem najwyższej
wydajności aplikacji.” NVIDIA
Czym jest architektura zunifikowana?
W przeszłości procesory graficzne wyposażone były w dedykowane jednostki
przeznaczone do wykonywania poszczególnych typów operacji, takich jak
przetwarzanie wierzchołków czy cieniowanie pikseli. W ramach zunifikowanej
architektury układów z serii GeForce 8, NVIDIA zaprojektowała jeden rdzeń obliczeń
zmiennoprzecinkowych z wieloma niezależnymi procesorami. Każdy z tych
niezależnych procesorów jest w stanie wykonywać dowolną operację, w tym
cieniowanie pikseli, wierzchołków, przetwarzanie geometrii i fizyki. Procesory graficzne
GeForce mogą dynamicznie przydzielać moce obliczeniowe w zależności od obciążenia
aplikacji, zapewniając w ten sposób bezprecedensową wydajność i efektywność.
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.
Aby wyjaśnić na czym polega technologia zunifikowanych shaderów warto przybliżyć
samą ideę shaderów oraz pierwotną technologię.
Shader – jest to program napisany w assemblerze lub specjalnie zaprojektowanym do
tego celu języku wykorzystywanych przez zasoby graficzne do renderowania efektów
dający programiście dodatkową kontrole nad sposobem ich renderowania. Shadery dają
programiście możliwość zaprogramowania programowalnego potoku przetwarzania w
GPU.
Dotychczas w kartach graficznych umieszczano dwa osobne mechanizmy shaderów z
odmiennymi zestawami instrukcji oraz odmiennymi mechanizmami pamięci podręcznej.
Były dwa osobne potoki i w sytuacji gdy jedynie jeden był wykorzystywany drugi
marnował się ponieważ zwykle ich praca była dominowana w danym momencie
poprzez przetwarzanie jedynie wierzchołków lub jedynie pikseli.
Mechanizm zunifikowanych shaderów wprowadza jedno sprzętowe rozwiązanie które
zajmuje się zarówno shaderami wierzchołków jak i pikseli. Zunifikowane shadery łączą
zestawy instrukcji, wprowadzają ujednolicony mechanizm pamięci podręcznej i
umożliwiają elastyczne dostosowanie jednostek shaderów do danej sytuacji. Jednostki
shaderów mogą być wykorzystywane wszystkie naraz zarówno do przetwarzania
wierzchołków jak i pikseli, lub też jeśli zachodzi taka potrzeba będą rozdysponowane
pomiędzy dwa shadery. Istnieje też możliwość przejęcia przez programistę kontroli nad
rozdysponowywaniem jednostek shaderów. Dzięki ich zastosowaniu programista może
napisać dzięki obszernemu zestawowi instrukcji jeden program zajmujący się różnymi
danymi.
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. 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 procesory strumieniowe. Do
tej pory tymi obliczeniami parał się zaś CPU.
Cechy architektury zunifikowanej

Przetwarzanie strumieniowe
Przetwarzanie strumieniowe to technologia komputerowa, umożliwiająca równoległe
przetwarzanie określonych serii operacji w wielu strumieniach danych z ogromną
wydajnością i efektywnością. Rdzeń obliczeniowy procesorów graficznych GeForce 8800
składa się ze 128 pracujących równolegle procesorów strumieniowych taktowanych z
częstotliwością 1.35 GHz, zapewniających niezrównaną wydajność w grach.
Przetwarzanie strumieniowe jest najbardziej wydajną architekturą obróbki grafiki.
Przetwarzanie strumieniowe ewoluowało razem z rozwojem grafiki i architektura
procesorów GeForce 8 oferuje nową generację architektury strumieniowej. GeForce
8800 dysponuje zunifikowaną architekturą, w której programy przetwarzające
geometrię, wierzchołki i piksele współdzielą zasoby przetwarzania strumieniowego.

Przetwarzanie potokowe
Przetwarzanie potokowe to sposób przetwarzania rozkazów w procesorach, w którym
do przetwarzania zastosowano potok podzielony na etapy. W przeciwieństwie do
klasycznego (sekwencyjnego) sposobu przetwarzania rozkazów gdzie każdy jest
pobierany, dekodowany, wykonywany oddzielnie, w przetwarzaniu potokowym w
procesorze następuje jednoczesne przetwarzanie kliku (zależności od głębokości/ilości
etapów potoku) rozkazów jednocześnie. Każdy z rozkazów znajduje się w danym cyklu
maszynowym w innym etapie przetwarzania i dzięki temu wyniki operacji mogą być
produkowane niemal w każdym cyklu.
Główne etapy przetwarzania potokowego to:
pobranie kodu rozkazu z pamięci
 dekodowanie - wytworzenie sygnałów sterujących jednostkami wykonawczymi na
podstawie kodu rozkazu
 wykonanie - właściwa część przetwarzania rozkazu w jednostce wykonawczej
 zapis wyniku operacji do pamięci
Podział każdego etapu na podetapy umożliwia skrócenie cyklu, a to z kolei pozwala na
dalszy wzrost szybkości przetwarzania. Taki mechanizm nazywany jest przetwarzaniem
superpotokowym. Liczba podetapów cyklów rozkazów (głębokość potoku) nie może być
jednak dowolnie duża, bo podział etapu wymaga zwiększenia liczby buforów
separujących, co z kolei powoduje zmniejszenie przepustowości potoku (opóźnienie w
układach separujących etapy jest proporcjonalne do ich liczby i jest skutkiem wzrostu
narzutu czasu na cele organizacyjne).

W przetwarzaniu potokowym ze względu na narzuty czasowe na wykonanie każdego
etapu rozkazu (opóźnienia buforów) i konieczność wpasowania etapów w ramy
czasowe potoku (czas przejścia rozkazu przez etap jest równy czasowi cyklu), czas
wykonania pojedynczego rozkazu jest dłuższy niż w przetwarzaniu sekwencyjnym. Przy
częstych zakłóceniach potoku może się zatem zdarzyć, że czas przetwarzania
potokowego będzie porównywalny bądź nawet dłuższy z czasem sekwencyjnego
wykonania instrukcji programu.

Przetwarzanie wielowątkowe
Przetwarzanie wielowątkowe – cecha systemu operacyjnego, dzięki której w ramach
jednego procesu może wykonywać kilka zdań lub jednostek wykonawczych.
- Vertex shader (cieniowanie wierzchołkowe, które uruchamiane jest raz dla
poszczególnych przetwarzanych wierzchołków)
- Geometry shader (cieniowanie geometryczne pozwalające na dodawanie lub usuwanie
wierzchołków z siatki wierzchołków)
- Pixel shader (cieniowanie pikseli, jest jednostką odpowiadają za wyliczanie koloru
pikseli)
Czym jest multiprocesor?
„Wieloprocesor, architektura wieloprocesorowa - komputer zaopatrzony w wiele układów
mikroprocesorów działających na wspólnej pamięci.
Wszystkie procesory wieloprocesora dzielą tę samą pamięć. Zmiany wykonane w pamięci
przez jeden z procesorów są natychmiast widoczne dla każdego z pozostałych.” Wikipedia
Istnieje wiele metod realizacji przetwarzania równoległego. Pewne charakterystyczne
cechy zastosowanych rozwiązań dały początek klasyfikacji wieloprocesorowości wg
trzech podstawowych kategorii: strumieni (danych i kontroli), zasobów (lokalności i
globalności) oraz ziarnistości kodu (wielkości równolegle przetwarzanych fragmentów).
Niektóre komputery wieloprocesorowe określane są także jako multikomputery.
Oznacza to, że w maszynie równolegle pracują całkowicie niezależne zestawy
sprzętowe, zawierające oprócz procesora także własne układy pomocnicze i zasoby
(pamięć, I/O). Wygląda to tak, jakby system zbudowany był z mniejszych, pracujących
równolegle komputerów sekwencyjnych.
Klasyfikacja wg kryterium strumieni
Sposób przetwarzania informacji dzieli się ogólnie na sekwencyjny i równoległy. Istnieje
jednak kilka podklas równoległości, zasadniczo różniących się od siebie. Podział metod
przetwarzania informacji na cztery klasy, zaproponował już w 1966 r. M. Flynn,
wprowadzając określenie strumieni: instrukcji i danych. Doprowadziło to do utworzenia
czterech klas: SISD, MISD, SIMD i MIMD.
SISD (Single Instruction stream - Single Data stream) to sposób przetwarzania
informacji przy którym w danej chwili przez komputer przepływa jeden strumień
danych, kontrolowany jednym strumieniem instrukcji. SISD jest w gruncie rzeczy
synonimem przetwarzania sekwencyjnego, chociaż do tej klasy można też zaliczyć
charakterystyczne dla maszyn wektorowych przetwarzanie potokowe, gdzie pewne
instrukcje są wykonywane równolegle do siebie.
MISD (Multiple Instruction stream - Single Data stream) to architektura praktycznie nie
występująca w żadnej istniejącej maszynie (ze względu na jej małą użyteczność).
Teoretycznie oznacza to, że na dokładnie tych samych danych wykonuje się
jednocześnie wiele różnych instrukcji. Tego typu przetwarzanie może być użyteczne do
zastosowań statystycznych, np. przy porównywaniu działania wielu zestawów instrukcji
na pewnej jednostce informacji.
SIMD (Single Instruction stream - Multiple Data stream) to organizacja
charakterystyczna dla dużych komputerów równoległych. Oznacza to w praktyce, że
wiele procesorów otrzymuje jednocześnie tę samą instrukcję i wykonuje ją na
odmiennych zestawach danych. Tego typu działanie jest bardzo przydatne przy
obliczeniach na macierzach danych czy też przy niektórych algorytmach równoległych,
jak sortowanie czy wyszukiwanie informacji w bazie danych.
MIMD (Multiple Instruction stream - Multiple Data stream) to najbardziej ogólna
organizacja przetwarzania równoległego, w której w danym momencie kilka
procesorów może wykonywać całkowicie różne instrukcje na odrębnych zestawach
danych. Jest to organizacja wykorzystywana przede wszystkim w maszynach SMP, gdzie
każdy procesor zajmuje się w danym momencie zadaniem w dużym stopniu
niezależnym od stanu reszty systemu.
Budowa multiprocesora
Różne modele kart graficznych firmy NVIDIA posiadają różną liczne multiprocesorów,
co przekłada się także na wydajność i zdolność obliczeniową danej architektury. Na
rysunku przedstawiona jest przykładowa budowa takiego właśnie multiprocesora.
Każdy z multiprocesorów składa się z :
I-Cache – bufor instrukcji;
MT Issue – jednostka która rozdziela zadania dla SP i SFU
C-Cache –bufor stałych (ang. constant memory) o wielkości 8KB, który przyspiesza
odczyt z obszaru pamięci stałej
8 x SP – 8 jednostek obliczeniowych, które wykonują większość obliczeń pojedynczej
precyzji (każdy zawiera własne 32-bitowe rejestry)
2 x SFU - jednostki specjalne (ang. special function units). Zadaniem ich jest obliczanie
funkcji przestępnych, np. trygonometrycznych, wykładniczych i logarytmicznych, czy
interpolacja parametrów.
DP –procesor, który wykonuje obliczenia podwójnej precyzji
SM – pamięć współdzielona (ang. shared memory) o wielkości 16KB.
2) Wielowątkowość
Czym jest wątek?
„Część programu wykonywana współbieżnie w obrębie jednego procesu; w jednym procesie
może istnieć wiele wątków.” Wikipedia
Koncepcja wątku (ang. thread) wiąże się ze współdzieleniem zasobów. Każdy proces
(ciężki proces w odróżnieniu od lekkiego, czyli wątku) otrzymuje zasoby od
odpowiedniego zarządcy i utrzymuje je do swojej dyspozycji. Zasoby przydzielone
procesowi wykorzystywane są na potrzeby sekwencyjnego wykonania programu, ale w
wyniku wykonania programu mogą się pojawić kolejne żądania zasobowe.
Niedostępność żądanego zasobu powoduje zablokowanie procesu (wejście w stan
oczekiwania). W programie procesu może być jednak inny niezależny fragment, do
wykonania którego żądany zasób nie jest potrzebny. Można by zatem zmienić kolejność
instrukcji w programie i wykonać ten niezależny fragment wcześniej, jednak do jego
wykonania może być potrzebny inny zasób. Dostępność zasobów zależy od stanu całości
system i w czasie tworzenia programu nie wiadomo, które z nich będą dostępne, gdy
będą potrzebne do wykonania jednego czy drugiego fragmentu.
W programie dobrze jest zatem wówczas wyodrębnić takie niezależne fragmenty i
wskazać systemowi, że można je wykonać w dowolnej kolejności lub nawet
współbieżnie, w miarę dostępnych zasobów. Taki wyodrębniony fragment określa się
jako wątek. Wątek korzysta głównie z zasobów przydzielonych procesowi — współdzieli
je z innymi wątkami tego procesu. Zasobem, o który wątek rywalizuje z innymi wątkami,
jest procesor, co wynika z faktu, że jest on odpowiedzialny za wykonanie fragmentu
programu. Wątek ma więc własne sterowanie, w związku z czym kontekst każdego
wątku obejmuje licznik rozkazów, stan rejestrów procesora oraz stos. Każdy wątek musi
mieć swój własny stos, gdzie odkładane są adresy powrotów z podprogramów oraz
alokowane lokalne zmienne.
Na czym polega szeregowanie wątków?
Algorytm szeregowania (ang. scheduler - planista) to algorytm rozwiązujący jedno z
najważniejszych zagadnień informatyki - jak rozdzielić czas procesora i dostęp do
innych zasobów pomiędzy zadania, które w praktyce zwykle o te zasoby konkurują.
Najczęściej algorytm szeregowania jest implementowany jako
część wielozadaniowego systemu operacyjnego, odpowiedzialna za ustalanie kolejności
dostępu zadań do procesora. Oprócz systemów operacyjnych dotyczy w szczególności
także serwerów baz danych.
Wybrane algorytmy szeregowania:
Używane najczęściej

FIFO – liniowa struktura danych, w której nowe dane dopisywane są na końcu
kolejki, a z początku kolejki pobierane są dane do dalszego przetwarzania (bufor
typu FIFO, First In, First Out; pierwszy na wejściu, pierwszy na wyjściu).
Specjalną modyfikacją kolejki jest kolejka priorytetowa – każda ze znajdujących się w
niej danych dodatkowo ma przypisany priorytet, który modyfikuje kolejność
późniejszego wykonania. Oznacza to, że pierwsze na wyjściu niekoniecznie pojawią się
te dane, które w kolejce oczekują najdłużej, lecz te o największym priorytecie.
Kolejkę spotyka się przede wszystkim w sytuacjach związanych z różnego rodzaju
obsługą zdarzeń. W szczególności w systemach operacyjnych ma zastosowanie kolejka
priorytetowa, przydzielająca zasoby sprzętowe uruchomionym procesom.
Przeciwieństwem kolejki jest stos, bufor typu LIFO (ang. Last In, First Out; ostatni na
wejściu, pierwszy na wyjściu), w którym jako pierwsze obsługiwane są dane
wprowadzone jako ostatnie.

Planowanie rotacyjne (round-robin, znane też jako algorytm karuzelowy) mówi, że
można stworzyć tyle kolejek ile jest strumieni oraz zdejmować pakiety po jednym
z każdego pasma w stałym porządku. Jeśli dane pasmo nie ma nic do wysłania,
przechodzi się do kolejnego bez tracenia czasu. W ten sposób, jeśli połączenie
zaczyna wysyłać dane, ma pewność, że pierwszy pakiet zostanie wysłany nie później
niż po czasie jednego okresu.

Planowanie sporadyczne - zadania otrzymują tak zwany "budżet czasu"; ten algorytm
pomaga pogodzić wykluczające się reguły dotyczące szeregowania zadań
okresowych i nieokresowych; wciąż nie jest implementowany przez wiele systemów,
jednak znalazł się w standardzie POSIX;
Co to jest wielowątkowość?
Wielowątkowość (ang. multithreading) – cecha systemu operacyjnego, dzięki której w
ramach jednego procesu może wykonywać kilka zadań lub jednostek wykonawczych.
Nowe zadania to kolejne ciągi instrukcji wykonywane oddzielnie. Wszystkie zadania w
ramach tego samego procesu współdzielą kod programu i dane.
Wielowątkowość może także odnosić się do samych procesorów. W takim wypadku
oznacza możliwość jednoczesnego wykonywania wielu wątków sprzętowych na
pojedynczej jednostce wykonawczej – rdzeniu (ang. core). Wielowątkowość w
procesorach możliwa jest dzięki temu, że nie wszystkie części jednostki wykonawczej są
w jednakowym stopniu wykorzystywane przez pojedynczy wątek (ciąg instrukcji).
Nieaktywne części jednostki wykonawczej mogą w tym czasie wykonywać inny wątek
zwiększając efektywność wykorzystania całego procesora. W zależności od rodzaju
technik zastosowanych do obsługi dodatkowych wątków sprzętowych spotyka się od 2
(najczęściej) do nawet 8 wątków sprzętowych na pojedynczy rdzeń procesora (core).
Cechy wielowątkowości:
 wszystkie wątki wykonują się w ramach tylko jednego programu (procesu) - innymi
słowy jeden proces posiada wiele instancji wykonawczych (wątków)

wątki zostały wprowadzone aby umożliwić przetwarzanie współbieżne, np gdy
zachodzi potrzeba wykonania wielu zadań jednocześnie. Może się to wiązać również
ze zwiększeniem wydajności o ile istnieją odpowiednie zasoby sprzętowe (wiele
procesorów lub obsługa wielowątkowości przez pojedynczy procesor). Należy
pamiętać iż wprowadzenie wątków może obniżyć wydajność ponieważ najczęściej
wymagane jest przy tym wprowadzenie odpowiednich mechanizmów
synchronizacji;

wszystkie wątki procesu współdzielą tę samą wirtualną przestrzeń adresową (mają
dostęp do tych samych "egzemplarzy" zmiennych, obiektów i struktur) i korzystają z
tych samych zasobów systemowych;

komunikacja między wątkami w odróżnieniu od procesów jest bardzo łatwa do
wykonania – w przypadku wątków wystarczy odwoływać się do tych samych
zmiennych i obiektów – komunikacja między procesami wymaga zastosowania
mechanizmów IPC.

współdzielenie wirtualnej przestrzeni adresowej niesie zagrożenie – jeden
"wadliwy" wątek może zagrozić wykonaniu całego programu;

każdy wielowątkowy system operacyjny zapewnia specyficzne
metody synchronizacji wątków, które z wyżej wymienionych przyczyn należy
bezwzględnie zaimplementować.
Systemy wielowątkowe to m.in. BeOS, Microsoft Windows 95, Windows NT, Unix i
systemy bazujące na jądrze Linux.
Problemy wielowątkowe:
- Wyścig (race condition)– do sytuacji wyścigu dochodzi wówczas, gdy wiele procesów
wykonuje operacje na tych samych danych, a rezultat tych operacji jest zależny od
kolejności, w jakiej procesy zostaną wykonane.
- Blokada (deadlock, livelock)– blokady zasobów eliminują niespójny zapis/odczyt ale
mogą prowadzić do zakleszczenia
• wzajemne wykluczenie,
• trzymanie zasobu i oczekiwanie,
• cykliczne oczekiwanie,
• brak wywłaszczania z zasobu.
- Zagłodzenie – pewne zadania mogą nigdy nie dojść do skutku ze względu na
konkurencję o zasoby pomiędzy współbieżnymi zdaniami.
- Projekt – konieczność przewidzenia problemów i ewentualne zastosowania
algorytmów je rozwiązujących.
- Implementacja – użycie struktur synchronizujących.
- Testy/wdrożenie – błędy wielowątkowe są niedeterministyczne (intermitencja).
Trudności w ich wykrywaniu i debugowaniu.
c) Model CUDA
„CUDA to opracowana przez firmę NVIDIA równoległa architektura obliczeniowa, która
zapewnia radykalny wzrost wydajności obliczeń, dzięki wykorzystaniu mocy układów GPU.
W milionach sprzedanych do dziś układów GPU z obsługą CUDA, tysiące twórców
oprogramowania, naukowców i badaczy znajduje szereg zastosowań dla architektury
CUDA, włączając w to przetwarzanie wideo, astrofizykę, biologię obliczeniową i chemię,
symulację dynamiki płynów, rekonstrukcję obrazu w tomografii komputerowej, analizę
sejsmiczną, ray tracing i znacznie więcej.” NVIDIA
Co to jest model CUDA?
CUDA (ang. Compute Unified Device Architecture) – 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.
Czym się charakteryzuje?
• Wielowątkowość
• Wielozadaniowość
Wielozadaniowość – cecha systemu operacyjnego umożliwiająca mu równoczesne
wykonywanie więcej niż jednego procesu. Zwykle za poprawną realizację
wielozadaniowości odpowiedzialne jest jądro systemu operacyjnego.
Wielozadaniowość zapewniona jest między innymi przez planistę, czyli część systemu
operacyjnego realizującą algorytm szeregowania zadań w kolejce do przyznania
czasu procesora.
Równoczesność jest pozorna, gdy system ma dostępnych mniej procesorów niż zadań do
wykonania. Wówczas dla uzyskania wrażenia wykonywania wielu zadań jednocześnie,
konieczne staje się dzielenie czasu.
• Programowanie w językach wysokiego poziom
Integralną częścią architektury CUDA jest oparte na języku programowania
C środowisko programistyczne wysokiego poziomu, w którego skład wchodzą m.in.
specjalny kompilator (nvcc), debugger (cuda-gdb, który jest rozszerzoną wersją
debuggera gdb umożliwiającą śledzenie zarówno kodu wykonywanego na CPU, jak i na
karcie graficznej), profiler oraz interfejs programowania aplikacji. Dostępne są również
biblioteki, które można wykorzystać w językach Python, Fortran, Java, C# oraz Matlab.
Pierwsze wydanie środowiska wspierało systemy operacyjne Windows oraz Linux. Od
wersji 2.0 wspierany jest również Mac OS X.
Zalety i wady
Zalety:
W stosunku do tradycyjnych metod wykonywania obliczeń inżynierskich na GPU, CUDA
posiada kilka istotnych zalet:

Język programowania oparty na języku C.

Model pamięci procesora ściśle odpowiadający architekturze sprzętowej, co
umożliwia świadome, efektywne wykorzystywanie dostępnych zasobów GPU, w
tym pamięci współdzielonej(obecnie do 48 KB). Pamięć ta jest współdzielona
przez wszystkie wątki w tzw. bloku (zwykle 128-512 wątków). Można jej używać
jako programowalnej pamięci typu cache.

Kod uruchamiany na GPU może odczytywać i zapisywać dane z dowolnego
adresu w pamięci GPU.

Projekt architektury CUDA zakłada pełną kompatybilność programów – napisany
dziś program wykonywalny ma w przyszłości działać bez żadnych zmian na coraz
wydajniejszych procesorach graficznych posiadających coraz większą liczbę
rdzeni, rejestrów, pamięci operacyjnej i innych zasobów.
Wady:

CUDA korzysta z podzbioru języka C++, który do wersji 3.1 uniemożliwiał
wykorzystywanie rekurencji i wskaźników na funkcje. Nie można również
definiować statycznych zmiennych wewnątrz funkcji, a funkcje mogą mieć tylko
stałą liczbę parametrów.

Dla liczb zmiennoprzecinkowych podwójnej precyzji (dostępnych w nowszych
procesorach) istnieją pewne odstępstwa od standardu w zakresie zaokrąglania
liczb.

Przepustowość i opóźnienia magistrali PCI-Express łączącej CPU i GPU mogą być
wąskim gardłem w przypadku przesyłania dużej ilości danych

W przeciwieństwie do języka OpenCL, CUDA jest dostępna jedynie dla kart
graficznych produkowanych przez firmę NVIDIA. Obecnie z CUDA można
korzystać na wszystkich kartach począwszy od serii GeForce 8 w
tym Quadro oraz Tesla
Zastosowanie
W grach komputerowych moc obliczeniową można wykorzystać do obliczeń fizyki w
grach, ale CUDA jest również wykorzystywana do przyspieszania obliczeń w takich
dziedzinach jak biologia, fizyka, kryptografia i inne obliczenia inżynierskie. Dla potrzeb
tego segmentu NVIDIA opracowała specjalny procesor graficzny Tesla.
 Przyspieszenie szyfrowania i kompresji oraz konwersji wideo do różnych
formatów

Symulacje fizyczne (np. w dynamice płynów) i obliczenia inżynierskie

Obrazowanie wirtualnej rzeczywistości na podstawie tomografii
komputerowej i rezonansu magnetycznego

Efekty specjalne w grafice komputerowej, np. symulacje falujących powierzchni
ubrań

Sztuczna inteligencja

Architektura CUDA została też entuzjastycznie przyjęta na polu badań
naukowych. Przykładowo, CUDA akceleruje obecnie oprogramowanie AMBER –
program do symulacji dynamiki molekularnej używany przez ponad 60 tysięcy
badaczy ze środowisk akademickich i firm farmaceutycznych na całym świecie,
który wykorzystywany jest przez nich w celu skrócenia czasu opracowywania
nowych leków.

Na rynku finansowym, firmy Numerix i ComatibL poinformowały o obsłudze
architektury CUDA przez nową aplikację do analizy ryzyka strony przeciwnej
(counterparty risk) i osiągniętym dzięki temu 18-krotnym wzroście wydajności.
Oprogramowanie firmy Numerix jest wykorzystywane przez blisko 400 instytucji
finansowych.

Wskaźnikiem akceptacji CUDA na rynku jest rosnąca popularność rozwiązań GPU
Tesla dedykowanych obliczeniom na GPU. Obecnie na całym świecie
zainstalowanych jest ponad 700 klastrów GPU, które wykorzystywane są przez
firmy Fortune 500, poczynając od firm Schlumberger i Chevron w sektorze
energetycznym, a na BNP Paribas w bankowości kończąc.

Dzięki ostatnim premierom systemów Microsoft Windows 7 i Apple Snow
Leopard technologia obliczeń na GPU staje się nurtem dominującym. W tych
nowych systemach operacyjnych układ GPU będzie pełnił funkcję nie tylko
procesora graficznego, ale także wykorzystywanego w zadaniach ogólnego
przeznaczenia procesora o architekturze równoległej, którego będzie mogła
używać dowolna aplikacja.

Podobne dokumenty