CUDA w przykładach. Wprowadzenie do ogólnego programowania procesorów GPU

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Opis książki Książka ta jest obowiązkową pozycją dla wszystkich programistów pracujących z systemami zawierającymi akceleratory. Ze wstępu autorstwa Jacka Dongarry’ego, Uniwersytet Tennessee i Oak Ridge National Laboratory Od astrofizyki i chemii, przez biologię obliczeniową, aż po analizę sejsmiczną i rekonstrukcję obrazu w tomografii komputerowej - architektura CUDA została entuzjastycznie przyjęta przez środowiska naukowe i akademickie. Znalazła też zastosowanie w wielu strategicznych gałęziach gospodarki i stała się niezwykłym ułatwieniem dla twórców programów równoległych, którym pozwoliła na wykorzystanie olbrzymiej mocy procesorów GPU do budowy ekstremalnie wydajnych aplikacji. Oto podręcznik napisany przez członków zespołu tworzących architekturę CUDA. Stanowi on wyczerpujące wprowadzenie w świat programowania najnowszych akceleratorów o dużych możliwościach przetwarzania równoległego. Oparty na licznych przykładach, zilustrowany fragmentami przydatnego kodu przewodnik zawiera pełny opis tej platformy, wprowadzenie do języka CUDA C oraz szczegółowy opis wszystkich kluczowych technik pracy z tą niezwykłą architekturą. Programowanie równoległe Współpraca wątków Pamięć stała i zdarzenia Pamięć teksturowa Interoperacyjność grafiki Operacje atomowe Strumienie CUDA C na wielu procesorach GPU Operacje atomowe dla zaawansowanych Dodatkowe zasoby CUDA Opanuj język CUDA C i pisz programy wyróżniające się niezwykłą wydajnością! Jason Sanders jest starszym programistą w zespole ds. platformy CUDA w firmie NVIDIA. Brał udział w pracach nad pierwszymi wersjami oprogramowania systemowego CUDA. Ma także ma swój wkład w specyfikację OpenCL 1.0. Zanim rozpoczął pracę w NVIDIA, pracował dla firm ATI Technologies, Apple oraz Novell. Edward Kandrot jest starszym programistą w zespole ds. algorytmów CUDA w firmie NVIDIA. Przedtem pracował nad wydajnością programów takich firm, jak Adobe, Microsoft, Google czy Autodesk.

Author(s): Jason Sanders, Edward Kandrot
Publisher: Helion
Year: 2012

Language: Polish

Spis treści
Słowo wstępne (9)
Przedmowa (11)
Podziękowania (13)
O autorach (15)
1. Dlaczego CUDA? Dlaczego teraz? (17)
1.1. Streszczenie rozdziału (17)
1.2. Era przetwarzania równoległego (17)
1.2.1. Procesory CPU (18)
1.3. Era procesorów GPU (19)
1.3.1. Historia procesorów GPU (19)
1.3.2. Początki programowania GPU (20)
1.4. CUDA (21)
1.4.1. Co to jest architektura CUDA (21)
1.4.2. Używanie architektury CUDA (22)
1.5. Zastosowania technologii CUDA (22)
1.5.1. Obrazowanie medyczne (22)
1.5.2. Symulacja dynamiki płynów (23)
1.5.3. Ochrona środowiska (24)
1.6. Podsumowanie (25)
2. Konfiguracja komputera (27)
2.1. Streszczenie rozdziału (27)
2.2. Środowisko programistyczne (27)
2.2.1. Procesor graficzny z obsługą technologii CUDA (28)
2.2.2. Sterownik urządzeń NVIDII (29)
2.2.3. Narzędzia programistyczne CUDA (30)
2.2.4. Standardowy kompilator języka C (31)
2.3. Podsumowanie (32)
3. Podstawy języka CUDA C (33)
3.1. Streszczenie rozdziału (33)
3.2. Pierwszy program (33)
3.2.1. Witaj, świecie! (34)
3.2.2. Wywoływanie funkcji jądra (34)
3.2.3. Przekazywanie parametrów (35)
3.3. Sprawdzanie właściwości urządzeń (38)
3.4. Korzystanie z wiedzy o właściwościach urządzeń (42)
3.5. Podsumowanie (43)
4. Programowanie równoległe w języku CUDA C (45)
4.1. Streszczenie rozdziału (45)
4.2. Programowanie równoległe w technologii CUDA (45)
4.2.1. Sumowanie wektorów (46)
4.2.2. Zabawny przykład (52)
4.3. Podsumowanie (60)
5. Wątki (61)
5.1. Streszczenie rozdziału (61)
5.2. Dzielenie równoległych bloków (61)
5.2.1. Sumowanie wektorów - nowe spojrzenie (62)
5.2.2. Generowanie rozchodzących się fal za pomocą wątków (68)
5.3. Pamięć wspólna i synchronizacja (72)
5.3.1. Iloczyn skalarny (74)
5.3.2. Optymalizacja (niepoprawna) programu obliczającego iloczyn skalarny (82)
5.3.3. Generowanie mapy bitowej za pomocą pamięci wspólnej (84)
5.4. Podsumowanie (87)
6. Pamięć stała i zdarzenia (89)
6.1. Streszczenie rozdziału (89)
6.2. Pamięć stała (89)
6.2.1. Podstawy techniki śledzenia promieni (90)
6.2.2. Śledzenie promieni na GPU (91)
6.2.3. Śledzenie promieni za pomocą pamięci stałej (96)
6.2.4. Wydajność programu a pamięć stała (97)
6.3. Mierzenie wydajności programów za pomocą zdarzeń (99)
6.3.1. Pomiar wydajności algorytmu śledzenia promieni (100)
6.4. Podsumowanie (103)
7. Pamięć tekstur (105)
7.1. Streszczenie rozdziału (105)
7.2. Pamięć tekstur w zarysie (105)
7.3. Symulacja procesu rozchodzenia się ciepła (106)
7.3.1. Prosty model ogrzewania (106)
7.3.2. Obliczanie zmian temperatury (108)
7.3.3. Animacja symulacji (110)
7.3.4. Użycie pamięci tekstur (114)
7.3.5. Użycie dwuwymiarowej pamięci tekstur (117)
7.4. Podsumowanie (121)
8. Współpraca z bibliotekami graficznymi (123)
8.1. Streszczenie rozdziału (124)
8.2. Współpraca z bibliotekami graficznymi (124)
8.3. Generowanie rozchodzących się fal za pomocą GPU i biblioteki graficznej (130)
8.3.1. Struktura GPUAnimBitmap (130)
8.3.2. Algorytm generujący fale na GPU (133)
8.4. Symulacja rozchodzenia się ciepła za pomocą biblioteki graficznej (135)
8.5. Współpraca z DirectX (139)
8.6. Podsumowanie (139)
9. Operacje atomowe (141)
9.1. Streszczenie rozdziału (141)
9.2. Potencjał obliczeniowy (141)
9.2.1. Potencjał obliczeniowy procesorów GPU NVIDII (142)
9.2.2. Kompilacja dla minimalnego potencjału obliczeniowego (144)
9.3. Operacje atomowe w zarysie (144)
9.4. Obliczanie histogramów (146)
9.4.1. Obliczanie histogramu za pomocą CPU (146)
9.4.2. Obliczanie histogramu przy użyciu GPU (148)
9.5. Podsumowanie (156)
10. Strumienie (157)
10.1. Streszczenie rozdziału (157)
10.2. Pamięć hosta z zablokowanym stronicowaniem (158)
10.3. Strumienie CUDA (162)
10.4. Używanie jednego strumienia CUDA (162)
10.5. Użycie wielu strumieni CUDA (166)
10.6. Planowanie pracy GPU (171)
10.7. Efektywne wykorzystanie wielu strumieni CUDA jednocześnie (173)
10.8. Podsumowanie (175)
11. Wykonywanie kodu CUDA C jednocześnie na wielu GPU (177)
11.1. Streszczenie rozdziału (177)
11.2. Pamięć hosta niewymagająca kopiowania (178)
11.2.1. Obliczanie iloczynu skalarnego za pomocą pamięci niekopiowanej (178)
11.2.2. Wydajność pamięci niekopiowanej (183)
11.3. Użycie kilku procesorów GPU jednocześnie (184)
11.4. Przenośna pamięć zablokowana (188)
11.5. Podsumowanie (192)
12. Epilog (193)
12.1. Streszczenie rozdziału (194)
12.2. Narzędzia programistyczne (194)
12.2.1. CUDA Toolkit (194)
12.2.2. Biblioteka CUFFT (194)
12.2.3. Biblioteka CUBLAS (195)
12.2.4. Pakiet GPU Computing SDK (195)
12.2.5. Biblioteka NVIDIA Performance Primitives (196)
12.2.6. Usuwanie błędów z kodu CUDA C (196)
12.2.7. CUDA Visual Profiler (198)
12.3. Literatura (199)
12.3.1. Książka Programming Massively Parallel Processors: A Hands-on Approach (199)
12.3.2. CUDA U (199)
12.3.3. Fora NVIDII (200)
12.4. Zasoby kodu źródłowego (201)
12.4.1. Biblioteka CUDA Parallel Primitives Library (201)
12.4.2. CULATools (201)
12.4.3. Biblioteki osłonowe (202)
12.5. Podsumowanie (202)
A: Operacje atomowe dla zaawansowanych (203)
A.1. Iloczyn skalarny po raz kolejny (203)
A.1.1. Blokady atomowe (205)
A.1.2. Iloczyn skalarny: blokady atomowe (207)
A.2. Implementacja tablicy skrótów (210)
A.2.1. Tablice skrótów - wprowadzenie (210)
A.2.2. Tablica skrótów dla CPU (212)
A.2.3. Wielowątkowa tablica skrótów (216)
A.2.4. Tablica skrótów dla GPU (217)
A.2.5. Wydajność tablicy skrótów (223)
A.3. Podsumowanie (224)
Skorowidz (225)