Struttura del corso
Introduzione al Calcolo Accelerato con GPU
- Calcolo eterogeneo e architettura CPU-GPU.
- Spazi di esecuzione e memoria di CUDA.
- Compilazione del codice C++ CUDA con nvcc e CMake.
- Verifica dell'ambiente di sviluppo GPU.
Algoritmi Paralleli con Thrust e CUB
- Ordinamento, riduzione e trasformazione accelerati dalle GPU.
- Rifattorizzazione degli algoritmi STL per l'esecuzione su GPU.
- Vettori dispositivo Thrust e policy di esecuzione.
- Primitivi device-wide CUB per pipeline personalizzate.
Architettura e Gestione della Memoria GPU
- Tipi di memoria globale, costante e texture.
- Allocazione esplicita e trasferimenti della memoria dispositivo.
- Unified Memory per un accesso semplificato ai dati.
- Mischiatura della memoria (memory coalescing) e ottimizzazione dei pattern di accesso.
Esecuzione Asincrona con Stream CUDA
- Creazione e gestione degli stream CUDA.
- Sovrapposizione dell'esecuzione dei kernel con i trasferimenti di dati.
- Eventi CUDA per la gestione delle dipendenze.
- Priorità degli stream e ottimizzazione della concorrenza.
Scrittura di Kernel CUDA Personalizzati
- Il modello di programmazione SIMT e l'esecuzione dei warp.
- Configurazione del lancio dei kernel e loop grid-stride.
- Indicizzazione dei thread e griglie multidimensionali.
- Gestione degli errori e verifiche dell'API runtime CUDA.
Gerarchia dei Thread e Modello di Esecuzione
- Grid, blocchi e thread nel codice dispositivo.
- Primitivi a livello di warp e operazioni di votazione (ballot operations).
- Sincronizzazione a livello di blocco e barriere.
- Analisi dell'occupazione e del utilizzo delle risorse.
Gruppi Cooperativi per Parallelismo Flessibile
- L'API cooperative_groups e i tipi di gruppo.
- Tiles dei thread-block e tiled_partition.
- Lanci cooperativi a livello di grid.
- Pattern di sincronizzazione multi-grid.
Tecniche di Ottimizzazione della Memoria Condivisa
- Banche della memoria condivita ed evitare i conflitti tra banche.
- Strategie di tiling per le operazioni sulle matrici.
- Memoria condivisa come cache gestita dall'utente.
- cuda::shared_memory_mdspan per visualizzazioni multidimensionali.
Fusione dei Kernel e Pattern Avanzati di Parallelismo
- Fusione di più kernel per ridurre il sovraccarico di lancio.
- Scan, reduce-by-key e algoritmi segmentati.
- Operazioni atomiche e strutture dati senza lock.
- Atomics aggregati a livello di warp per aumentare il throughput.
Profilazione e Ottimizzazione con Nsight Systems
- Analisi cronologica dell'attività della CPU e della GPU.
- Identificazione dei colli di bottiglia nei trasferimenti di memoria.
- Profilazione delle prestazioni del kernel e dell'occupazione.
- Ottimizzazione iterativa con Nsight Compute.
Caratteristiche C++ Moderne nel Codice Dispositivo CUDA
- Lambda, constexpr e auto nei kernel.
- Algoritmi paralleli C++17 e policy di esecuzione.
- Concept e ranges C++20 sul dispositivo.
- Supporto C++23 in nvcc e CCCL 3.x.
CUDA Graphs e Asincronia Avanzata
- Definizione e lancio di CUDA Graphs.
- Acquisizione delle graph dall'esecuzione degli stream.
- Aggiornamento delle graph e nodi di esecuzione condizionale.
- Riduzione della latenza di lancio per carichi di lavoro iterativi.
Pattern di Integrazione per Applicazioni Esistenti
- Avvolgimento del codice GPU dietro interfacce C++.
- Gestione di sistemi multi-GPU e NUMA.
- Integrazione nel sistema di build con CMake e CUDA.
- Debugging del codice dispositivo con cuda-gdb.
Riepilogo e Best Practices
- Scegliere tra Thrust, CUB e kernel personalizzati.
- Portabilità delle prestazioni tra diverse architetture GPU.
- Organizzazione del codice e RAII per le risorse CUDA.
- Prossimi passi e percorsi di apprendimento avanzati CUDA.
Requisiti
- Competenza base in C++, incluse espressioni lambda, template e STL.
- Conoscenza degli algoritmi standard, dei contenitori e degli iteratori.
- Confidenza con cicli, condizioni e funzioni.
- Nessuna conoscenza pregressa di CUDA o programmazione GPU richiesta.
Pubblico Target
- Sviluppatori C++ che cercano di accelerare applicazioni intensive con le GPU.
- Ingegneri del software che passano da una programmazione solo su CPU a una parallela eterogenea.
- Ingegneri delle prestazioni e sviluppatori quantitativi che lavorano con grandi set di dati.
Recensioni (3)
Spiegazione dettagliata, ripetizione sottile dei punti che ha davvero consolidato la conoscenza. La volontà di Rod di verificare le domande occasionalmente oscure che abbiamo sollevato, per essere sicuro che le sue risposte fossero al 100% corrette. Inoltre, il suo interesse nel discutere i pro e i contro di stili di codifica alternativi, in modo che non solo imparassimo come usare C++ nel modo previsto, ma anche perché dovrebbe essere fatto in quel modo.
Nick Dillon - cellxica Ltd
Corso - Using C++ in Embedded Systems - Applying C++11/C++14
Traduzione automatica
Condivisione di esperienze, competenze e conoscenze preziose del docente.
Carey Fan - Logitech
Corso - C/C++ Secure Coding
Traduzione automatica
Il fatto che fosse online ha permesso di risparmiare molto tempo. Molto apprezzato. Inoltre, il fatto che l'istruttore conoscesse sia C# che C++ è stato un grande aiuto, poiché poteva spiegare tutto partendo dalle conoscenze che già possedevamo.
Gabor - Rheinmetall Electronics Hungary Kft
Corso - Advanced C++
Traduzione automatica