Wykład 1.

Transkrypt

Wykład 1.
Programowanie współbieżne
Wprowadzenie do programowania GPU
Rafał Skinderowicz
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Literatura
• Sanders J., Kandrot E., CUDA w przykładach, Helion.
• Czech Z., Wprowadzenie do obliczeń równoległych, PWN
• Ben-Ari M., Podstawy programowania współbieżnego i
rozproszonego, WNT.
• Kirk, David B., and W. Hwu Wen-mei. Programming
massively parallel processors: a hands-on approach. Newnes,
2012.
• Scarpino, Matthew. OpenCL in Action: how to accelerate
graphics and computation. Manning, 2012.
• Specyfikacja OpenCL.
• Pacheco P., Parallel Programming with MPI, Morgan
Kaufmann, 1996.
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
Plan wykładu
1
Wprowadzenie
2
Historia rozwoju GPU
Historia rozwoju GPU
3
Model programowania GPU
Model programowania GPU
4
CUDA
CUDA
5
Architektura GPU
Architektura GPU
6
OpenCL
OpenCL
CUDA
Architektura GPU
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Bariery technologiczne
Rozwój procesorów napotyka na kilka istotnych problemów:
• Tranzystory nie mogą być nieskończenie małe
• Taktowanie tranzystorów może być zwiększane do pewnej
granicy
• Tranzystor pracujący z większą częstotliwością generuje więcej
ciepła
• Chłodzenie miliardów tranzystorów we współczesnych
procesorach jest dużym problemem
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
GPU
Procesor graficzny (ang. Graphics Procssing Unit, GPU) to
specjalizowana jednostka obliczeniowa zoptymalizowana pod kątem
przetwarzania grafiki
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
GPU – historia
• Pierwsze dedykowane układy graficzne pojawiły się w latach
80 XX wieku (grafika 2D)
• 1992 – Wydano OpenGL v1.0 (v4.5 w 2014)
• 1995 – Microsoft wydał Direct3D (v12 w 2014)
• 1996 – 3df Voodoo Graphics – akcelerator tylko do grafiki 3D
• 1997 – Riva 128 (DirectX5)
• 1999 – GeForce 256 – Nvidia popularyzuje skrót GPU
• 2007 – Nvidia wydała CUDA v1.0 (v6.0 w 2014)
• 2009 – Apple wydało OpenCL v1.0 (v2.0 w 2013)
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
CPU vs GPU
CPU:
• tradycyjne CPU są bardzo złożone (bogata lista rozkazów,
rozbudowana jednostka kontrolna)
• elastyczność programowania i spora wydajność
• potrzebują stosukowo dużo mocy
GPU:
• mniej złożona jednostka kontrolna
• więcej jednostek do przetwarzania równoległego
• większa efektywność mierzona liczbą operacji / wat
• bardziej restrykcyjny model programowania
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
CPU vs GPU
GPU
• Duża liczba prostych jednostek przetwarzania, zegar
taktowania nie musi dorównywać CPU
• Większy nacisk na dużą przepustowość (ang. throughput), niż
na niskie opóźnienie (ang. latency) w wykonywaniu
pojedynczych instrukcji
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Przepustowość a opóźnienie
• Załóżmy, że chcemy przetransportować 40 osób na odległość
1000km
• Mamy do wyboru 2 pojazdy: samochód (4 osoby, 140 km/h)
oraz autobus (40 osób, 70 km/h)
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Przepustowość a opóźnienie
• Załóżmy, że chcemy przetransportować 40 osób na odległość
1000km
• Mamy do wyboru 2 pojazdy: samochód (4 osoby, 140 km/h)
oraz autobus (40 osób, 70 km/h)
Samochód:
• Opóźnienie (czas podróży):
≈ 7h 10min
• Przepustowość: ≈ 0.56
osoby/godz.
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Przepustowość a opóźnienie
• Załóżmy, że chcemy przetransportować 40 osób na odległość
1000km
• Mamy do wyboru 2 pojazdy: samochód (4 osoby, 140 km/h)
oraz autobus (40 osób, 70 km/h)
Samochód:
• Opóźnienie (czas podróży):
≈ 7h 10min
• Przepustowość: ≈ 0.56
osoby/godz.
Autobus:
• Opóźnienie:
1000km/70km/h ≈
14h 17min
• Przepustowość: ≈ 2.8
osoby/godz.
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
CPU vs GPU
Rysunek :
GPU
Porównanie zapotrzebowania na energię przykładowego CPU i
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
CPU vs GPU
Theoretical peak (GFLOP/s)
5500
5000
GeForce GTX 780 TI
NVIDIA GPU SP
GeForce GTX TITAN
4500
4000
3500
GeForce GTX 680
3000
2500
2000
GeForce GTX 580
1500
1000
GeForce GTX 480
K20X
K40
GeForce GTX 280
GeForce 8800 GTX
NVIDIA GPU DP
Intel SP
Tesla C2075
Haswell
Intel DP
GeForce 7800 GTX
500
BloomfieldSandy Bridge Ivy Bridge
GeForce 6800 Ultra
Tesla C1060
Westmere
GeForce FX 5800 Prescott
Woodcrest
Harpertown
0 Willamette
2002 2004 2006 2008 2010 2012 2014
Release date
Porównanie teoretycznej wydajności CPU vs Nvidia GPU (Autor:
Michael Galloy)
Rysunek :
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Zastosowania GPU
• Ze względu na dużą wydajność w stosunku do zapotrzebowania na
energię GPU są obecenie wykorzystywane w większości najszybszych
superkomputerów (patrz top500.org)
• Tianhe-2 (nr 1 na w czerwcu 2014) złożony jest z 32000 procesorów Intel
Xeon E5-2692 (12 rdzeni) oraz 48000 koprocesorów Xeon Phi – moc
obliczeniowa 31 PFLOPS
• Titan (nr 2 w czerwcu 2014) zawiera procesorów 18688 AMD Opteron
6274 (16 rdzeni) oraz 18688 kart Nvidia Tesla K20X – moc obliczeniowa
17,59 PFLOPS
Rysunek :
Tianhe 2 (źródło: phys.org)
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
Model programowania GPU
• Heterogeniczny - obliczenia wykonywane na CPU oraz GPU
(kernele)
• CPU pełni rolę nadzorcy lub gospodarza (ang. host)
• GPU inaczej określany jest jako urządzenie (ang. device)
• GPU ma odrębną pamięć, stąd konieczne są operacje
transferu danych i wyników obliczeń RAM ⇔ GPU
• Programowanie GPU wymaga zastosowania dodatkowej
biblioteki / języka, np. CUDA, OpenCL
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
Początki programowania GPU
• W 2001 roku pojawił się układ GPU z serii GeForce 3 z
programowalnymi shaderami wierzchołków i pikseli
• Wykorzystywano udostępnianą przez DirectX, OpenGL oraz
Cg możliwość tworzenia własnych shaderów, czyli krótkich
programów do przetwarzania wierzchołków i pikseli
• Ten model pozwalał uzyskać istotne przyspieszenia w
niektórych zastosowaniach
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Shadery pikseli
• Jednostka cieniująca (shader) dla pikseli wyznacza kolor
piksela na podstawie położenia (x, y) piksela na ekranie i
dodatkowych informacji:
• kolorów tekstury
• współrzędnych teksturowych
• innych atrybutów przekazanych do shadera
• Szybko zauważono, że w miejsce kolorów można podstawić
inne dane numeryczne
• Dane wejściowe kodowane były w teksturze, a wyniki
odczytywane z kolorów poszczególnych pikseli wygenerowanej
tekstury
• Wady:
• ograniczone możliwości odczytu i zapisu danych (w kolorach
tekstur)
• ograniczone wsparcie dla liczb zmiennoprzecinkowych
• konieczna znajomość programowania grafiki, bibliotek
OpenGL, Direct3D
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Model programowania GPU – wady
• Do wad należało:
• programista musiał posiadać wiedzę na temat programowania
grafiki, w tym języka shaderów
• dane musiały być przekazywane w „nienaturalnej” postaci, tj.
współrzędnych wierzchołków, pikseli tekstur
• API nie udostępniało możliwości swobodnego odczytu / zapisu
pamięci, co istotnie ograniczało możliwe zastosowania
• brak obsługi obliczeń na liczbach zmiennoprzecinkowych
podwójnej precyzji dodatkowo ograniczał zastosowania
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Rozwój GPU – obliczenia ogólne
• W 2006 r. Nvidia wyprodukowała karty graficzne (architektura
G80) umożliwiające wykonywanie obliczeń ogólnego
przeznaczenia
• Wraz z kartami graficznymi z serii G80 udostępniona została
technologia CUDA (ang. Compute Unified Device
Architecture) umożliwiająca stosunkowo łatwe wykorzystanie
GPU do obliczeń ogólnego przeznaczenia
• Odpowiedzią ATI (AMD) jest AMD APP (Accelerated Parallel
Processing) SDK, który wspiera standard OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Model programowania CUDA
• Programy korzystające z CUDA pisane są w językach C1 ,
C++2 oraz Fortran
• W modelu CUDA procesor główny CPU stanowi tzw. procesor
macierzysty (ang. host)
• Procesor graficzny GPU nazywany jest urządzeniem (and.
device)
• Procesor graficzny złożony jest z tzw. wieloprocesorów (ang.
multiprocessors)
• Program uruchamiany jest na CPU, oznaczone funkcje
nazywane jądrami obliczeniowymi (ang. kernel) wykonywane
są przez GPU
1
Nie jest w pełni obsługiwany standard C99
Obsługiwany jest wybrany podzbiór C++ (host ISO14882:2003, na
urządzeniu podzbiór)
2
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
CUDA – kompilacja programu
Kod źródłowy programu
Kompilator NVCC
Kod hosta
Preprocesor,
kompilator,
linker
Kod urządzenia (PTX)
Kompilator just-in-time
urządzenia
Heterogeniczna platforma obliczeniowa
z CPU i GPU
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
CUDA – schemat wykonania programu
CPU - kod sekwencyjny
Kod równoległy na GPU
KernelA<<<nBIK, nTid>>>(args)
...
CPU - kod sekwencyjny
Kod równoległy na GPU
KernelA<<<nBIK, nTid>>>(args)
...
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Schemat wykonania typowego programu dla
GPU
• CPU alokuje pamięć na GPU
• CPU kopiuje dane wejściowe z RAM do pamięci GPU
• CPU uruchamia program (kernel) na GPU
• CPU kopiuje wynik z pamięci GPU do RAM
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
CUDA – podział pracy
• Kernel w modelu CUDA wykonywany jest równolegle przez
wiele wątków (ang. thread)
• Wszystkie wątki kernela należą do jednej kraty (ang. grid)
• Wątki wewnątrz kraty podzielone są na bloki
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
CUDA – podział pracy
• Podział na bloki wynika z
architektury GPU
• Wątki w bloku wykonywane
są na tym samym
wieloprocesorze
strumieniowym (SM)
• Wątek ma unikalny ID
wewnątrz bloku
• Blok ma unikalne ID
wewnątrz kraty
Host
Device
Grid 1
Kernel
1
Block
(0, 0)
Block
(1, 0)
Block
(2, 0)
Block
(0, 1)
Block
(1, 1)
Block
(2, 1)
Grid 2
Kernel
2
Block (1, 1)
Thread Thread Thread Thread Thread
(0, 0)
(1, 0)
(2, 0)
(3, 0)
(4, 0)
Thread Thread Thread Thread Thread
(0, 1)
(1, 1)
(2, 1)
(3, 1)
(4, 1)
Thread Thread Thread Thread Thread
(0, 2)
(1, 2)
(2, 2)
(3, 2)
(4, 2)
9
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
CUDA – wątek
• Wątek to niezależny przepływ sterowania, ma:
• identyfikator (ang. thread ID) unikalny wewnątrz bloku
• wskaźnik instrukcji (ang. program counter)
• wartości rejestrów
• lokalną, prywatną pamięć
• dane wejściowe i wyniki obliczeń
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
CUDA – blok
• Wątki w bloku wykonywane
są na tym samym procesorze
(SM)
• Wątki w ramach bloku mają
dostęp do współdzielonej
pamięci – możliwa
bezpośrednia komunikacja
• Mogą być synchronizowane
za pomocą lokalnych blokad
• Wątki w ramach bloku
dzielone są na tzw. osnowy
(ang. warp)
Blok watków
Lokalna
pamięć bloku
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
CUDA – SIMT
• Wątki w ramach bloku CUDA wykonywane są w modelu
SIMT (ang. single instruction multiple thread) – odpowiednik
modelu SIMD znanego z klasycznych procesorów
• Wszystkie wątki w ramach warpu
wykonują tę samą instrukcję, ale dla różnych danych
a
SISD
b
a1 a2
b1 b2
+
+
c
c1 c2
SIMD
szer = 2
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
CUDA – SIMT
• SIMT powoduje, że każde
rozgałęzienie w kodzie
skutkuje bezczynnością
części wątków
n = ...
Branch
if
(n>0)
• W celu zapewnienia dobrej
wydajności należy
eliminować rozgałęzienia w
ramach warpu (32 wątki),
ale niekoniecznie w ramach
bloku
Ścieżka
Path AA
Ścieżka
Path BB
Architektura GPU
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
CUDA – kraty
• Krata złożona jest z bloków, wykonujących ten sam kernel
• Bloki w kracie mają dostęp do pamięci globalnej – zmiany
widoczne po synchronizacji
• Bloki wewnątrz kraty muszą być niezależne - dowolna
kolejność wykonania bloków, również sekwencyjnie
• Niezależność wykonania bloków poprawia skalowalność
• Możliwa jest komunikacja między blokami, ale nie
synchronizacja
Krata 0
Krata 1
Pamięć
globalna
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Architektura GPU na przykładzie Nvidia
• Rozwój technologiczny powoduje, że architektury
programowalnych kart graficznych podlegają częstym zmianom
• Lista architektur GPU Nvidia obejmuje (od najstarszej):
•
•
•
•
Tesla (2007)
Fermi (2010)
Kepler (2012)
Maxwell (2014)
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
Architektura GPU na przykładzie Nvidia
Fermi
Rysunek : Schemat GPU w
architekturze Nvidia Fermi
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Architektura GPU na przykładzie Nvidia
Fermi
• 3 miliardy tranzystorów
• 16 multiprocesorów (SM) x 32 rdzeni CUDA = 512
• 6 GB pamięci RAM (GDDR5)
• 384 bitowa szyna pamięci
• Połączenie CPU – GPU za pomocą PCI-Express
• Moduł GigaThread pełni rolę planisty przydzielającego bloki
wątków do poszczególnych SM
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Nvidia Fermi – multiprocesor strumieniowy
• Multiprocesor strumieniowy zawiera 32 rdzenie CUDA
• Każdy zawiera jednostę ALU oraz FPU (ang. Floating Point
Unit)
• W pojedynczym cyklu zegara wykonywane są operacje
arytmetyczne na liczbach całkowitych 32-bitowych oraz
zmiennoprzecinkowych pojedynczej precyzji
• W poprzedniej generacji mnożenie l. całk. miało tylko 24
bitową precyzję (w jednym cyklu)
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Nvidia Fermi – multiprocesor strumieniowy
• LD/ST – jednostki odczytu /
zapisu danych dla poszczególnych
wątków (DRAM, cache)
• SFU – jednostki do obliczania
funkcji takich jak sin, cos,
odwrotność, pierw. kwadratowy –
łącznie 4 instr. cykl, 8 cykli na
warp
• jeden SM może wykonać 16
operacji zmiennoprzecinkowych
podwójnej precyzji / cykl
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Nvidia Fermi – planista SM
• SM wyposażony jest w 2
planistów (ang. warp scheduler)
• SM może jednocześnie
wykonywać 2 grupy (osnowy, ang.
warp) po 32 wątków
• Instrukcje z obu warpów są
przydzielane do odpowiednich
jednostek ALU/FPU (po 16) oraz
SFU i LD/ST
• Operacje na liczbach podwójnej
precyzji z jednej osnowy nie mogą
być wykonywane jednocześnie z
instrukcją drugiej osnowy
Architektura GPU
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Nvidia Fermi – pamięć SM
• SM wyposażony jest w 64kB konfigurowalnej pamięci
• 16kB pamięci współdzielonej + 48kB pamięci podręcznej 1
poziomu (L1)
• 48kB pamięci współdzielonej + 16kB pamięci podręcznej 1
poziomu
• Pamięć podręczna ma na celu wyeliminowanie opóźnień
wynikających z konieczności transferu danych z pamięci
głównej urządzenia oraz hosta
• Wątki wykonywane na SM mogą się efektywnie komunikować
za pomocą pamięci współdzielonej
• Opóźnienie pamięci współdzielonej to średnio 10-20 cykli
• Przepustowość 1600 GB/s
• Karta wyposażona jest również w pamięć podręczną drugiego
poziomu 768kB – opóźnienie 400–800 cykli
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Nvidia Fermi – porównanie architektur
GPU
G80
GT200
Fermi
Tranzystory
CUDA cores
DFLOPS
SFLOPS
SFU
Planiści na SM
Pamięć współdzielona SM
L1 cache
L2 cache
Pamięć z ECC
Adresowanie
681 mln
128
128 op./cykl
2
1
16 kB
Nie
32-bitowe
1.4 mld
240
30 op. / cykl
240 op./cykl
2
1
16 kB
Nie
32-bitowe
3 mld
512
256 op. / cykl
512 op./cykl
4
2
16 kB / 48 kB
16 kB / 48 kB
768 kB
Tak
64-bitowe
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Nvidia Kepler
• 7,1 mld tranzystorów
• 1 Tflop operacji na liczbach
zmiennoprzecinkowych
podwójnej precyzji (Kepler
GK110)
• Większa efektywność
energetyczna, tj. stosunek
liczby operacji na wat (ok 3
razy w stosunku do Fermi)
Rysunek :
Nvidia Kepler GK110 GPU
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Nvidia Kepler
Rysunek :
Schemat procesora GK110
Architektura GPU
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Nvidia Kepler – multiprocesor strumieniowy
• 192 rdzenie CUDA (6x więcej od
Fermi)
• 64 jednostki zmiennoprzecinkowe
podwójnej precyzji
• 32 SFU
• 32 jednostki adresowe (LD/ST)
• 4x planista umożliwiający jednoczene
wykonywanie do 4 warpów (po 32
wątki)
• Instrukcje na liczbach podówjnej
precyzji mogą być wykonywane
jednocześnie z innymi
• Liczba rejestrów na wątek
zwiększona do 255 (4x więcej od
Fermi)
• Pamięć podręczna L2 1536KB (2 x
więcej od Fermi)
• Pamięć podręczna i współdzielona w
przeliczeniu na rdzenie uległa
zmniejszeniu
Multiprocesor strumieniowy
(SMX) w GPU Kepler
Rysunek :
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
Fermi GF104
Kepler GK110
Nvidia Kepler vs Fermi
L. warpów na SM
L. wątków na SM
L. bloków wątków na SM
Rejestry 32-bitowe
Rejestry / wątek
Wątki na blok
Pamięć współdzielona
Maks. wymiar kraty
48
1536
8
32768
63
1024
16K/48K
2ˆ16-1
64
2048
16
65536
255
1024
16K/32K/64K
2ˆ32-1
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Wydajność maksymalna a praktyczna
• GPU cechują się bardzo dużą wydajnością teoretyczną
mierzoną FLOPS
• W praktyce jednak wydajność jest mniejsza od teoretycznej,
co wynika z bardzo wielu czynników, m.in.
• Stopnia równoległości obliczeń w programie
• Rodzaju obliczeń, w tym stopnia heterogeniczności, liczby
rozgałęzień
• Opóźnień wynikających z transferu danych we / wy
• Przykładowo, dla problemu mnożenia macierzy i „ręcznie”
optymalizowanego kodu assemblerowego osiągnięto wydajność
ok. 77.3% teoretycznej na GPU Kepler GK1043
3
Lai, Junjie, and Andre Seznec. ”Performance upper bound analysis and
optimization of sgemm on fermi and kepler gpus.” Code Generation and
Optimization (CGO), 2013 IEEE/ACM International Symposium on. IEEE,
2013.
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Nvidia Compute Capability
• Każda karta Nvidii ma określony tzw. Compute Capability w
postaci numeru wersji, np. 2.1
• Jest to specyfikacja określająca architekturę karty, m.in.
liczbę rdzeni na SM, maks. liczbę wątków, bloków, rejestrów
• Compute Capability może być stosowany przez programy do
sprawdzenia możliwości obliczeniowych dostępnych kart
graficznych w sposób usystematyzowany
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
OpenCL
OpenCL to:
• Platforma programistyczna do tworzenia aplikacji działających
na platformach sprzętowych złożonych z procesorów (CPU),
kart graficznych (GPU)
• Architektura podobna do CUDA – w większości przypadków
istnieją bezpośrednie odpowiedniki dla poszczególnych metod,
typów danych itp.
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
OpenCL – historia
• Autorem OpenCL jest Apple, które posiada prawa do nazwy
• Apple przesłało propozycję przekształcenia OpenCL w otwarty
standard do konsorcjum Khronos Group
• Do grupy pracującej nad OpenCL należą m.in. Nvidia, AMD,
Intel, IBM
• Specyfikacja dla OpenCL 1.0 została udostępniona w 2008
roku
• Wersja OpenCL 1.1 została udostępniona w 2010 r.
• Wersja OpenCL 1.2 została udostępniona w 2011 r.
• W 2013 roku wydano OpenCL 2.0
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
WebCL
• W 2014 roku udostępniono wersję 1.0 nowej specyfikacji
WebCL, która rozszerza HTML5 o możliwość wykonywania
kosztownych obliczeniowo zadań za pomocą GPU i innych
urządzeń wspierających OpenCL
• Definiuje sposób wykorzystania OpenCL z poziomu JavaScript
• W ramach OpenCL 1.0 udostępniono translator umożliwiający
konwersję kodu OpenCL do WebCL
• Standard wspierany jest m.in. przez Adobe, AMD, Aptina,
ARM, Google, Imagination Technologies, Mozilla, Intel,
Nokia, NVIDIA, Opera Software, Samsung, and Qualcomm
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
OpenCL
OpenCL umożliwia tworzenie oprogramowania działającego na platformach
wyposażonywch w heterogeniczne jednostki obliczeniowe, takie jak:
•
•
•
•
procesory ogólnego przeznaczenia (ang. Central Processing Unit, CPU)
karty graficzne (ang. Graphic Processing Units, GPU)
procesory sygnałowe (DSP)
układy FPGA (ang. Field Programmable Gate Array) - cyfrowe
programowalne układy logiczne
• dedykowane koprocesory do obliczeń równoległych (np. Intel Xeon Phi)
Rysunek :
Intel Xeon Phi
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
OpenCL
Parametr
Cores
Logical Cores
Frequency
GFLOPs (double)
SIMD width
Memory
Memory B/W
Threading
Nazwa urządzenia
Xeon E5-2670
Xeon Phi 5110P
Tesla K20X
8
16 (HT)
2.60GHz
333
256 Bits
16-128GB
51.2GB/s
software
60
240 (HT)
1.053GHz
1,010
512 Bits
8GB
320GB/s
software
14 SMX
2,688 CUDA cores
735MHz
1,317
N/A
6GB
250GB/s
hardware
Porównanie przykładowych platform sprzętowych: CPU –
koprocesor – GPU
Tabela :
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
CUDA czy OpenCL
• CUDA jest bardziej popularna – więcej dokumentacji,
przykładów, programów
• W większości przypadków obie technologie pozwalają
uzyskać podobną wydajność4
• OpenCL to otwarty standard wspierany przez wiele firm,
włączając Nvidię
• OpenCL oferuje większą przenośność kodu pomiędzy różnymi
platformami
4
Fang, Jianbin, Ana Lucia Varbanescu, and Henk Sips. ”A comprehensive
performance comparison of CUDA and OpenCL.” Parallel Processing (ICPP),
2011 International Conference on. IEEE, 2011.
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
Perspektywy
• Intel planuje sprzedaż procesora Xeon z zintegrowanym
układem FPGA, który umożliwia przyspieszenie wybranych
zadań nawet do 20x (nie zweryfikowane)
• Microsoft zastosował układy FPGA (Startix V) do
przyspieszenia działania serwerów Bing – poprawiono
przepustowość fragmentu systemu odpowiedzialnego za
obliczanie rangi indeksowanych dokumentów o 95% przy
zwiększeniu zapotrzebowania na energię elektryczną o 10%5
5
Putnam A. i in. (23 osoby), A Reconfigurable Fabric for Accelerating
Large-Scale Datacenter Services, 41st Annual International Symposium on
Computer Architecture (ISCA), 2014.
OpenCL
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
Trudności programowania GPU
• Problem z kompatybilnością kodu – np. CUDA działa na
kartach Nvidia, ale nie ATI
• Mnogość modeli kart graficznych – uzyskanie najlepszej
wydajności wymaga często „ręcznej” optymalizacji dla
konkretnego modelu
• Programowanie dla GPU wymaga dobrej znajomości
architektury i jest w pewnym sensie „niskopoziomowe”
• Trudniejsze debugowanie programów dla GPU
• Wykorzystanie mocy GPU wymaga odpowiednich algorytmów
• Rozwój standardów i bibliotek z pewnością zniweluje
dużą część ww problemów
Wprowadzenie
Historia rozwoju GPU
Model programowania GPU
CUDA
Architektura GPU
OpenCL
C++ AMP
• W 2012 roku Microsoft opublikował otwartą specyfikację dla
C++ AMP (Accelerated Massive Parallelism) – rozszerzenie
dla C++ plus biblioteka programistyczna (na wzór STL)
• Umożliwia tworzenie programów, w których część
obliczeń wykonywana jest na GPU
• C++ AMP wykorzystuje DirectX11 i działa na Windows 7 i
nowszych
1
2
3
4
5
6
7
8
void AddArrays(int n, int m, int * pA, int * pB, int * pSum) {
concurrency::array_view<int,2> a(n, m, pA), b(n, m, pB), sum(n, m
, pSum);
concurrency::parallel_for_each(sum.extent,
[=](concurrency::index<2> i) restrict(amp)
{
sum[i] = a[i] + b[i];
});
}

Podobne dokumenty