Bądźmy w kontakcie

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.
 8 godzin

Liczba uczestników


Cena za uczestnika (netto)

Opinie uczestników (4)

Propozycje terminów

Powiązane Kategorie