Obliczenia na GPU

Obliczenia na GPU (GPU Computing)

Co to są obliczenia na GPU?

GPU Computing, czyli technologia obliczeń na GPU, to taki sposób wykorzystania możliwości układu GPU (jednostki przetwarzania graficznego), w którym wykonuje on obliczenia ogólnego przeznaczenia związane np. z zadaniami naukowymi lub inżynierskimi.
Ideą przewodnią dla technologii obliczeń na GPU jest współpraca procesora centralnego (CPU) z układem GPU w ramach środowiska obliczeniowego o heterogenicznym modelu przetwarzania. Sekwencyjna część aplikacji wykonywana jest przez układ CPU, zaś za złożone obliczeniowo fragmenty odpowiada układ GPU. Z punktu widzenia użytkownika aplikacja działa po prostu szybciej, ponieważ dzięki wykorzystaniu wysokowydajnego układu GPU wydajność przetwarzania wzrasta.

Heterogeneous Computing

Twórca aplikacji musi zmodyfikować jej kod, wyodrębniając w nim jądra o wysokiej złożoności obliczeniowej i mapując je na układ GPU. Pozostała część aplikacji pozostaje bez zmian i jest wykonywana przez CPU. Proces mapowania funkcji na GPU pociąga za sobą konieczność przepisania na nowo jej kodu w taki sposób, by wyrazić równoległość realizowanych przez nią zadań. Wymaga przy tym dodania tzw. słów kluczowych języka C, umożliwiających przekazywanie danych do GPU i z powrotem.

Wykonywanie obliczeń na GPU stało się możliwe dzięki masowo równoległej architekturze układów GPU NVIDIA, zwanej architekturą CUDA. W jej skład wchodzą setki działających równolegle rdzeni obliczeniowych, które współpracują ze sobą i przetwarzają z ogromną wydajnością przekazywane przez aplikację dane.

Układ GPU Tesla z serii 10 wykorzystuje drugą generację architektury CUDA, zawierającej elementy zoptymalizowane pod kątem zastosowań naukowych, takie jak sprzętowa obsługa liczb zmiennoprzecinkowych o podwójnej precyzji w formacie zgodnym ze standardem IEEE, lokalna pamięć podręczna dla danych w formie współdzielonej pamięci rozmieszczonej w obrębie całego układu GPU, połączone operacje na pamięci itd.

„Układy GPU wyewoluowały do poziomu, gdzie wiele realizujących praktyczne zadania aplikacji implementuje się na nich z łatwością. Programy te działają przy tym znacząco szybciej, niż na zwykłych systemach wielordzeniowych. Przyszłe architektury obliczeniowe będą systemami hybrydowymi, w których wyposażone w równoległe rdzenie procesory graficzne będą pracować w tandemie z wielordzeniowymi układami CPU.”Prof. Jack Dongarra
Dyrektor Laboratorium Innowacyjnych Technologii Obliczeniowych
Uniwersytet Tennessee

Historia obliczeń na GPU

Układy graficzne funkcjonowały początkowo na zasadzie potoków przetwarzania graficznego o sztywno ustalonych funkcjach. W przeciągu lat stawały się one coraz bardziej programowalne, co doprowadziło w efekcie do wprowadzenia przez firmę NVIDIA pierwszego układu GPU, czyli jednostki przetwarzania graficznego (Graphics Processing Unit). W okresie 1999-2000 r. przede wszystkim informatycy, ale także badacze zajmujący się takimi dziedzinami jak np. obrazowanie medyczne i elektromagnetyzm, zaczęli uruchamiać na układach GPU aplikacje, które wykonywały na nich obliczenia ogólnego przeznaczenia. Zaobserwowali oni, że znakomita wydajność układów GPU w operacjach zmiennoprzecinkowych doprowadziła do ogromnego wzrostu wydajności wielu aplikacji naukowych. Był to początek nurtu zwanego GPGPU (General Purpose computing on GPU), czyli technologii obliczeń ogólnego przeznaczenia na układach GPU.

Istniał jednak pewien problem – technologia GPGPU wymagała programowania układu GPU z użyciem języków do programowania grafiki, takich jak OpenGL czy Cg. Programiści zmuszeni byli przekształcać swoje, wykorzystywane w pracach naukowych aplikacje w taki sposób, by wyglądały i działały one jak programy graficzne, które rozwiązywały stawiane przed nimi problemy kreśląc trójkąty i wielokąty. Podejście to ograniczyło stopień wykorzystania olbrzymiej wydajności układów GPU w badaniach naukowych.

Firma NVIDIA uświadomiła sobie potencjał, jaki niosła ze sobą możliwość przekazania tej klasy wydajności w ręce szerszej społeczności pracowników badawczych i naukowych, zdecydowała się zatem zainwestować i tak zmodyfikować układ GPU, by uczynić go w pełni programowalnym i użytecznym w zastosowaniach naukowych. Dodała także obsługę języków programowania wysokiego poziomu, takich jak C i C++. W ten właśnie sposób powstała dedykowana układom GPU architektura CUDA.

Architektura równoległa CUDA i związany z nią model programowania

Równoległej architekturze sprzętowej CUDA towarzyszy model programowania równoległego o tej samej nazwie. Udostępnia on zestaw abstrakcyjnych pojęć, które pozwalają na wyrażanie równoległości zadań – a także przetwarzanych przez nie danych – o drobnej i grubej ziarnistości. Programista ma do wyboru możliwość wyrażenia tej równoległości zarówno za pomocą języków programowania wysokiego poziomu, takich jak C, C++ i Fortran, jak i z użyciem obsługiwanych przez odpowiednie sterowniki interfejsów programowania aplikacji (API), takich jak OpenCL™ i DirectX™ 11 Compute.

GPU-ComputingOvrw.png

Firma NVIDIA wprowadziła w pierwszej kolejności obsługę języka C. Zestaw narzędzi do tworzenia oprogramowania zwany „C dla CUDA” pozwala na programowanie układu GPU w języku C z użyciem minimalnego zbioru słów kluczowych i rozszerzeń. Wkrótce po tym dodano wsparcie dla języka Fortran, środowiska OpenCL i innych.

Stosowanie modelu programowania równoległego CUDA wymaga od programistów dekompozycji rozwiązywanego przez nich problemu, czyli rozbicia go na podproblemy o grubej ziarnistości, które mogą być rozwiązywane równolegle niezależnie od siebie. Równoległość drobnoziarnistą w podproblemach osiąga się, dzieląc każdy z nich na podzadania, które można rozwiązywać równolegle na zasadach współpracy.

Technologia CUDA – rozumiana zarówno jako architektura układów GPU, jak i związany z nią model programowania równoległego – jest obecnie szeroko stosowana i wykorzystywana w setkach aplikacji. Opublikowano także blisko tysiąc związanych z nią prac badawczych. Wiele ze wspomnianych aplikacji i publikacji dostępnych jest w witrynie CUDA Zone.

OpenCL jest znakiem towarowym Apple Inc. używanym na licencji przez Khronos Group Inc.
DirectX jest zarejestrowanym znakiem towarowym Microsoft Corporation.