Plan Szkolenia
Wprowadzenie do obliczeń przyspieszanych z wykorzystaniem GPU
- Obliczenia hybrydowe i architektura CPU-GPU.
- Przestrzenie wykonawcze i pamięciowe w technologii CUDA.
- Kompilacja kodu CUDA C++ za pomocą kompilatora nvcc i systemu CMake.
- Weryfikacja środowiska programistycznego dla GPU.
Algorytmiki równoległe z wykorzystaniem Thrust i CUB
- Sorotowanie, redukcja i transformacja przyspieszane przez GPU.
- Refaktoryzacja algorytmik STL pod kątem wykonania na GPU.
- Wektory urządzeniowe Thrust i polityki wykonawcze.
- Pierwszorzędne operacje CUB (device-wide primitives) dla niestandardowych potoków danych.
Architektura pamięci GPU i zarządzanie nią
- Typy pamięci globalnej, stałej i teksturowej.
- Jawna alokacja transferu i danych w pamięci urządzenia (device memory).
- Zjednoczona pamięć (Unified Memory) upraszczająca dostęp do danych.
- Koaalescencja pamięci i optymalizacja wzorców dostępu.
Asynchroniczne wykonanie za pomocą strumieni CUDA
- Tworzenie i zarządzanie strumieniami CUDA.
- Nakładanie wykonywania jąder na transfery danych.
- Zdarzenia CUDA do zarządzania zależnościami.
- Priorytety strumieni i optymalizacja współbieżności.
Pisanie niestandardowych jąder CUDA
- Model programowania SIMT i wykonywanie w obrębie warpów.
- Konfiguracja uruchamiania jąder i pętle z krokiem rozmiaru siatki (grid-stride loops).
- Indeksowanie wątków i wielowymiarowe siatki.
- Obsługa błędów i sprawdzania API środowiska CUDA (CUDA runtime API).
Hierarchia wątków i model wykonawczy
- Siatki, bloki i wątki w kodzie wykonywanym na urządzeniu.
- Operacje i operacje pierwszorzędne na poziomie warpów (ballot operations).
- Synchronizacja i bariery na poziomie bloków.
- Analiza wykorzystania zasobów i obciążenia (occupancy).
Kooperacyjne grupy dla elastycznego równoległości
- API cooperative_groups i typy grup.
- Płyty bloków wątków (thread-block tiles) i podział tiled_partition.
- Uruchamianie kooperacyjne na poziomie siatki.
- Wzorce synchronizacji między wieloma siatkami.
Techniki optymalizacji pamięci współdzielonej
- Banki pamięci współdzielonej i unikanie konfliktów banków.
- Strategie tilingu dla operacji macierzowych.
- Pamięć współdzielona jako zarządzana przez użytkownika pamięć podręczna.
- cuda::shared_memory_mdspan dla wielowymiarowych widoków danych.
Łączenie jąder (Kernel Fusion) i zaawansowane wzorce równoległości
- Fuzja wielu jąder w celu zmniejszenia nakładu na ich uruchamianie.
- Algorytmiki skanowania, redukcji według klucza oraz algorytmiki segmentowane.
- Operacje atomowe i bezkluczowe struktury danych.
- Atematy agregowane dla warpów zwiększające przepustowość.
Profilowanie i optymalizacja z wykorzystaniem Nsight Systems
- Analiza osi czasu aktywności procesora CPU i GPU.
- Identyfikacja wąskich gardeł w transferach danych.
- Profilowanie wydajności jąder i obciążenia (occupancy).
- Iteracyjne optymalizacje z wykorzystaniem narzędzia Nsight Compute.
Nowoczesne cechy C++ w kodzie wykonywanym na urządzeniu (CUDA Device Code)
- Wyrażenia lambda, constexpr i auto w jądrach CUDA.
- Algorytmiki równoległe C++17 i polityki wykonawcze.
- Koncepcje (concepts) i zakresy (ranges) z C++20 w kodzie na urządzeniu.
- Wsparcie dla C++23 w kompilatorze nvcc oraz CCCL 3.x.
Grafy CUDA i zaawansowana asynchroniczność
- Definiowanie i uruchamianie grafów CUDA.
- Zapisywanie (capture) z wykonania strumienia do grafu.
- Aktualizacja grafu i węzły warunkowego wykonania.
- Zmniejszenie opóźnień uruchamiania dla zadań iteracyjnych.
Wzorce integracji z istniejącymi aplikacjami
- Owijanie kodu GPU za pomocą interfejsów C++.
- Zarządzanie wieloma GPU oraz systemami NUMA.
- Integracja systemu kompilacji z użyciem CMake i CUDA.
- Debugowanie kodu na urządzeniu za pomocą cuda-gdb.
Podsumowanie i najlepsze praktyki
- Wybór między Thrust, CUB a niestandardowymi jądrami CUDA.
- Przenośność wydajnościowa między architekturami GPU.
- Organizacja kodu i RAII (Resource Acquisition Is Initialization) dla zasobów CUDA.
- Następne kroki oraz ścieżki zaawansowanej nauki technologii CUDA.
Wymagania
- Podstawowa kompetencja w C++, obejmująca wyrażenia lambda, szablony i STL.
- Znajomość standardowych algorytmik, kontenerów i iteratorów.
- Umiejętność używania pętli, instrukcji warunkowych i funkcji.
- Brak wymogu wcześniejszej znajomości technologii CUDA ani programowania GPU.
Grupa docelowa
- Deweloperzy C++, którzy chcą przyspieszyć obciążające CPU aplikacje z wykorzystaniem GPU.
- Inżynierowie oprogramowania przechodzący od programowania wyłącznie na CPU do hybrydowego, równoległego programowania.
- Inżynierowie wydajności i deweloperzy kwantytatywni pracujący z dużymi zbiorami danych.
Opinie uczestników (4)
Początkowo tempo prowadzącego wydawało mi się nieco zbyt szybkie, ale po przekazaniu informacji zwrotnej podczas szkolenia, przyjął to do wiadomości i zwolnił tempo, nie pomijając żadnej części wykładu. Dobry kontakt z publicznością, bardzo przyjazny i otwarty na dyskusje.
Alexandru Ostafi - Siemens
Szkolenie - Advanced C++ : Practical workshop
Przetłumaczone przez sztuczną inteligencję
Szczegółowe wyjaśnienie, subtelne powtórzenie punktów, które naprawdę doskonale przekazało wiedzę. Gotowość Rода do podwójnego sprawdzenia nietypowych i złożonych pytań, które zadawaliśmy, aby być pewnym, że jego odpowiedzi były 100% poprawne. Ponadto, jego zainteresowanie dyskusją na temat zalet i wad alternatywnych stylów kodowania, dzięki czemu nie tylko nauczyliśmy się, jak używać C++ w zamierzonej sposób, ale także dlaczego powinniśmy to robić w ten sposób.
Nick Dillon - cellxica Ltd
Szkolenie - Using C++ in Embedded Systems - Applying C++11/C++14
Przetłumaczone przez sztuczną inteligencję
Dzielenie się doświadczeniem, wiedzą nauczyciela i cennymi przemyśleniami.
Carey Fan - Logitech
Szkolenie - C/C++ Secure Coding
Przetłumaczone przez sztuczną inteligencję
ilość wiedzy