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.